From 33d08abdf930fabb94ca8fe2bce9efd7a02ec957 Mon Sep 17 00:00:00 2001 From: rochdev Date: Sun, 15 Feb 2026 20:19:18 -0500 Subject: [PATCH 01/20] switch all-green to custom script with less api calls --- .github/workflows/all-green.yml | 22 ++++++--- scripts/all-green.mjs | 84 +++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 scripts/all-green.mjs diff --git a/.github/workflows/all-green.yml b/.github/workflows/all-green.yml index c13f45fe421..21aa695b9ef 100644 --- a/.github/workflows/all-green.yml +++ b/.github/workflows/all-green.yml @@ -18,14 +18,22 @@ jobs: checks: read contents: read steps: - - uses: wechuli/allcheckspassed@1d00cf0c34c4b0805db8866d8913f22e7125301e # v2.3.0 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: - delay: ${{ github.run_attempt == 1 && '7' || '0' }} # 7 minutes on first attempt, no delay on reruns - retries: 15 - polling_interval: 2 # Once every 2 minutes - checks_exclude: devflow.* - fail_fast: false - verbose: true # What checks are still waited for? + sparse-checkout-cone-mode: false + sparse-checkout: | + .github + scripts + - uses: ./.github/actions/node + with: + version: active + - run: yarn add octokit + - run: node scripts/all-green.mjs + env: + DELAY: 5 + GITHUB_TOKEN: ${{ github.token }} + POLLING_INTERVAL: 1 + RETRIES: 30 - name: Require vendor validation when vendor/ changes if: github.event_name == 'pull_request' env: diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs new file mode 100644 index 00000000000..9284dcfa423 --- /dev/null +++ b/scripts/all-green.mjs @@ -0,0 +1,84 @@ +import { setTimeout } from 'timers/promises' +import { Octokit } from 'octokit' + +/* eslint-disable no-console */ + +const { + DELAY, + GITHUB_SHA, + GITHUB_TOKEN, + POLLING_INTERVAL, + RETRIES, +} = process.env + +const octokit = new Octokit({ auth: GITHUB_TOKEN }) + +let retries = 0 + +async function getStatus () { + const response = await octokit.graphql(` + query ($owner: String!, $name: String!, $oid: GitObjectID!) { + repository(owner: $owner, name: $name) { + object(oid: $oid) { + ... on Commit { + statusCheckRollup { + # Overall state: SUCCESS, FAILURE, PENDING, or ERROR + state + contexts(first: 100) { + nodes { + ... on CheckRun { + name + status + conclusion + url + } + ... on StatusContext { + context + state + targetUrl + } + } + } + } + } + } + } + } + `, { + owner: 'DataDog', + name: 'dd-trace-js', + oid: GITHUB_SHA, + }) + + return response +} + +async function checkStatus () { + const status = await getStatus() + const state = status.repository.object.statusCheckRollup.state + + if (RETRIES && retries > RETRIES) { + throw new Error(`State is still pending after ${RETRIES} retries.`) + } + + if (state === 'PENDING') { + console.log(`State is still pending, waiting for ${POLLING_INTERVAL} minutes before retrying.`) + await setTimeout(POLLING_INTERVAL * 60_000) + console.log('Retrying.') + retries++ + return checkStatus() + } + + if (state === 'FAILURE' || state === 'ERROR') { + console.log('One or more jobs failed.') + } else { + console.log('All jobs were succesful.') + } +} + +if (DELAY) { + console.log(`Waiting for ${DELAY} minutes before starting.`) + setTimeout(DELAY * 60_000) +} + +checkStatus() From 57fb0c494ff58aae369ed6e691eefaa1b2cc1d5f Mon Sep 17 00:00:00 2001 From: rochdev Date: Sun, 15 Feb 2026 20:39:44 -0500 Subject: [PATCH 02/20] fix timeout and ordering --- scripts/all-green.mjs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index 9284dcfa423..fb972d79eff 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -54,13 +54,15 @@ async function getStatus () { } async function checkStatus () { - const status = await getStatus() - const state = status.repository.object.statusCheckRollup.state - if (RETRIES && retries > RETRIES) { throw new Error(`State is still pending after ${RETRIES} retries.`) } + const status = await getStatus() + const state = status.repository.object.statusCheckRollup.state + + console.log(status) + if (state === 'PENDING') { console.log(`State is still pending, waiting for ${POLLING_INTERVAL} minutes before retrying.`) await setTimeout(POLLING_INTERVAL * 60_000) @@ -78,7 +80,7 @@ async function checkStatus () { if (DELAY) { console.log(`Waiting for ${DELAY} minutes before starting.`) - setTimeout(DELAY * 60_000) + await setTimeout(DELAY * 60_000) } -checkStatus() +await checkStatus() From e88e9ca91b0623c0320b944ad644626fb930e645 Mon Sep 17 00:00:00 2001 From: rochdev Date: Sun, 15 Feb 2026 20:44:25 -0500 Subject: [PATCH 03/20] reduce retries --- .github/workflows/all-green.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/all-green.yml b/.github/workflows/all-green.yml index 21aa695b9ef..d7daeeb3386 100644 --- a/.github/workflows/all-green.yml +++ b/.github/workflows/all-green.yml @@ -33,7 +33,7 @@ jobs: DELAY: 5 GITHUB_TOKEN: ${{ github.token }} POLLING_INTERVAL: 1 - RETRIES: 30 + RETRIES: 15 - name: Require vendor validation when vendor/ changes if: github.event_name == 'pull_request' env: From fd69ec0090ae2f246a0b41c8b3898de2a5374fb8 Mon Sep 17 00:00:00 2001 From: rochdev Date: Sun, 15 Feb 2026 20:45:47 -0500 Subject: [PATCH 04/20] debug --- scripts/all-green.mjs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index fb972d79eff..3bda961b348 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -59,9 +59,8 @@ async function checkStatus () { } const status = await getStatus() - const state = status.repository.object.statusCheckRollup.state - console.log(status) + const state = status.repository.object.statusCheckRollup.state if (state === 'PENDING') { console.log(`State is still pending, waiting for ${POLLING_INTERVAL} minutes before retrying.`) @@ -80,7 +79,7 @@ async function checkStatus () { if (DELAY) { console.log(`Waiting for ${DELAY} minutes before starting.`) - await setTimeout(DELAY * 60_000) + // await setTimeout(DELAY * 60_000) } await checkStatus() From ba377b140ce5505c13875efaaad6abb6456825e3 Mon Sep 17 00:00:00 2001 From: rochdev Date: Sun, 15 Feb 2026 21:10:53 -0500 Subject: [PATCH 05/20] add support for PRs --- scripts/all-green.mjs | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index 3bda961b348..2d5005dfed3 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -21,21 +21,16 @@ async function getStatus () { repository(owner: $owner, name: $name) { object(oid: $oid) { ... on Commit { - statusCheckRollup { - # Overall state: SUCCESS, FAILURE, PENDING, or ERROR - state - contexts(first: 100) { - nodes { - ... on CheckRun { - name - status - conclusion - url - } - ... on StatusContext { - context - state - targetUrl + # 1. Direct Commit Rollup (Push/Schedule) + statusCheckRollup { state } + # 2. PR-specific Rollup (Pull Request) + associatedPullRequests(first: 1) { + nodes { + commits(last: 1) { + nodes { + commit { + statusCheckRollup { state } + } } } } @@ -59,8 +54,10 @@ async function checkStatus () { } const status = await getStatus() - console.log(status) - const state = status.repository.object.statusCheckRollup.state + const { associatedPullRequests, statusCheckRollup } = status.repository.object + const prState = associatedPullRequests?.nodes[0]?.commits.nodes[0]?.commit.statusCheckRollup?.state + const commitState = statusCheckRollup?.state + const state = commitState || prState if (state === 'PENDING') { console.log(`State is still pending, waiting for ${POLLING_INTERVAL} minutes before retrying.`) From c608d2ec18e5ddbe564959f478eaf78ce16906a5 Mon Sep 17 00:00:00 2001 From: rochdev Date: Sun, 15 Feb 2026 21:14:33 -0500 Subject: [PATCH 06/20] debug --- scripts/all-green.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index 2d5005dfed3..e4c566041ea 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -59,6 +59,8 @@ async function checkStatus () { const commitState = statusCheckRollup?.state const state = commitState || prState + console.log(prState, commitState) + if (state === 'PENDING') { console.log(`State is still pending, waiting for ${POLLING_INTERVAL} minutes before retrying.`) await setTimeout(POLLING_INTERVAL * 60_000) From c038ca0547024164aed6caa5afcfe6d1aba07d77 Mon Sep 17 00:00:00 2001 From: rochdev Date: Sun, 15 Feb 2026 21:22:44 -0500 Subject: [PATCH 07/20] debug --- scripts/all-green.mjs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index e4c566041ea..987e49300eb 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -26,9 +26,9 @@ async function getStatus () { # 2. PR-specific Rollup (Pull Request) associatedPullRequests(first: 1) { nodes { - commits(last: 1) { - nodes { - commit { + headRef { + target { + ... on Commit { statusCheckRollup { state } } } @@ -55,7 +55,7 @@ async function checkStatus () { const status = await getStatus() const { associatedPullRequests, statusCheckRollup } = status.repository.object - const prState = associatedPullRequests?.nodes[0]?.commits.nodes[0]?.commit.statusCheckRollup?.state + const prState = associatedPullRequests?.nodes[0]?.headRef?.target?.statusCheckRollup?.state const commitState = statusCheckRollup?.state const state = commitState || prState From 398c14c7b4f17f23f329fe6eaebf334ffbac1ee6 Mon Sep 17 00:00:00 2001 From: rochdev Date: Sun, 15 Feb 2026 21:26:34 -0500 Subject: [PATCH 08/20] debug --- scripts/all-green.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index 987e49300eb..7e58008ac78 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -59,7 +59,7 @@ async function checkStatus () { const commitState = statusCheckRollup?.state const state = commitState || prState - console.log(prState, commitState) + console.log(associatedPullRequests) if (state === 'PENDING') { console.log(`State is still pending, waiting for ${POLLING_INTERVAL} minutes before retrying.`) From 60bc246d8becce9c982ae0feca40d6fb41b384d5 Mon Sep 17 00:00:00 2001 From: rochdev Date: Sun, 15 Feb 2026 21:28:37 -0500 Subject: [PATCH 09/20] debug --- scripts/all-green.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index 7e58008ac78..0117c560eb7 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -59,6 +59,7 @@ async function checkStatus () { const commitState = statusCheckRollup?.state const state = commitState || prState + console.log(GITHUB_SHA) console.log(associatedPullRequests) if (state === 'PENDING') { From a1a94a03ef7ef3624b147c6698f49e02d222ddd2 Mon Sep 17 00:00:00 2001 From: rochdev Date: Mon, 16 Feb 2026 12:41:17 -0500 Subject: [PATCH 10/20] fix pr support --- .github/workflows/all-green.yml | 1 + scripts/all-green.mjs | 78 +++++++++++++++++++-------------- 2 files changed, 46 insertions(+), 33 deletions(-) diff --git a/.github/workflows/all-green.yml b/.github/workflows/all-green.yml index d7daeeb3386..cb55b921cdc 100644 --- a/.github/workflows/all-green.yml +++ b/.github/workflows/all-green.yml @@ -31,6 +31,7 @@ jobs: - run: node scripts/all-green.mjs env: DELAY: 5 + GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }} GITHUB_TOKEN: ${{ github.token }} POLLING_INTERVAL: 1 RETRIES: 15 diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index 0117c560eb7..aa8fb928432 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -5,6 +5,7 @@ import { Octokit } from 'octokit' const { DELAY, + GITHUB_PR_NUMBER, GITHUB_SHA, GITHUB_TOKEN, POLLING_INTERVAL, @@ -16,36 +17,52 @@ const octokit = new Octokit({ auth: GITHUB_TOKEN }) let retries = 0 async function getStatus () { - const response = await octokit.graphql(` - query ($owner: String!, $name: String!, $oid: GitObjectID!) { - repository(owner: $owner, name: $name) { - object(oid: $oid) { - ... on Commit { - # 1. Direct Commit Rollup (Push/Schedule) - statusCheckRollup { state } - # 2. PR-specific Rollup (Pull Request) - associatedPullRequests(first: 1) { + const owner = 'DataDog' + const name = 'dd-trace-js' + + if (GITHUB_PR_NUMBER) { // For `pull_request` trigger. + const response = await octokit.graphql(` + query ($owner: String!, $name: String!, $number: Int!) { + repository(owner: $owner, name: $name) { + pullRequest(number: $number) { + commits(last: 1) { nodes { - headRef { - target { - ... on Commit { - statusCheckRollup { state } - } - } + commit { + statusCheckRollup { state } } } } } } } - } - `, { - owner: 'DataDog', - name: 'dd-trace-js', - oid: GITHUB_SHA, - }) + `, { + owner, + name, + number: Number(GITHUB_PR_NUMBER), + }) - return response + return response.repository.pullRequest.commits.nodes[0].commit.statusCheckRollup.state + } else if (GITHUB_SHA) { // For `push` and `schedule` triggers. + const response = await octokit.graphql(` + query ($owner: String!, $name: String!, $oid: GitObjectID!) { + repository(owner: $owner, name: $name) { + object(oid: $oid) { + ... on Commit { + statusCheckRollup { state } + } + } + } + } + `, { + owner, + name, + oid: GITHUB_SHA, + }) + + return response.repository.object.statusCheckRollup.state + } + + throw new Error('Please provide at least one of GITHUB_PR_NUMBER or GITHUB_SHA.') } async function checkStatus () { @@ -54,23 +71,18 @@ async function checkStatus () { } const status = await getStatus() - const { associatedPullRequests, statusCheckRollup } = status.repository.object - const prState = associatedPullRequests?.nodes[0]?.headRef?.target?.statusCheckRollup?.state - const commitState = statusCheckRollup?.state - const state = commitState || prState - - console.log(GITHUB_SHA) - console.log(associatedPullRequests) - if (state === 'PENDING') { - console.log(`State is still pending, waiting for ${POLLING_INTERVAL} minutes before retrying.`) + if (status === 'PENDING') { + console.log(`Status is still pending, waiting for ${POLLING_INTERVAL} minutes before retrying.`) await setTimeout(POLLING_INTERVAL * 60_000) console.log('Retrying.') retries++ return checkStatus() } - if (state === 'FAILURE' || state === 'ERROR') { + // Since `statusCheckRollup` is used in both queries, this will happen as soon + // as any job fails. This is intended as it will prevent further API calls. + if (status === 'FAILURE' || status === 'ERROR') { console.log('One or more jobs failed.') } else { console.log('All jobs were succesful.') @@ -79,7 +91,7 @@ async function checkStatus () { if (DELAY) { console.log(`Waiting for ${DELAY} minutes before starting.`) - // await setTimeout(DELAY * 60_000) + await setTimeout(DELAY * 60_000) } await checkStatus() From 795d2856283065a1f7167586be8198a992497af8 Mon Sep 17 00:00:00 2001 From: rochdev Date: Mon, 16 Feb 2026 15:17:36 -0500 Subject: [PATCH 11/20] switch to rest api --- .github/workflows/all-green.yml | 2 +- package.json | 1 + scripts/all-green.mjs | 95 ++++++++++++-------------- yarn.lock | 114 +++++++++++++++++--------------- 4 files changed, 103 insertions(+), 109 deletions(-) diff --git a/.github/workflows/all-green.yml b/.github/workflows/all-green.yml index cb55b921cdc..82b9c6c3de9 100644 --- a/.github/workflows/all-green.yml +++ b/.github/workflows/all-green.yml @@ -27,7 +27,7 @@ jobs: - uses: ./.github/actions/node with: version: active - - run: yarn add octokit + - run: yarn add @actions/github octokit - run: node scripts/all-green.mjs env: DELAY: 5 diff --git a/package.json b/package.json index ee6cb1857cb..e2f6cf98f17 100644 --- a/package.json +++ b/package.json @@ -147,6 +147,7 @@ "oxc-parser": "^0.115.0" }, "devDependencies": { + "@actions/github": "^9.0.0", "@babel/helpers": "^7.28.6", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.39.2", diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index aa8fb928432..c9d94b11b67 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -1,11 +1,11 @@ import { setTimeout } from 'timers/promises' import { Octokit } from 'octokit' +import { context } from '@actions/github' /* eslint-disable no-console */ const { DELAY, - GITHUB_PR_NUMBER, GITHUB_SHA, GITHUB_TOKEN, POLLING_INTERVAL, @@ -13,56 +13,45 @@ const { } = process.env const octokit = new Octokit({ auth: GITHUB_TOKEN }) +const owner = 'DataDog' +const repo = 'dd-trace-js' +const ref = context.payload.pull_request?.head.sha || GITHUB_SHA +const params = { owner, repo, ref } let retries = 0 -async function getStatus () { - const owner = 'DataDog' - const name = 'dd-trace-js' - - if (GITHUB_PR_NUMBER) { // For `pull_request` trigger. - const response = await octokit.graphql(` - query ($owner: String!, $name: String!, $number: Int!) { - repository(owner: $owner, name: $name) { - pullRequest(number: $number) { - commits(last: 1) { - nodes { - commit { - statusCheckRollup { state } - } - } - } - } - } - } - `, { - owner, - name, - number: Number(GITHUB_PR_NUMBER), - }) - - return response.repository.pullRequest.commits.nodes[0].commit.statusCheckRollup.state - } else if (GITHUB_SHA) { // For `push` and `schedule` triggers. - const response = await octokit.graphql(` - query ($owner: String!, $name: String!, $oid: GitObjectID!) { - repository(owner: $owner, name: $name) { - object(oid: $oid) { - ... on Commit { - statusCheckRollup { state } - } - } - } - } - `, { - owner, - name, - oid: GITHUB_SHA, - }) - - return response.repository.object.statusCheckRollup.state - } +async function getAllGreen () { + const { data: inProgressRuns } = await octokit.rest.checks.listForRef({ + ...params, + per_page: 1, // Minimum is 1 but we don't need any pages. + status: 'in_progress', + }) + + // If there are any in progress runs it means we're not ready to check + // statuses. We will always have minimum 1 for the All Green job. + if (inProgressRuns.total_count > 1) return + + const { data: queuedRuns } = await octokit.rest.checks.listForRef({ + ...params, + per_page: 1, // Minimum is 1 but we don't need any pages. + status: 'queued', + }) + + // Same as above, but jobs that are queued are not even in progress yet. + if (queuedRuns.total_count > 1) return - throw new Error('Please provide at least one of GITHUB_PR_NUMBER or GITHUB_SHA.') + const completedRuns = await octokit.paginate( + 'GET /repos/:owner/:repo/commits/:ref/check-runs', + { + ...params, + per_page: 100, + status: 'completed', + } + ) + + return completedRuns.some(run => ( + run.conclusion === 'failure' || run.conclusion === 'timed_out' + )) } async function checkStatus () { @@ -70,9 +59,9 @@ async function checkStatus () { throw new Error(`State is still pending after ${RETRIES} retries.`) } - const status = await getStatus() + const allGreen = await getAllGreen() - if (status === 'PENDING') { + if (allGreen === undefined) { console.log(`Status is still pending, waiting for ${POLLING_INTERVAL} minutes before retrying.`) await setTimeout(POLLING_INTERVAL * 60_000) console.log('Retrying.') @@ -80,12 +69,10 @@ async function checkStatus () { return checkStatus() } - // Since `statusCheckRollup` is used in both queries, this will happen as soon - // as any job fails. This is intended as it will prevent further API calls. - if (status === 'FAILURE' || status === 'ERROR') { - console.log('One or more jobs failed.') - } else { + if (allGreen) { console.log('All jobs were succesful.') + } else { + throw new Error('One or more jobs failed.') } } diff --git a/yarn.lock b/yarn.lock index c35fe209c5d..540e49ffcc6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,27 @@ # yarn lockfile v1 +"@actions/github@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@actions/github/-/github-9.0.0.tgz#c86dae4128b2a6987271e2663bee9e766464840a" + integrity sha512-yJ0RoswsAaKcvkmpCE4XxBRiy/whH2SdTBHWzs0gi4wkqTDhXMChjSdqBz/F4AeiDlP28rQqL33iHb+kjAMX6w== + dependencies: + "@actions/http-client" "^3.0.2" + "@octokit/core" "^7.0.6" + "@octokit/plugin-paginate-rest" "^14.0.0" + "@octokit/plugin-rest-endpoint-methods" "^17.0.0" + "@octokit/request" "^10.0.7" + "@octokit/request-error" "^7.1.0" + undici "^6.23.0" + +"@actions/http-client@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-3.0.2.tgz#3db9c83af9d29d51ac8c30b45bc17f7014beb1b2" + integrity sha512-JP38FYYpyqvUsz+Igqlc/JG6YO9PaKuvqjM3iGvaLqFnJ7TFmcLyy2IDrY0bI0qCQug8E9K+elv5ZNfw62ZJzA== + dependencies: + tunnel "^0.0.6" + undici "^6.23.0" + "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" @@ -585,14 +606,14 @@ "@octokit/types" "^16.0.0" bottleneck "^2.15.3" -"@octokit/request-error@^7.0.0", "@octokit/request-error@^7.0.2": +"@octokit/request-error@^7.0.0", "@octokit/request-error@^7.0.2", "@octokit/request-error@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-7.1.0.tgz#440fa3cae310466889778f5a222b47a580743638" integrity sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw== dependencies: "@octokit/types" "^16.0.0" -"@octokit/request@^10.0.6": +"@octokit/request@^10.0.6", "@octokit/request@^10.0.7": version "10.0.8" resolved "https://registry.yarnpkg.com/@octokit/request/-/request-10.0.8.tgz#6609a5a38ad6f8ee203d9eb8ac9361d906a4414e" integrity sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw== @@ -636,9 +657,9 @@ integrity sha512-JaaYhsX4CA/QTIXdQfDpD9zcxew5EHuWxJjL+Ctp3L4FXC2gEAZ3s1DaCJU6aFOF285dJH3zAoeU64EJvxCaAw== "@opentelemetry/api-logs@<1.0.0": - version "0.212.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.212.0.tgz#ec66a0951b84b1f082e13fd8a027b9f9d65a3f7a" - integrity sha512-TEEVrLbNROUkYY51sBJGk7lO/OLjuepch8+hmpM6ffMJQ2z/KVCjdHuCFX6fJj8OkJP2zckPjrJzQtXU3IAsFg== + version "0.213.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.213.0.tgz#c7abc7d3c4586cfbfd737c0a2fcfb2323a9def75" + integrity sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw== dependencies: "@opentelemetry/api" "^1.3.0" @@ -836,17 +857,17 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^15.1.0": +"@sinonjs/fake-timers@^15.1.1": version "15.1.1" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz#e1a6f7171941aadcc31d2cea1744264d58b8b34c" integrity sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw== dependencies: "@sinonjs/commons" "^3.0.1" -"@sinonjs/samsam@^8.0.3": - version "8.0.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.3.tgz#eb6ffaef421e1e27783cc9b52567de20cb28072d" - integrity sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ== +"@sinonjs/samsam@^9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-9.0.2.tgz#ff0ad0e50e41942891588989615fbc4df569b76b" + integrity sha512-H/JSxa4GNKZuuU41E3b8Y3tbSEx8y4uq4UH1C56ONQac16HblReJomIvv3Ud7ANQHQmkeSowY49Ij972e/pGxQ== dependencies: "@sinonjs/commons" "^3.0.1" type-detect "^4.1.0" @@ -1575,7 +1596,7 @@ diff@^7.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== -diff@^8.0.2: +diff@^8.0.3: version "8.0.3" resolved "https://registry.yarnpkg.com/diff/-/diff-8.0.3.tgz#c7da3d9e0e8c283bb548681f8d7174653720c2d5" integrity sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ== @@ -2360,9 +2381,9 @@ graceful-fs@^4.1.15, graceful-fs@^4.2.4: integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphql@*: - version "16.13.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.13.0.tgz#726857e897e87d54412d62356ec0b6b76bfab409" - integrity sha512-uSisMYERbaB9bkA9M4/4dnqyktaEkf1kMHNKq/7DHyxVeWqHQ2mBmVqm5u6/FVHwF3iCNalKcg82Zfl+tffWoA== + version "16.13.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.13.1.tgz#38ae5c76fbc4a009e0004dca6c76c370a1da7b54" + integrity sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ== has-bigints@^1.0.2: version "1.1.0" @@ -3159,9 +3180,9 @@ ms@^2.1.1, ms@^2.1.3: integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multer@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multer/-/multer-2.1.0.tgz#9c41ecf4fa68842be4f8f666ca64a22724a53945" - integrity sha512-TBm6j41rxNohqawsxlsWsNNh/VdV4QFXcBvRcPhXaA05EZ79z0qJ2bQFpync6JBoHTeNY5Q1JpG7AlTjdlfAEA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/multer/-/multer-2.1.1.tgz#122d819244fbdfee1efddd9147426691014385b7" + integrity sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A== dependencies: append-field "^1.0.0" busboy "^1.6.0" @@ -3210,9 +3231,9 @@ node-preload@^0.2.1: process-on-spawn "^1.0.0" node-releases@^2.0.27: - version "2.0.27" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" - integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== + version "2.0.36" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" + integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== nyc@^17.1.0: version "17.1.0" @@ -3969,14 +3990,14 @@ signal-exit@^4.0.1: integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sinon@^21.0.1: - version "21.0.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-21.0.1.tgz#36b9126065a44906f7ba4a47b723b99315a8c356" - integrity sha512-Z0NVCW45W8Mg5oC/27/+fCqIHFnW8kpkFOq0j9XJIev4Ld0mKmERaZv5DMLAb9fGCevjKwaEeIQz5+MBXfZcDw== + version "21.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-21.0.2.tgz#2dca6fc59eca5288d9f2284925e9ae586085f917" + integrity sha512-VHV4UaoxIe5jrMd89Y9duI76T5g3Lp+ET+ctLhLDaZtSznDPah1KKpRElbdBV4RwqWSw2vadFiVs9Del7MbVeQ== dependencies: "@sinonjs/commons" "^3.0.1" - "@sinonjs/fake-timers" "^15.1.0" - "@sinonjs/samsam" "^8.0.3" - diff "^8.0.2" + "@sinonjs/fake-timers" "^15.1.1" + "@sinonjs/samsam" "^9.0.2" + diff "^8.0.3" supports-color "^7.2.0" source-map@^0.6.1: @@ -4047,16 +4068,7 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4120,14 +4132,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -4239,6 +4244,11 @@ tslib@^2.4.0, tslib@^2.5.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -4355,6 +4365,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.23.0.tgz#7953087744d9095a96f115de3140ca3828aff3a4" + integrity sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g== + universal-github-app-jwt@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz#38537e5a7d154085a35f97601a5e30e9e17717df" @@ -4480,7 +4495,7 @@ workerpool@^9.2.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-9.3.4.tgz#f6c92395b2141afd78e2a889e80cb338fe9fca41" integrity sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -4498,15 +4513,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 4a4fc9b2a8b1fcbb18a8863d569b5ea985735639 Mon Sep 17 00:00:00 2001 From: rochdev Date: Mon, 16 Feb 2026 15:19:28 -0500 Subject: [PATCH 12/20] fix --- scripts/all-green.mjs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index c9d94b11b67..4ef79170339 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -49,12 +49,12 @@ async function getAllGreen () { } ) - return completedRuns.some(run => ( + return !completedRuns.some(run => ( run.conclusion === 'failure' || run.conclusion === 'timed_out' )) } -async function checkStatus () { +async function checkAllGreen () { if (RETRIES && retries > RETRIES) { throw new Error(`State is still pending after ${RETRIES} retries.`) } @@ -66,7 +66,7 @@ async function checkStatus () { await setTimeout(POLLING_INTERVAL * 60_000) console.log('Retrying.') retries++ - return checkStatus() + return checkAllGreen() } if (allGreen) { @@ -81,4 +81,4 @@ if (DELAY) { await setTimeout(DELAY * 60_000) } -await checkStatus() +await checkAllGreen() From bda3b590435e7f1f28b135320f463648c923057e Mon Sep 17 00:00:00 2001 From: rochdev Date: Mon, 16 Feb 2026 15:30:31 -0500 Subject: [PATCH 13/20] fix queue runs count --- scripts/all-green.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index 4ef79170339..7cd5d458291 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -38,7 +38,7 @@ async function getAllGreen () { }) // Same as above, but jobs that are queued are not even in progress yet. - if (queuedRuns.total_count > 1) return + if (queuedRuns.total_count > 0) return const completedRuns = await octokit.paginate( 'GET /repos/:owner/:repo/commits/:ref/check-runs', From 87d6c576c3f59b195dc5fb1995b6743fb636582d Mon Sep 17 00:00:00 2001 From: rochdev Date: Mon, 16 Feb 2026 15:37:04 -0500 Subject: [PATCH 14/20] remove delay for reruns --- .github/workflows/all-green.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/all-green.yml b/.github/workflows/all-green.yml index 82b9c6c3de9..c25a1c86d6c 100644 --- a/.github/workflows/all-green.yml +++ b/.github/workflows/all-green.yml @@ -30,7 +30,7 @@ jobs: - run: yarn add @actions/github octokit - run: node scripts/all-green.mjs env: - DELAY: 5 + DELAY: ${{ github.run_attempt == 1 && '7' || '0' }} # 7 minutes on first attempt, no delay on reruns GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }} GITHUB_TOKEN: ${{ github.token }} POLLING_INTERVAL: 1 From 1447a65606587daef27202665f12e5524a0d2054 Mon Sep 17 00:00:00 2001 From: rochdev Date: Mon, 16 Feb 2026 23:23:30 -0500 Subject: [PATCH 15/20] add logging --- scripts/all-green.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index 7cd5d458291..9df3ad23a85 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -81,4 +81,6 @@ if (DELAY) { await setTimeout(DELAY * 60_000) } +console.log(`Polling status for ref: ${ref}.`) + await checkAllGreen() From 2e3ae9cd9bf90ef5c995b2de033777e3c217906a Mon Sep 17 00:00:00 2001 From: rochdev Date: Tue, 17 Feb 2026 23:54:57 -0500 Subject: [PATCH 16/20] move initial message to top --- scripts/all-green.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index 9df3ad23a85..13c840776c8 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -76,11 +76,11 @@ async function checkAllGreen () { } } +console.log(`Polling status for ref: ${ref}.`) + if (DELAY) { console.log(`Waiting for ${DELAY} minutes before starting.`) await setTimeout(DELAY * 60_000) } -console.log(`Polling status for ref: ${ref}.`) - await checkAllGreen() From c1f3656e418854cd643b6c42833e5ae6b34ea7dd Mon Sep 17 00:00:00 2001 From: rochdev Date: Mon, 2 Mar 2026 22:14:13 -0500 Subject: [PATCH 17/20] add status summary at the end --- .github/workflows/all-green.yml | 2 +- package.json | 1 + scripts/all-green.mjs | 87 ++++++++++++++++++++++++--------- yarn.lock | 31 ++++++++++++ 4 files changed, 98 insertions(+), 23 deletions(-) diff --git a/.github/workflows/all-green.yml b/.github/workflows/all-green.yml index c25a1c86d6c..e8de0e51eb4 100644 --- a/.github/workflows/all-green.yml +++ b/.github/workflows/all-green.yml @@ -27,7 +27,7 @@ jobs: - uses: ./.github/actions/node with: version: active - - run: yarn add @actions/github octokit + - run: yarn add @actions/core @actions/github octokit - run: node scripts/all-green.mjs env: DELAY: ${{ github.run_attempt == 1 && '7' || '0' }} # 7 minutes on first attempt, no delay on reruns diff --git a/package.json b/package.json index e2f6cf98f17..c3373fd2511 100644 --- a/package.json +++ b/package.json @@ -147,6 +147,7 @@ "oxc-parser": "^0.115.0" }, "devDependencies": { + "@actions/core": "^3.0.0", "@actions/github": "^9.0.0", "@babel/helpers": "^7.28.6", "@eslint/eslintrc": "^3.3.1", diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index 13c840776c8..416f4c31b93 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -1,5 +1,6 @@ import { setTimeout } from 'timers/promises' import { Octokit } from 'octokit' +import { summary } from '@actions/core' import { context } from '@actions/github' /* eslint-disable no-console */ @@ -17,10 +18,20 @@ const owner = 'DataDog' const repo = 'dd-trace-js' const ref = context.payload.pull_request?.head.sha || GITHUB_SHA const params = { owner, repo, ref } +const checkConclusionEmojis = { + action_required: '🔶', + cancelled: '🚫', + failure: '❌', + neutral: '⚪', + success: '✅', + skipped: '⏭️', + stale: '🔄', + timed_out: '⌛', +} let retries = 0 -async function getAllGreen () { +async function hasCompleted () { const { data: inProgressRuns } = await octokit.rest.checks.listForRef({ ...params, per_page: 1, // Minimum is 1 but we don't need any pages. @@ -29,7 +40,7 @@ async function getAllGreen () { // If there are any in progress runs it means we're not ready to check // statuses. We will always have minimum 1 for the All Green job. - if (inProgressRuns.total_count > 1) return + if (inProgressRuns.total_count > 1) return false const { data: queuedRuns } = await octokit.rest.checks.listForRef({ ...params, @@ -38,44 +49,76 @@ async function getAllGreen () { }) // Same as above, but jobs that are queued are not even in progress yet. - if (queuedRuns.total_count > 0) return - - const completedRuns = await octokit.paginate( - 'GET /repos/:owner/:repo/commits/:ref/check-runs', - { - ...params, - per_page: 100, - status: 'completed', - } - ) - - return !completedRuns.some(run => ( - run.conclusion === 'failure' || run.conclusion === 'timed_out' - )) + if (queuedRuns.total_count > 0) return false + + return true } -async function checkAllGreen () { +async function checkCompleted () { if (RETRIES && retries > RETRIES) { throw new Error(`State is still pending after ${RETRIES} retries.`) } - const allGreen = await getAllGreen() - - if (allGreen === undefined) { + if (!await hasCompleted()) { console.log(`Status is still pending, waiting for ${POLLING_INTERVAL} minutes before retrying.`) await setTimeout(POLLING_INTERVAL * 60_000) console.log('Retrying.') retries++ - return checkAllGreen() + return checkCompleted() } +} + +async function checkAllGreen () { + let checkRuns + + try { + checkCompleted() + } finally { + checkRuns = await octokit.paginate( + 'GET /repos/:owner/:repo/commits/:ref/check-runs', + { + ...params, + per_page: 100, + } + ) + + printSummary(checkRuns) + } + + const allGreen = !checkRuns.some(run => ( + run.conclusion === 'failure' || run.conclusion === 'timed_out' + )) if (allGreen) { - console.log('All jobs were succesful.') + console.log('All jobs were successful.') } else { throw new Error('One or more jobs failed.') } } +async function printSummary (checkRuns) { + const header = [ + { data: 'name', header: true }, + { data: 'status', header: true }, + { data: 'conclusion', header: true }, + { data: 'started_at', header: true }, + { data: 'completed_at', header: true }, + ] + + const body = checkRuns.map(run => [ + run.name, + run.status, + run.conclusion ? `${run.conclusion} ${checkConclusionEmojis[run.conclusion]}` : ' ', + run.started_at, + run.completed_at ?? ' ', + ]) + + await summary + .addHeading('Checks Summary') + .addTable([header, body]) + .write() +} + console.log(`Polling status for ref: ${ref}.`) if (DELAY) { diff --git a/yarn.lock b/yarn.lock index 540e49ffcc6..3c4067b7f39 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,21 @@ # yarn lockfile v1 +"@actions/core@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@actions/core/-/core-3.0.0.tgz#89cb07c119e9b46a649ad5f355e77de9b3108cf8" + integrity sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg== + dependencies: + "@actions/exec" "^3.0.0" + "@actions/http-client" "^4.0.0" + +"@actions/exec@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@actions/exec/-/exec-3.0.0.tgz#8c3464d20f0aa4068707757021d7e3c01a7ee203" + integrity sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw== + dependencies: + "@actions/io" "^3.0.2" + "@actions/github@^9.0.0": version "9.0.0" resolved "https://registry.yarnpkg.com/@actions/github/-/github-9.0.0.tgz#c86dae4128b2a6987271e2663bee9e766464840a" @@ -23,6 +38,19 @@ tunnel "^0.0.6" undici "^6.23.0" +"@actions/http-client@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-4.0.0.tgz#f9754133c22802466482bf96321d42f2dba1fc82" + integrity sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g== + dependencies: + tunnel "^0.0.6" + undici "^6.23.0" + +"@actions/io@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@actions/io/-/io-3.0.2.tgz#6f89b27a159d109836d983efa283997c23b92284" + integrity sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw== + "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" @@ -4069,6 +4097,7 @@ streamsearch@^1.1.0: integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4133,6 +4162,7 @@ string_decoder@~1.1.1: safe-buffer "~5.1.0" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -4496,6 +4526,7 @@ workerpool@^9.2.0: integrity sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== From 808ffcdd2ebc67b0f4dce8890b8338aa2d39e682 Mon Sep 17 00:00:00 2001 From: rochdev Date: Wed, 4 Mar 2026 19:34:24 -0500 Subject: [PATCH 18/20] fix output --- scripts/all-green.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index 416f4c31b93..7f289584d40 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -115,7 +115,7 @@ async function printSummary (checkRuns) { await summary .addHeading('Checks Summary') - .addTable([header, body]) + .addTable([header, ...body]) .write() } From e134877333cc98dfc081da5542cd983e642038fa Mon Sep 17 00:00:00 2001 From: rochdev Date: Wed, 4 Mar 2026 20:06:33 -0500 Subject: [PATCH 19/20] fix race condition --- scripts/all-green.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/all-green.mjs b/scripts/all-green.mjs index 7f289584d40..aae989cb8aa 100644 --- a/scripts/all-green.mjs +++ b/scripts/all-green.mjs @@ -64,7 +64,7 @@ async function checkCompleted () { await setTimeout(POLLING_INTERVAL * 60_000) console.log('Retrying.') retries++ - return checkCompleted() + await checkCompleted() } } @@ -72,7 +72,7 @@ async function checkAllGreen () { let checkRuns try { - checkCompleted() + await checkCompleted() } finally { checkRuns = await octokit.paginate( 'GET /repos/:owner/:repo/commits/:ref/check-runs', From 444209c0756421e10be19736c2c955cc5cf84786 Mon Sep 17 00:00:00 2001 From: rochdev Date: Thu, 5 Mar 2026 12:12:20 -0500 Subject: [PATCH 20/20] fix lockfile --- yarn.lock | 51 ++++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3c4067b7f39..436f65cdf08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -685,9 +685,9 @@ integrity sha512-JaaYhsX4CA/QTIXdQfDpD9zcxew5EHuWxJjL+Ctp3L4FXC2gEAZ3s1DaCJU6aFOF285dJH3zAoeU64EJvxCaAw== "@opentelemetry/api-logs@<1.0.0": - version "0.213.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.213.0.tgz#c7abc7d3c4586cfbfd737c0a2fcfb2323a9def75" - integrity sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw== + version "0.212.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.212.0.tgz#ec66a0951b84b1f082e13fd8a027b9f9d65a3f7a" + integrity sha512-TEEVrLbNROUkYY51sBJGk7lO/OLjuepch8+hmpM6ffMJQ2z/KVCjdHuCFX6fJj8OkJP2zckPjrJzQtXU3IAsFg== dependencies: "@opentelemetry/api" "^1.3.0" @@ -885,17 +885,17 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^15.1.1": +"@sinonjs/fake-timers@^15.1.0": version "15.1.1" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz#e1a6f7171941aadcc31d2cea1744264d58b8b34c" integrity sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw== dependencies: "@sinonjs/commons" "^3.0.1" -"@sinonjs/samsam@^9.0.2": - version "9.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-9.0.2.tgz#ff0ad0e50e41942891588989615fbc4df569b76b" - integrity sha512-H/JSxa4GNKZuuU41E3b8Y3tbSEx8y4uq4UH1C56ONQac16HblReJomIvv3Ud7ANQHQmkeSowY49Ij972e/pGxQ== +"@sinonjs/samsam@^8.0.3": + version "8.0.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.3.tgz#eb6ffaef421e1e27783cc9b52567de20cb28072d" + integrity sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ== dependencies: "@sinonjs/commons" "^3.0.1" type-detect "^4.1.0" @@ -1624,7 +1624,7 @@ diff@^7.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== -diff@^8.0.3: +diff@^8.0.2: version "8.0.3" resolved "https://registry.yarnpkg.com/diff/-/diff-8.0.3.tgz#c7da3d9e0e8c283bb548681f8d7174653720c2d5" integrity sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ== @@ -2409,9 +2409,9 @@ graceful-fs@^4.1.15, graceful-fs@^4.2.4: integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphql@*: - version "16.13.1" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.13.1.tgz#38ae5c76fbc4a009e0004dca6c76c370a1da7b54" - integrity sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ== + version "16.13.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.13.0.tgz#726857e897e87d54412d62356ec0b6b76bfab409" + integrity sha512-uSisMYERbaB9bkA9M4/4dnqyktaEkf1kMHNKq/7DHyxVeWqHQ2mBmVqm5u6/FVHwF3iCNalKcg82Zfl+tffWoA== has-bigints@^1.0.2: version "1.1.0" @@ -3208,9 +3208,9 @@ ms@^2.1.1, ms@^2.1.3: integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multer@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/multer/-/multer-2.1.1.tgz#122d819244fbdfee1efddd9147426691014385b7" - integrity sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A== + version "2.1.0" + resolved "https://registry.yarnpkg.com/multer/-/multer-2.1.0.tgz#9c41ecf4fa68842be4f8f666ca64a22724a53945" + integrity sha512-TBm6j41rxNohqawsxlsWsNNh/VdV4QFXcBvRcPhXaA05EZ79z0qJ2bQFpync6JBoHTeNY5Q1JpG7AlTjdlfAEA== dependencies: append-field "^1.0.0" busboy "^1.6.0" @@ -3259,9 +3259,9 @@ node-preload@^0.2.1: process-on-spawn "^1.0.0" node-releases@^2.0.27: - version "2.0.36" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" - integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== + version "2.0.27" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" + integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== nyc@^17.1.0: version "17.1.0" @@ -4018,14 +4018,14 @@ signal-exit@^4.0.1: integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sinon@^21.0.1: - version "21.0.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-21.0.2.tgz#2dca6fc59eca5288d9f2284925e9ae586085f917" - integrity sha512-VHV4UaoxIe5jrMd89Y9duI76T5g3Lp+ET+ctLhLDaZtSznDPah1KKpRElbdBV4RwqWSw2vadFiVs9Del7MbVeQ== + version "21.0.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-21.0.1.tgz#36b9126065a44906f7ba4a47b723b99315a8c356" + integrity sha512-Z0NVCW45W8Mg5oC/27/+fCqIHFnW8kpkFOq0j9XJIev4Ld0mKmERaZv5DMLAb9fGCevjKwaEeIQz5+MBXfZcDw== dependencies: "@sinonjs/commons" "^3.0.1" - "@sinonjs/fake-timers" "^15.1.1" - "@sinonjs/samsam" "^9.0.2" - diff "^8.0.3" + "@sinonjs/fake-timers" "^15.1.0" + "@sinonjs/samsam" "^8.0.3" + diff "^8.0.2" supports-color "^7.2.0" source-map@^0.6.1: @@ -4097,7 +4097,6 @@ streamsearch@^1.1.0: integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4162,7 +4161,6 @@ string_decoder@~1.1.1: safe-buffer "~5.1.0" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -4526,7 +4524,6 @@ workerpool@^9.2.0: integrity sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==