Repository navigation
perf(ci): bind the warm job's install list, which is worth 163 of its 171 seconds - #621
Conversation
CLOUD-840 Every PR compiles the Rust tree cold: the caches exist, are byte-identical across PRs, and no PR can read another's — so `windows` writes 182MB per run that nothing ever restores
Why CLOUD-813 measured Measured 2026-08-21 from the Actions cache API, not inferred from step timings:
This reverses a recorded decision, and that decision named the conditions. CLOUD-176 considered base-branch warming and recommended against it: about 178s of job-time per merge to save about 60s on one pull request's first run, "roughly 3× the job-time it saves." That costing lists four legs — It also wrote down when to revisit, and both conditions now hold:
Recording the reversal rather than quietly re-filing, because CLOUD-176's recommendation is written down and someone will find it. Refinement — Ready (warm the base branch, and get under the cap so the warm entry survives)
Acceptance
|
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
Included review availability: Your plan provides up to 10 included reviews per hour; 7 remain after this review. 📝 WalkthroughWalkthroughThe release-plz workflow now disables mise automatic tool installation during task execution and ChangesRelease-plz mise configuration
Estimated code review effort: 1 (Trivial) | ~5 minutes Merge Risk: ⚪ Minimal · up to This PR makes a localized CI workflow change to avoid unnecessary tool installation during cache setup. No actionable merge-blocking risk remains beyond normal checks and review. Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
b3c2210 to
671a639
Compare
… 171 seconds CLOUD-840's warm cycle costs 358s and its `rust-cache` step is 171s of that, which read as the cache being slow on Windows. It is not. From the step's own log, second warm cycle: 15:52:07 step starts 15:54:50 "Cache Configuration" printed <- 163s of silence 15:54:50 Cache hit 15:54:51 -> 15:54:54 download 182MB <- 2.7s, 47-103 MB/s 15:54:54 -> 15:54:58 tar extract <- 3.6s The cache work is about eight seconds. The rest is rust-cache's pre-flight, which shells out to `cargo` and `rustc` to compose its key before printing anything — and with mise's auto-install on, every one of those calls can enter the install/verify path. `rust.yml`'s `windows` job restores the identical 182MB entry in 12s. The only difference between the two jobs is the two variables this commit adds. This is CLOUD-812 in a third workflow, and the regression is mine. That issue set both variables in `ci.yml`, `commit-lint.yml` and `zizmor.yml` and stopped there, correctly: `release-plz.yml` had no job that ran cargo. Adding one without them re-opened it two commits later. `ci-tools-check` structurally cannot catch this. Its absence direction is scoped to `pull_request` workflows — the right call for the property it enforces, since a push-triggered workflow stands in for nothing in `verify` — but it means a cargo job on a push workflow can run with auto-install on and nothing goes red. Filed rather than widened here; widening a measured, mutation-gated property to cover a second case is not a change to make in passing. What this does to the trade, stated as a prediction rather than a result: the warm cycle should fall from 358s to roughly 195s, about 6.5 billed minutes, against the 4.4 a PR's first run saves. Still net negative, but around two billed minutes per merge rather than 7.6 — which is a different decision. The measurement is the next merge's warm cycle. Refs: CLOUD-840
671a639 to
092e2d8
Compare
|
|
/fast-forward |



The warm cycle CLOUD-840 landed costs 358s, and its
rust-cachestep is 171s of that — which read as the cache being slow on Windows. It isn't.From the step's own log, second warm cycle:
The cache work is about eight seconds. The rest is rust-cache's pre-flight, which shells out to
cargoandrustcto compose its key before emitting a line — and with mise's auto-install on, each of those calls can enter the install/verify path.rust.yml'swindowsjob restores the identical 182MB entry in 12s. The only difference between the two jobs is the two variables this adds.The regression is mine
CLOUD-812 set both variables in
ci.yml,commit-lint.ymlandzizmor.ymland stopped there — correctly, sincerelease-plz.ymlhad no job that ran cargo. Adding one without them re-opened it two commits later.A gap this exposes, filed rather than widened
ci-tools-check's absence direction is scoped topull_requestworkflows. That is the right call for the property it enforces — a push-triggered workflow stands in for nothing inverify— but it means a cargo job on a push workflow can run with auto-install on and nothing goes red. Widening a measured, mutation-gated property to cover a second case is not a change to make in passing, so it gets its own row.What it does to the trade
Stated as a prediction, not a result: the warm cycle should fall from 358s to roughly 195s, ~6.5 billed minutes, against the 4.4 a PR's first run saves. Still net negative — but about two billed minutes per merge rather than 7.6, which is a different decision: 2 billed minutes to take 133s off every PR's critical path is defensible where 7.6 was not.
The measurement is the next merge's warm cycle, and it decides keep-or-revert.
Also recorded, not acted on
Of the warm job's 150s compile, ~127s is compiling
battenitself — and rust-cache runscache-workspace-crates: false, so that output is discarded from the cache the job exists to fill. Only the dependency artifacts matter, and they are done beforebattenstarts. There is no first-class cargo flag for "dependencies only", so if the trade is still marginal after this, that is where the next ~2 billed minutes are.Verification
ci-tools-check,ci-local-parityandzizmorgreen locally.DO-NOT-CLOSE CLOUD-840
Generated by Claude Code
Summary by CodeRabbit