Update Snapshots #109
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Update Snapshots | |
| on: | |
| workflow_dispatch: | |
| permissions: | |
| contents: write # required for push commit | |
| pull-requests: write # required for create pr | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| jobs: | |
| update: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 240 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| network: | |
| - name: "polkadot" | |
| chains: | |
| - { chain: "polkadot", port: 9000, endpoint_var: "POLKADOT_ENDPOINT" } | |
| - { chain: "assetHubPolkadot", port: 9001, endpoint_var: "ASSETHUBPOLKADOT_ENDPOINT" } | |
| - { chain: "bridgeHubPolkadot", port: 9002, endpoint_var: "BRIDGEHUBPOLKADOT_ENDPOINT" } | |
| - { chain: "collectivesPolkadot", port: 9003, endpoint_var: "COLLECTIVESPOLKADOT_ENDPOINT" } | |
| - { chain: "coretimePolkadot", port: 9004, endpoint_var: "CORETIMEPOLKADOT_ENDPOINT" } | |
| - { chain: "peoplePolkadot", port: 9005, endpoint_var: "PEOPLEPOLKADOT_ENDPOINT" } | |
| - name: "kusama" | |
| chains: | |
| - { chain: "kusama", port: 9010, endpoint_var: "KUSAMA_ENDPOINT" } | |
| - { chain: "assetHubKusama", port: 9011, endpoint_var: "ASSETHUBKUSAMA_ENDPOINT" } | |
| - { chain: "bridgeHubKusama", port: 9012, endpoint_var: "BRIDGEHUBKUSAMA_ENDPOINT" } | |
| - { chain: "coretimeKusama", port: 9013, endpoint_var: "CORETIMEKUSAMA_ENDPOINT" } | |
| - { chain: "peopleKusama", port: 9014, endpoint_var: "PEOPLEKUSAMA_ENDPOINT" } | |
| - { chain: "encointerKusama", port: 9015, endpoint_var: "ENCOINTERKUSAMA_ENDPOINT" } | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Use Node.js | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: 22.x | |
| cache: 'yarn' | |
| - run: yarn --immutable | |
| - name: Install Rust toolchain | |
| uses: dtolnay/rust-toolchain@stable | |
| - name: Get Subway commit hash | |
| id: subway-commit | |
| run: echo "hash=$(git ls-remote https://github.com/AcalaNetwork/subway HEAD | cut -f1)" >> $GITHUB_OUTPUT | |
| - name: Cache Subway binary | |
| uses: Swatinem/rust-cache@v2 | |
| with: | |
| shared-key: subway-binary-${{ steps.subway-commit.outputs.hash }} | |
| save-if: ${{ github.ref == 'refs/heads/master' }} | |
| - name: Install Subway | |
| run: cargo install --git https://github.com/AcalaNetwork/subway | |
| - name: Update known good block numbers | |
| run: yarn update-known-good | |
| - name: Source known good block numbers | |
| run: | | |
| NETWORK_UPPER=$(echo "${{ matrix.network.name }}" | tr '[:lower:]' '[:upper:]') | |
| ENV_FILE="KNOWN_GOOD_BLOCK_NUMBERS_${NETWORK_UPPER}.env" | |
| echo "Sourcing block numbers from $ENV_FILE" | |
| cat "$ENV_FILE" >> $GITHUB_ENV | |
| - name: Start all Subway instances | |
| run: | | |
| echo "Starting all Subway instances for ${{ matrix.network.name }}..." | |
| echo '${{ toJSON(matrix.network.chains) }}' | jq -c '.[]' | while read chain; do | |
| CHAIN=$(echo $chain | jq -r '.chain') | |
| PORT=$(echo $chain | jq -r '.port') | |
| # Get endpoints from pet-chain-endpoints.json | |
| ENDPOINTS=$(jq -c ".$CHAIN" packages/networks/src/pet-chain-endpoints.json) | |
| if [ "$ENDPOINTS" = "null" ] || [ -z "$ENDPOINTS" ]; then | |
| echo "Error: No endpoints found for chain $CHAIN" | |
| exit 1 | |
| fi | |
| echo "Starting Subway for $CHAIN on port $PORT..." | |
| sed -e "s/{{PORT}}/$PORT/g" -e "s|{{ENDPOINTS}}|$ENDPOINTS|g" .github/subway-template.yml > /tmp/subway-$PORT.yml | |
| subway --config /tmp/subway-$PORT.yml > /tmp/subway-$PORT.log 2>&1 & | |
| echo $! >> /tmp/subway.pids | |
| done | |
| echo "Waiting for all Subway instances to start..." | |
| echo '${{ toJSON(matrix.network.chains) }}' | jq -c '.[]' | while read chain; do | |
| PORT=$(echo $chain | jq -r '.port') | |
| timeout=60 | |
| elapsed=0 | |
| while [ $elapsed -lt $timeout ]; do | |
| if curl -sf http://127.0.0.1:$PORT/health > /dev/null 2>&1; then | |
| echo "Subway on port $PORT started successfully!" | |
| break | |
| fi | |
| sleep 1 | |
| elapsed=$((elapsed + 1)) | |
| done | |
| if [ $elapsed -ge $timeout ]; then | |
| echo "Timeout waiting for subway on port $PORT" | |
| cat /tmp/subway-$PORT.log | |
| exit 1 | |
| fi | |
| done | |
| echo "All Subway instances started successfully!" | |
| - name: Set endpoint environment variables | |
| run: | | |
| echo '${{ toJSON(matrix.network.chains) }}' | jq -c '.[]' | while read chain; do | |
| ENDPOINT_VAR=$(echo $chain | jq -r '.endpoint_var') | |
| PORT=$(echo $chain | jq -r '.port') | |
| echo "${ENDPOINT_VAR}=ws://localhost:${PORT}" >> $GITHUB_ENV | |
| done | |
| - name: Run Tests | |
| run: yarn test:${{ matrix.network.name }} -u --pool=threads --maxWorkers=2 --retry=3 | |
| - name: Cleanup Subway instances | |
| if: always() | |
| run: | | |
| if [ -f /tmp/subway.pids ]; then | |
| cat /tmp/subway.pids | xargs kill || true | |
| fi | |
| - name: Commit and Create PR | |
| uses: actions/github-script@v8 | |
| with: | |
| script: | | |
| const { network } = context.payload.inputs || { network: '${{ matrix.network.name }}' }; | |
| const branchName = `update-snapshots-${network}-${context.sha.slice(0, 7)}`; | |
| const upperNetwork = network.toUpperCase(); | |
| await exec.exec(`git config --global user.name 'github-actions[bot]'`); | |
| await exec.exec(`git config --global user.email '41898282+github-actions[bot]@users.noreply.github.com'`); | |
| const { stdout: status } = await exec.getExecOutput('git', ['status', '--porcelain']); | |
| if (!status) { | |
| console.log('No changes to commit.'); | |
| return; | |
| } | |
| await exec.exec(`git checkout -b ${branchName}`); | |
| await exec.exec('git', ['add', '-A', `packages/${network}`]); | |
| await exec.exec('git', ['add', '-A', `KNOWN_GOOD_BLOCK_NUMBERS_${upperNetwork}.env`]); | |
| await exec.exec('git', ['commit', '-m', `Update snapshots for ${network}`]); | |
| await exec.exec(`git push origin HEAD:${branchName}`); | |
| await github.rest.pulls.create({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| title: `Update Snapshots for ${network}`, | |
| head: branchName, | |
| base: 'master', | |
| body: `Update Snapshots for ${network}\n\nClose and reopen this PR to trigger CI.`, | |
| }); |