-
Notifications
You must be signed in to change notification settings - Fork 1.1k
perf(ci): give the heavier test lane the larger runner - #6080
Conversation
`test-ui` and `test-node` hold their runners the wrong way round relative to the work they carry. The ui lane runs ~5x the node lane on CI, but ui sits on `2-core-ubuntu-arm` while node holds `4-core-ubuntu`. Run 34000689684 (main, 2026年09月06日, success): test-ui 14m52s 2-core-ubuntu-arm (suite step 834s) test-node 3m18s 4-core-ubuntu (suite step 165s) Reproduced on 33994177354 (926s/189s) and 33980770638 (974s/194s), and on deploy runs 33980455596 and 33952374356. The lane comment cites a local measurement in the other direction — node 570s against ui 244s. That comparison is not reproducible here. facebook#6051's validation notes record the node suite as run "with bounded workers" while the ui suite carries no such note, and node is the project whose cost is per-assertion `node bin/astryx.mjs` spawns under the forks pool (vitest.config.ts) — the work a bounded pool serializes most. Unbounded on CI the node lane finishes in 165s while also paying the cold `ensureCoreBuilt()` core build that a warm local tree skips, so the local run had strictly less work and still took 3.5x longer. deploy.yml carried the same allocation and is swapped with it. `.github/scripts/ci-test-routing.test.mjs` passes unchanged (17/17): both labels are already in KNOWN_RUNNERS and no assertion binds a lane to a runner.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Han5991
commented
Sep 6, 2026
MeasuredThis PR's own CI run against a
Both lanes green. What it settles
Headroom. The cost, stated plainlyThis is not free. Weighting each lane by its cores:
+8.3% core-seconds for −41.6% gate wall clock. If runner-seconds are the binding constraint rather than latency, that trade is arguable and I'd rather it be argued explicitly than hidden. Follow-up this makes smallerSharding Caveatn=1 on each side. The baseline is consistent with the wider sample I looked at ( |
PR Analysis Report
📚 Storybook Preview
View Storybook for this PR
GitHub Pages may take up to a minute to hydrate after deploy.
🧪 Sandbox Preview
View Sandbox for this PR
GitHub Pages may take up to a minute to hydrate after deploy.
No new or modified components detected.
Bundle Size Summary
No component packages changed.
Accessibility Audit
Status: No accessibility violations detected.
Generated by PR Enrichment workflow | Storybook | Sandbox | View full report
Why
test-uiandtest-nodehold their runners the wrong way round relative to the work they carry.test-ui2-core-ubuntu-armtest-node4-core-ubuntuRun 34000689684 (
main, success). Reproduced on 33994177354 (926s/189s) and 33980770638 (974s/194s), and on deploy runs 33980455596 and 33952374356.The 4-core box is under the three-minute lane. The fifteen-minute lane — the one nearest the ~20 minute wall the lane comment itself describes — is on the 2-core arm box.
The number that put it there
The comment introduced with the lane split says:
That comparison does not appear to be like-for-like. #6051's own validation notes record the node suite as run "with bounded workers"; the ui line carries no such note. And
nodeis precisely the project that a bounded pool penalises —vitest.config.tsdocuments that it runs on the forks pool because CLI tests callprocess.chdir(), and that "several CLI suites spawn a freshnode bin/astryx.mjsper assertion (real process boundary)".The CI numbers are hard to reconcile with 570s any other way: unbounded, the node lane finishes in 165s while also paying the cold
ensureCoreBuilt()core build that a warm local tree skips (build-theme.data-tokens.test.mjs:117— "ensureCoreBuilt() only checks that dist exists"). The local run had strictly less work and still took 3.5x longer.I've rewritten the comment to state what CI measures, and to record why the local figure isn't comparable.
What this changes
Four
runs-on:values, two in each workflow.deploy.ymlcarried the same allocation.Nothing else moves. In particular the repo-wide guardrail steps stay on
test-ui, so the "they ride the LIGHTER lane" claim is now simply corrected in place rather than acted on — they cost ~18s of an 892s job, and moving them is a separate change that isn't worth coupling to this one.Verification
.github/scripts/ci-test-routing.test.mjspasses unchanged — 17/17. Both labels are already inKNOWN_RUNNERS(:47-52) and no assertion in the file binds a lane to a runner, which is why this needed no test edit.The real verification is this PR's own CI run: it reports the swapped allocation directly, against the numbers above.
What this does not do
This does not close #4339's original criterion. On run 34000689684
test-uifinished 385s afterbuild-sandbox, and the workflow ended 17s later — the test lane is still the critical path, just no longer a re-push casualty. Subdividinguiis the next lever and is deliberately not in this PR; astrategy: matrixinside the existingtest-uijob passes all 17 contract cases, so it can land separately on measured numbers.Filed because the headroom is thin:
test-uiis at 14m52s against a wall its own comment puts at ~20 minutes, and the ui project went 439s → 834s in roughly three weeks.