[CI] Surface AMD ROCm 7.2 state in the PR CI-states block (#34813)
Co-authored-by: Michael <michaelzhang-ai@users.noreply.github.com> Co-authored-by: Chen <bingxche@amd.com>
This commit is contained in:
@@ -5,19 +5,16 @@ name: PR States
|
|||||||
#
|
#
|
||||||
# Three triggers, each covering a gap:
|
# Three triggers, each covering a gap:
|
||||||
# - pull_request_target: push / open / label change (all PRs incl forks).
|
# - pull_request_target: push / open / label change (all PRs incl forks).
|
||||||
# - workflow_run: initial pr-test* completion (incl fork PRs; the
|
# - workflow_run: pr-test* requested / completed events (incl fork PRs).
|
||||||
# notify-job below can't fire on forks — their pull_request
|
# `requested` is absent on reruns, but `completed` still fires.
|
||||||
# GITHUB_TOKEN is forced read-only). Does NOT re-fire for rerun
|
# - workflow_dispatch: explicit refreshes for a provided PR number. This
|
||||||
# attempts, which is why workflow_dispatch is needed too.
|
# is the only event here that GITHUB_TOKEN can cascade-create.
|
||||||
# - workflow_dispatch: rerun completions for non-fork PRs, dispatched by
|
|
||||||
# pr-test*'s notify-pr-states job. workflow_dispatch is the only event
|
|
||||||
# GITHUB_TOKEN can cascade-create.
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
types: [opened, synchronize, reopened, labeled, unlabeled]
|
types: [opened, synchronize, reopened, labeled, unlabeled]
|
||||||
workflow_run:
|
workflow_run:
|
||||||
workflows: ["PR Test Base", "PR Test Extra"]
|
workflows: ["PR Test Base", "PR Test Extra", "PR Test ROCm 7.2 (AMD)"]
|
||||||
types: [requested, completed]
|
types: [requested, completed]
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
@@ -63,6 +60,14 @@ jobs:
|
|||||||
prNumber = context.payload.pull_request.number;
|
prNumber = context.payload.pull_request.number;
|
||||||
} else if (context.eventName === 'workflow_run') {
|
} else if (context.eventName === 'workflow_run') {
|
||||||
const wr = context.payload.workflow_run;
|
const wr = context.payload.workflow_run;
|
||||||
|
// Only pull_request runs are the PR gate. The AMD workflow also
|
||||||
|
// accepts workflow_dispatch for a single stage, and such a run on
|
||||||
|
// a PR branch is PR-associated; refreshing off it would rewrite
|
||||||
|
// the block from a run the rows below deliberately ignore.
|
||||||
|
if (wr.event !== 'pull_request') {
|
||||||
|
core.info(`Triggering run event '${wr.event}' is not pull_request; skipping.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (wr.pull_requests && wr.pull_requests.length > 0) {
|
if (wr.pull_requests && wr.pull_requests.length > 0) {
|
||||||
prNumber = wr.pull_requests[0].number;
|
prNumber = wr.pull_requests[0].number;
|
||||||
} else if (wr.head_repository && wr.head_branch) {
|
} else if (wr.head_repository && wr.head_branch) {
|
||||||
@@ -119,6 +124,10 @@ jobs:
|
|||||||
repo: context.repo.repo,
|
repo: context.repo.repo,
|
||||||
workflow_id: workflowFile,
|
workflow_id: workflowFile,
|
||||||
head_sha: sha,
|
head_sha: sha,
|
||||||
|
// Every row reports the PR gate, so exclude other events for
|
||||||
|
// this SHA: all three workflows also accept workflow_dispatch,
|
||||||
|
// and for AMD that is a single stage rather than the full gate.
|
||||||
|
event: 'pull_request',
|
||||||
per_page: 1,
|
per_page: 1,
|
||||||
});
|
});
|
||||||
return data.workflow_runs[0] || null;
|
return data.workflow_runs[0] || null;
|
||||||
@@ -140,9 +149,22 @@ jobs:
|
|||||||
// on just-removed-label to catch removal-after-push.
|
// on just-removed-label to catch removal-after-push.
|
||||||
const labelOnOpts = { preSleepMs: LABEL_ON_PRESLEEP_MS, attempts: RETRY_ATTEMPTS, delayMs: RETRY_DELAY_MS };
|
const labelOnOpts = { preSleepMs: LABEL_ON_PRESLEEP_MS, attempts: RETRY_ATTEMPTS, delayMs: RETRY_DELAY_MS };
|
||||||
const labelOffOpts = { preSleepMs: justRemovedLabel ? LABEL_OFF_PRESLEEP_MS : 0, attempts: 1 };
|
const labelOffOpts = { preSleepMs: justRemovedLabel ? LABEL_OFF_PRESLEEP_MS : 0, attempts: 1 };
|
||||||
const ptRun = await findRun('pr-test.yml', hasCI ? labelOnOpts : labelOffOpts);
|
|
||||||
|
// The three lookups are independent, so the added one costs no
|
||||||
|
// wall-clock time. The AMD lookup never spends the retry budget:
|
||||||
|
// that workflow has an on.pull_request.paths filter, so a missing
|
||||||
|
// run is usually legitimate rather than an indexing race, and the
|
||||||
|
// race resolves itself -- `requested` is in the workflow_run
|
||||||
|
// subscription above, so a real dispatch refreshes this block.
|
||||||
|
const [ptRun, peRun, amdRun] = await Promise.all([
|
||||||
|
findRun('pr-test.yml', hasCI ? labelOnOpts : labelOffOpts),
|
||||||
// pr-test-extra gates on BOTH labels (see check-changes there).
|
// pr-test-extra gates on BOTH labels (see check-changes there).
|
||||||
const peRun = await findRun('pr-test-extra.yml', (hasCI && hasExtra) ? labelOnOpts : labelOffOpts);
|
findRun(
|
||||||
|
'pr-test-extra.yml',
|
||||||
|
(hasCI && hasExtra) ? labelOnOpts : labelOffOpts,
|
||||||
|
),
|
||||||
|
findRun('pr-test-amd-rocm720.yml', labelOffOpts),
|
||||||
|
]);
|
||||||
|
|
||||||
// Skipped run = "no real run" -- happens when a label is added
|
// Skipped run = "no real run" -- happens when a label is added
|
||||||
// after a commit, because GHA doesn't retrigger on `labeled`.
|
// after a commit, because GHA doesn't retrigger on `labeled`.
|
||||||
@@ -152,6 +174,10 @@ jobs:
|
|||||||
const peBlockedByCIText = ':x: **Blocked** -- `run-ci` is required first.';
|
const peBlockedByCIText = ':x: **Blocked** -- `run-ci` is required first.';
|
||||||
const notExtraEnabledText = ':warning: **Not enabled** -- add `run-ci-extra` label to opt in.';
|
const notExtraEnabledText = ':warning: **Not enabled** -- add `run-ci-extra` label to opt in.';
|
||||||
const stalePushText = ':warning: **Not run on latest push** -- push again to dispatch.';
|
const stalePushText = ':warning: **Not run on latest push** -- push again to dispatch.';
|
||||||
|
// A missing run usually means the paths filter excluded the PR,
|
||||||
|
// but pull_request workflows can also be suppressed by GitHub
|
||||||
|
// (for example, for merge conflicts or skip annotations).
|
||||||
|
const amdNotTriggeredText = ':heavy_minus_sign: **No AMD PR run found for this commit**.';
|
||||||
|
|
||||||
// Status icon: body otherwise looks uniformly "dispatched" even
|
// Status icon: body otherwise looks uniformly "dispatched" even
|
||||||
// for gate-failed runs (call-gate exits on missing label).
|
// for gate-failed runs (call-gate exits on missing label).
|
||||||
@@ -178,6 +204,9 @@ jobs:
|
|||||||
: !hasExtra
|
: !hasExtra
|
||||||
? notExtraEnabledText
|
? notExtraEnabledText
|
||||||
: stalePushText;
|
: stalePushText;
|
||||||
|
const amdText = isReal(amdRun)
|
||||||
|
? runLink(amdRun)
|
||||||
|
: amdNotTriggeredText;
|
||||||
|
|
||||||
const outerStart = '<!-- pr-states:start -->';
|
const outerStart = '<!-- pr-states:start -->';
|
||||||
const outerEnd = '<!-- pr-states:end -->';
|
const outerEnd = '<!-- pr-states:end -->';
|
||||||
@@ -185,6 +214,8 @@ jobs:
|
|||||||
const ptEnd = '<!-- slot:pr-test:end -->';
|
const ptEnd = '<!-- slot:pr-test:end -->';
|
||||||
const peStart = '<!-- slot:pr-test-extra:start -->';
|
const peStart = '<!-- slot:pr-test-extra:start -->';
|
||||||
const peEnd = '<!-- slot:pr-test-extra:end -->';
|
const peEnd = '<!-- slot:pr-test-extra:end -->';
|
||||||
|
const amdStart = '<!-- slot:pr-test-amd-rocm720:start -->';
|
||||||
|
const amdEnd = '<!-- slot:pr-test-amd-rocm720:end -->';
|
||||||
|
|
||||||
const newBlock = [
|
const newBlock = [
|
||||||
outerStart,
|
outerStart,
|
||||||
@@ -193,6 +224,7 @@ jobs:
|
|||||||
'',
|
'',
|
||||||
`Latest PR Test (Base): ${ptStart}${ptText}${ptEnd}`,
|
`Latest PR Test (Base): ${ptStart}${ptText}${ptEnd}`,
|
||||||
`Latest PR Test (Extra): ${peStart}${peText}${peEnd}`,
|
`Latest PR Test (Extra): ${peStart}${peText}${peEnd}`,
|
||||||
|
`Latest PR Test (AMD ROCm 7.2): ${amdStart}${amdText}${amdEnd}`,
|
||||||
outerEnd,
|
outerEnd,
|
||||||
].join('\n');
|
].join('\n');
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user