Skip to content

Update Known Good Block Numbers #725

Update Known Good Block Numbers

Update Known Good Block Numbers #725

name: Update Known Good Block Numbers
on:
workflow_dispatch:
inputs:
retry:
description: 'If this is a retry run'
required: false
type: boolean
failed_tests:
description: 'Failed tests to retry (JSON array)'
required: false
type: string
schedule:
- cron: '0 */6 * * *'
env:
GH_TOKEN: ${{ github.token }}
permissions:
contents: write
pull-requests: write
actions: write
issues: write
jobs:
define-matrix:
runs-on: ubuntu-latest
outputs:
tests: ${{ steps.tests.outputs.tests }}
steps:
- uses: actions/checkout@v4
- name: setup node env
uses: actions/setup-node@v4
with:
node-version: 18.x
cache: 'yarn'
- run: yarn --immutable
- name: Define Tests
id: tests
run: |
if [ "${{ github.event.inputs.retry }}" == "true" ]; then
echo "tests=$(echo '${{ github.event.inputs.failed_tests }}' | sed 's/^"\(.*\)"$/\1/')" >> "$GITHUB_OUTPUT"
else
echo tests=$(cd packages && ls */src/*.test.ts | jq -R -s -c 'split("\n")[:-1]') >> "$GITHUB_OUTPUT"
fi
- name: Update Known Good Block Numbers
run: |
yarn update-known-good
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: KNOWN_GOOD_BLOCK_NUMBERS.env
path: KNOWN_GOOD_BLOCK_NUMBERS.env
retention-days: 1
tests:
needs: define-matrix
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
tests: ${{ fromJSON(needs.define-matrix.outputs.tests) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: setup node env
uses: actions/setup-node@v4
with:
node-version: 18.x
cache: 'yarn'
- run: yarn --immutable
- name: Download a single artifact
uses: actions/download-artifact@v4
with:
name: KNOWN_GOOD_BLOCK_NUMBERS.env
- run: yarn test packages/${{ matrix.tests }}
save:
needs: tests
runs-on: ubuntu-latest
if: success() && github.event.inputs.retry != 'true'
steps:
- uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ secrets.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
- uses: actions/checkout@v4
with:
token: ${{ steps.app-token.outputs.token }}
- name: Download a single artifact
uses: actions/download-artifact@v4
with:
name: KNOWN_GOOD_BLOCK_NUMBERS.env
- name: Commit and push changes
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email '41898282+github-actions[bot]@users.noreply.github.com'
git add KNOWN_GOOD_BLOCK_NUMBERS.env
if ! git diff --cached --quiet; then
git commit -m "[ci skip] Update KNOWN_GOOD_BLOCK_NUMBERS"
git push
else
echo "No changes to commit"
fi
schedule-retry:
needs: tests
if: failure() && github.event.inputs.retry != 'true'
runs-on: ubuntu-latest
steps:
- name: Get failed jobs
id: get-failed
uses: actions/github-script@v7
with:
script: |
const response = await github.rest.actions.listJobsForWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.runId
});
const failedTests = response.data.jobs
.filter(job => job.name.startsWith('tests (') && job.conclusion === 'failure')
.map(job => {
const match = job.name.match(/tests \((.*)\)/);
return match ? match[1] : null;
})
.filter(Boolean);
return JSON.stringify(failedTests);
- name: sleep
run: sleep 300
- name: Dispatch retry workflow
uses: actions/github-script@v7
with:
script: |
await github.rest.actions.createWorkflowDispatch({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: 'update-known-good.yml',
ref: 'master',
inputs: {
retry: 'true',
failed_tests: '${{ steps.get-failed.outputs.result }}'
}
})
notify:
needs: tests
if: failure() && github.event.inputs.retry == 'true'
runs-on: ubuntu-latest
steps:
- name: Create Comment
uses: actions/github-script@v7
with:
script: |
const response = await github.rest.actions.listJobsForWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.runId
});
const failedTests = response.data.jobs
.filter(job => job.name.startsWith('tests (') && job.conclusion === 'failure')
.map(job => {
const match = job.name.match(/tests \((.*)\)/);
return match ? match[1] : null;
})
.filter(Boolean);
const impactedNetworks = new Set()
const regex = /(\w+)\.(\w+)?(\.\w+)?\.test/
for (const test of failedTests) {
const match = test.match(regex)
if (match) {
impactedNetworks.add(match[1])
if (match[2]) {
impactedNetworks.add(match[2])
}
} else {
impactedNetworks.add("unknown")
}
}
const { data: config } = await github.rest.repos.getContent({
owner: context.repo.owner,
repo: context.repo.repo,
path: '.github/workflows/notifications.json',
ref: 'master'
})
const notifications = JSON.parse(Buffer.from(config.content, 'base64').toString('utf8'))
for (const network of impactedNetworks) {
const issueNumber = notifications[network]
if (issueNumber) {
// add a comment to the issue
await github.rest.issues.createComment({
issue_number: issueNumber,
owner: context.repo.owner,
repo: context.repo.repo,
body: `Workflow failed: https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`
})
}
}