Aggregate Test Status #56170
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: Aggregate Test Status | |
| on: | |
| status: | |
| permissions: | |
| statuses: write | |
| jobs: | |
| aggregate: | |
| if: >- | |
| github.event.context == 'direct-test-completed' | |
| && github.event.state == 'success' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check and update aggregate status | |
| uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 | |
| with: | |
| script: | | |
| const sha = context.payload.sha; | |
| const { data } = await github.rest.repos.getCombinedStatusForRef({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| ref: sha, | |
| per_page: 100, | |
| }); | |
| // Buildkite derives the GitHub context prefix from the label emoji. | |
| // Keep hard Full Suite lanes in test-tube/bar-chart namespaces and | |
| // Fastcheck lanes in microscope so targeted reruns cannot clear the | |
| // wrong aggregate status. Automatic PR jobs use pr-fastcheck while | |
| // slash-command and Full Suite jobs use ci; normalize the suffix | |
| // and keep the newest status for each logical lane. | |
| const FASTCHECK_PREFIXES = [ | |
| 'buildkite/pr-fastcheck/microscope-', | |
| 'buildkite/ci/microscope-', | |
| ]; | |
| const FULL_SUITE_PREFIXES = [ | |
| 'buildkite/ci/test-tube-', | |
| 'buildkite/ci/bar-chart-', | |
| ]; | |
| function newestByLane(prefixes) { | |
| const statuses = new Map(); | |
| for (const status of data.statuses) { | |
| const prefix = prefixes.find(p => status.context.startsWith(p)); | |
| if (!prefix) continue; | |
| const lane = status.context.slice(prefix.length); | |
| const previous = statuses.get(lane); | |
| if (!previous || Date.parse(status.updated_at) > Date.parse(previous.updated_at)) { | |
| statuses.set(lane, status); | |
| } | |
| } | |
| return statuses; | |
| } | |
| const fastcheck = newestByLane(FASTCHECK_PREFIXES); | |
| const fullSuiteOnly = newestByLane(FULL_SUITE_PREFIXES); | |
| const fastcheckPassed = | |
| fastcheck.size === 6 | |
| && [...fastcheck.values()].every(s => s.state === 'success'); | |
| const fullSuitePassed = | |
| fastcheckPassed | |
| && fullSuiteOnly.size === 14 | |
| && [...fullSuiteOnly.values()].every(s => s.state === 'success'); | |
| if (fastcheckPassed) { | |
| core.info( | |
| `All ${fastcheck.size} fastcheck tests passed — updating fastcheck-passed` | |
| ); | |
| await github.rest.repos.createCommitStatus({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| sha, | |
| state: 'success', | |
| context: 'fastcheck-passed', | |
| description: `All ${fastcheck.size} fastcheck tests passed`, | |
| }); | |
| } | |
| if (fullSuitePassed) { | |
| core.info( | |
| 'All 20 full suite tests passed — updating full-suite-passed' | |
| ); | |
| await github.rest.repos.createCommitStatus({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| sha, | |
| state: 'success', | |
| context: 'full-suite-passed', | |
| description: 'All 20 full suite tests passed', | |
| }); | |
| } |