Skip to content

Merge pull request #131 from hyperledger/fix_node_controller #264

Merge pull request #131 from hyperledger/fix_node_controller

Merge pull request #131 from hyperledger/fix_node_controller #264

Workflow file for this run

name: Building All Containers
on:
push:
branches: [ 'main' ]
tags:
- 'v*'
pull_request:
branches: [ 'main' ]
workflow_dispatch:
jobs:
workflow_setup:
name: Setup variables
runs-on: ubuntu-latest
permissions:
pull-requests: read
outputs:
repo_owner: ${{ steps.repo_owner.outputs.lowercase }}
os_matrix: "{\"os_version\":[\"debian10\",\"debian11\",\"ubuntu16\",\"ubuntu18\",\"ubuntu20\"]}"
testsNeeded: ${{ steps.testsNeeded.outputs.testsNeeded }}
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Lowercase repo owner
id: repo_owner
run: echo "lowercase=$(echo ${{ github.repository_owner }} | tr \"[:upper:]\" \"[:lower:]\")" >>$GITHUB_OUTPUT
shell: bash
- name: testsNeeded
id: testsNeeded
uses: dorny/paths-filter@v2
with:
filters: |
testsNeeded:
- '!**.md'
build_nodes:
name: Build node images
runs-on: ubuntu-latest
needs: workflow_setup
if: ${{ needs.workflow_setup.outputs.testsNeeded == 'true' }}
strategy:
matrix: ${{ fromJson(needs.workflow_setup.outputs.os_matrix) }}
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ matrix.os_version }}-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-${{ matrix.os_version }}
${{ runner.os }}-buildx
- name: Build node image based on ${{ matrix.os_version }}
uses: docker/build-push-action@v3
with:
file: build/Dockerfile.${{ matrix.os_version }}
context: ./build
push: false
tags: indy_node:${{ matrix.os_version}}
outputs: type=docker,dest=/tmp/indy_node_${{ matrix.os_version }}.tar
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Upload docker image artifacts
uses: actions/upload-artifact@v3
with:
name: indy_node_${{ matrix.os_version }}
path: /tmp/indy_node_${{ matrix.os_version }}.tar
retention-days: 1
# Temp fix
# https://github.com/docker/build-push-action/blob/master/docs/advanced/cache.md#github-cache
# https://github.com/docker/build-push-action/issues/252
# https://github.com/moby/buildkit/issues/1896
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
build_controller:
name: Build controller image
runs-on: ubuntu-latest
needs: workflow_setup
if: ${{ needs.workflow_setup.outputs.testsNeeded == 'true' }}
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-controler
restore-keys: |
${{ runner.os }}-buildx-controller
${{ runner.os }}-buildx
- name: Build node controller image
uses: docker/build-push-action@v3
with:
context: ./controller
push: false
tags: indy_node_controller
outputs: type=docker,dest=/tmp/indy_node_controller.tar
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Upload docker image artifacts
uses: actions/upload-artifact@v3
with:
name: indy_node_controller
path: /tmp/indy_node_controller.tar
retention-days: 1
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
test_node_and_controller:
runs-on: ubuntu-latest
needs: [workflow_setup, build_controller, build_nodes]
if: ${{ needs.workflow_setup.outputs.testsNeeded == 'true' }}
strategy:
matrix: ${{ fromJson(needs.workflow_setup.outputs.os_matrix) }}
fail-fast: false
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
with:
driver-opts: network=host
- name: Download node artifact
uses: actions/download-artifact@v3
with:
name: indy_node_${{ matrix.os_version }}
path: /tmp
- name: Download controller artifact
uses: actions/download-artifact@v3
with:
name: indy_node_controller
path: /tmp
- name: Load node and controller image
run: |
docker load --input /tmp/indy_node_${{ matrix.os_version }}.tar
docker load --input /tmp/indy_node_controller.tar
- name: Setup test network configs
run: cd test && ./init-test-network.sh indy_node:${{ matrix.os_version }}
- name: Start test network
run: cd test && env SOCK=/var/run/docker.sock IMAGE_NAME_NODE=indy_node:${{ matrix.os_version }} IMAGE_NAME_CONTROLLER=indy_node_controller docker-compose up -d
- name: Get Ledger State
id: ledger
run: |
echo "Waiting 30 seconds for the ledger browser to start..."
sleep 30
cd test
echo "::group::ParseValidatorOutput"
./parse_validator_info.sh
echo "::endgroup::"
- name: Safe ledger_state.json for later inspection
uses: actions/upload-artifact@v3
with:
name: ${{ matrix.os_version }}-tmp-test-${{ github.sha }}-ledger_state.json
path: ledger_state.json
retention-days: 7
- name: Fail if ledger is not in sync
if: |
steps.ledger.outputs.n1_synced != 'true' ||
steps.ledger.outputs.n2_synced != 'true' ||
steps.ledger.outputs.n3_synced != 'true' ||
steps.ledger.outputs.n4_synced != 'true' ||
steps.ledger.outputs.n1_freshness != 'true' ||
steps.ledger.outputs.n2_freshness != 'true' ||
steps.ledger.outputs.n3_freshness != 'true' ||
steps.ledger.outputs.n4_freshness != 'true' ||
steps.ledger.outputs.n1_unreachable != 0 ||
steps.ledger.outputs.n2_unreachable != 0 ||
steps.ledger.outputs.n3_unreachable != 0 ||
steps.ledger.outputs.n4_unreachable != 0
uses: actions/github-script@v3
with:
script: core.setFailed('${{ matrix.os_version }} - Not all nodes are in sync!')
- name: Send node restart command
id: node-restart
run: |
echo "::set-output name=restart-time::$(date +%s)"
cd test && echo -e "indy-cli\npool create test gen_txn_file=/pool_transactions_genesis\npool connect test\nwallet create wallet key=1234\nwallet open wallet key=1234\ndid new seed=000000000000000000000000Trustee1\ndid use V4SGRU86Z58d6TV7PBUe6f\nledger pool-restart action=start" | docker-compose run indy-cli
- name: Get node restart status
id: nodes_restarted
run: |
sleep 60
OUTPUT="$(docker container ls --filter "name=node" --format="{{.Names}}" | xargs -n1 docker container inspect --format="{{.State.StartedAt}}" | xargs -I {} date -d {} +%s)"
echo "::set-output name=count::$(echo "$OUTPUT" | awk -F= '$1>${{ steps.node-restart.outputs.restart-time }}' | wc -l)"
- name: Fail if not all nodes restarted
if: steps.nodes_restarted.outputs.count != 4
uses: actions/github-script@v3
with:
script: core.setFailed('${{ matrix.os_version }} - Not all nodes have been restarted')
statusCheck:
name: statusCheck
runs-on: ubuntu-latest
needs: [workflow_setup, test_node_and_controller]
if: ${{ needs.workflow_setup.outputs.testsNeeded == 'false' || success() }}
steps:
- run: 'echo "Just a status Check (Always true, when executed) for branch protection rules(blocks merging while test are running and if tests fail)." '
push_node:
runs-on: ubuntu-latest
needs: [workflow_setup, test_node_and_controller]
if: ${{ github.event_name != 'pull_request' }}
strategy:
matrix: ${{ fromJson(needs.workflow_setup.outputs.os_matrix) }}
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: indy-node-version
id: indy-node-version
shell: bash
run: |
export nodeVersion=$(sed "s/~/-/" <<<$(grep -oP "indy-node=\"?\d+.\d+.\d+((~|.)?rc\d+)?\"?" build/Dockerfile.${{ matrix.os_version }} | grep -oP "\d+.\d+.\d+((~|.|-)?rc\d+)?"))
echo "::debug::IndyNode Version is ${nodeVersion}"
echo "::group::DEBUG"
echo "IndyNode Version is ${nodeVersion}"
echo "::endgroup::"
echo "nodeVersion=${nodeVersion}">> $GITHUB_OUTPUT
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ matrix.os_version }}-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-${{ matrix.os_version }}
${{ runner.os }}-buildx
- name: Log in to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Meta for indy_node
id: meta_indy_node
uses: docker/metadata-action@v4
with:
images: ghcr.io/${{ needs.workflow_setup.outputs.repo_owner }}/indy-node-container/indy_node
flavor: |
prefix=${{ steps.indy-node-version.outputs.nodeVersion }}-${{ matrix.os_version }}-
latest=auto
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
labels: |
org.opencontainers.image.title=Indy Node Container
org.opencontainers.image.description=Indy Node Container based on ${{ matrix.os_version }}
org.opencontainers.image.vendor=Hyperledger
- name: Push indy node based on ${{ matrix.os_version }}
uses: docker/build-push-action@v3
with:
file: build/Dockerfile.${{ matrix.os_version }}
context: ./build
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta_indy_node.outputs.tags }}
labels: ${{ steps.meta_indy_node.outputs.labels }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
push_controller:
runs-on: ubuntu-latest
needs: [workflow_setup, test_node_and_controller]
if: ${{ github.event_name != 'pull_request' }}
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-controler
restore-keys: |
${{ runner.os }}-buildx-controller
${{ runner.os }}-buildx
- name: Log in to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Meta for indy_node_controller
id: meta_indy_node_controller
uses: docker/metadata-action@v4
with:
images: ghcr.io/${{ needs.workflow_setup.outputs.repo_owner }}/indy-node-container/indy_node_controller
flavor: |
onlatest=true
latest=auto
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
labels: |
org.opencontainers.image.title=Indy Node Container Controller
org.opencontainers.image.description=Indy Node Container Controller
org.opencontainers.image.vendor=Hyperledger
- name: Push indy node controller
uses: docker/build-push-action@v3
with:
context: ./controller
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta_indy_node_controller.outputs.tags }}
labels: ${{ steps.meta_indy_node_controller.outputs.labels }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache