Skip to content

Update Snapshots

Update Snapshots #109

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.`,
});