Repository navigation
ci(nightly): secret-free Linux jobs take the GCP fleet label while it can start them, Blacksmith at once otherwise - #30114
teamleaderleo wants to merge 2 commits into
Conversation
…hem, Blacksmith at once otherwise decide's early placement (#29864) also reads the org runner group cmux-fleet-linux (HQ's ephemeral GCP runners, label cmux-fleet-linux-x64) on attempt 1. While the group has an online idle runner and room under its busy ceiling, the early jobs take that label and decide's new `fleet_linux` output names it; the other nightly Linux jobs read it first. An unread group, no runner (the grant is not in place yet), no idle runner, a full pool or a re-run offers nothing, with no wait, and every job keeps its existing route. A test fails any nightly Linux job whose runs-on can reach Blacksmith before a fleet route, outside a short list of reasoned exceptions (the signer route, the signing publisher, the promotion dispatch). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d9093a0f1b2d0cbb0b2c
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
red: cmux-next checks (god files, concurrency, crash safety, l10n); base red: the same failure on the base a30fe2b; does not block |
|
Found 9 test failures on Blacksmith runners: Failures
|
|
Review (codex gpt-6.1-sol xhigh, router-review): SHIP at d00049a SHIP at d00049a Visual verdict: no images; Leo tries the build
Focused routing suites passed: 350 tests. Follow-ups:
|
…tialed set fleet_linux now comes from place-early-mac (the credentialed picker stays off the GCP label, MAC_FIRST) and reaches only the secret-free nightly Linux jobs; credentialed jobs keep #30158's validated ephemeral set. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d9093a0f1b2d0cbb0b2c
|
Review (codex gpt-6.1-sol xhigh, router-review): SHIP at 822637d Follow-ups:
|
|
Closing as superseded. While this waited to land, feat-cmux-next got its own fleet route for these jobs:
This PR's |
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
HOLD: superseded by #30085, #30126 and #30173 on feat-cmux-next; do not land.
Leo, 2026-10-31: "FOR OUR NIGHTLIES ARE THEY END TO END ON OUR FLEET? WE CAN'T BE RELYING ON BLACKSMITH THAT CUTS OUT"
The ask, as it came to this lane: "NEXT nightly Linux jobs still land on Blacksmith, because cmux never requests the GCP label
cmux-fleet-linux-x64. Rulebook: nightly Linux jobs run on fleet Linux first, Blacksmith only as stall-aware overflow after about 3 min, and a CI test fails a nightly runs-on that can resolve to Blacksmith before the fleet."What
This builds on decide's early placement (#29864) and, since this PR's first head, on #30085 (controller admission for the four early controls) and #30158 (credentialed controls on the validated ephemeral set). It adds no second picker.
portable_job_placement.py: whenFLEET_GROUP_LABELandFLEET_LINUX_GROUPare set, it also lists the org runner groupcmux-fleet-linuxon attempt 1. That group holds HQ's ephemeral GCP runners (build-fleet/swift-linux-builder/gha-runners/README.md). The label counts as live only when the group has an online idle runner carrying it and fewer than 12 busy ones (HQ'sMAX_VMSis 16, less a nightly's burst). Only then does a newfleet_linuxoutput name it. Otherwise the output is empty and the step does not wait for the label. That covers an unread group, a group with no runners (today: the grant is not in place), no idle runner, a full pool, and a re-run.pr_runner_pool.GitHub.runners(group=...)can list any org runner group. Its default is unchanged.nightly.yml: decide'splace-early-macstep (the credentialedpick-nightly-build-runner,MAC_FIRST, so it never takes the GCP label itself) reportsfleet_linux. The 9 secret-free nightly Linux jobs outside ci(nightly): admit Linux controls on fleet before paid overflow #30085's admission readgithub.run_attempt == 1 && needs.decide.outputs.fleet_linuxfirst, then their existing route. Those jobs are build-nightly-remote-daemon, both prepare-nightly-variant jobs, the visual-gate verdict and its report, await-nightly-tree-marker, nightly-identity-legacy-published, and report/close-nightly-failure. Jobs that hold release or production credentials keep ci(nightly): validate trusted sets for credentialed controls #30158's validated ephemeral set: GCP runners are not on the signing trust list, and this PR does not change that list. The signer jobs (ci(nightly): signer jobs take GitHub-hosted Ubuntu, Blacksmith 4 vCPU on a re-run, never 16 or 32 #29886/ci(nightly): route credentialed signers through trusted Linux set #30081) are not touched.tests/test_ci_nightly_off_blacksmith.py: the newtest_nightly_linux_jobs_offer_the_fleet_before_blacksmithfails any nightly Linux job whose runs-on reaches a Blacksmith label before its first fleet route. The exceptions are the jobs named inFLEET_LINUX_EXCEPTIONS, each with a reason: signer route, signing publisher, credentialed set, promotion dispatch, never runs. A job readingfleet_linuxmust hold no secret and no environment.BLACKSMITH_LINUX_ONLY_DEBTbecomes exactly those exceptions, down from 28 entries.tests/test_ci_portable_job_placement.py: covers the group cases (live, unread, empty, busy, offline, unlabelled, full, re-run) andmainreading the group.Demand: HQ's
gha_runners.pyreads queued jobs from the workflows listed inworkflows.json. Its*nightly*.ymlpattern already coversnightly.yml.Live state of the GCP label
The warm floor is in place: cmuxterm-hq#5806 (687d2838) keeps 2 idle runners always on, on c4d-standard-8 (n4d-standard-8 as fallback). A runner that takes a job is replaced on the next tick. With idle runners there, this placement's idle-runner check can see the pool.
What's left for the fleet route is the grant. Every
fleet-reconciler-gha-runnersrun (HQ run 41259961054, 01:10Z) logsworkload identity exchange failed (grant not in place: build-fleet/swift-linux-builder/gha-runners/grant.sh); no runner VM made. Until a GCP project owner runsgrant.sh, the group has no runners,fleet_linuxstays empty, and these jobs route exactly as they do today, on Blacksmith.Risk
This changes the CI routing of 9 secret-free nightly Linux jobs. Each new term is gated on attempt 1 and on a live read of the runner group, and a failure falls through to the previous route. Two follow-ups are filed: #30122 (late jobs reuse decide's early check) and #30123 (the GCP read depends on
CI_PR_POOL_OWNED).test_workflow_file_sizeandtest_ci_owned_pool_sourcesare red on base the same way. Compared by test name against base, the touched suites gain no red.Performance
Blacksmith minutes per day for the 9 nightly jobs that can now take the GCP label (HQ
build-fleet/data/summary/summary.json,runtime_by_jobweek 2026-W44, mean x n / 7 over theblacksmith | <job>rows):Timers, observers and loops: none added. The group read happens inside #29864's existing bounded loop (180 s cap, 60 s read deadline).
Agent session: agent session
🤖 Generated with Claude Code