Skip to content

[CI] Warm only Linux for compiler recipe changes - #28081

Merged
nwparker merged 2 commits into
mainfrom
nwparker/ci-compiler-cache-role-routing-c0e2b733
Oct 12, 2026
Merged

nwparker merged 2 commits into
mainfrom
nwparker/ci-compiler-cache-role-routing-c0e2b733

Conversation

@nwparker

@nwparker nwparker commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

ELI5

Compiler cache recipe edits currently start five warmers, although only Linux x64 uses that recipe. This change starts just that Linux job for compiler-only edits, leaving more runners available for tests.

What Changed

The existing four platform/fixture jobs move unchanged into a reusable workflow. Static workflow paths select Linux alone for compiler-only main pushes and PRs. Native/global recipes, warmer workflow edits, mixed changes, scheduled repair, and manual runs retain five parallel jobs. Native-only PRs remain unselected. Two cache-policy test files now follow the actual platform caller’s workflow path to the moved Windows, ARM, and fixture jobs; the Linux x64 reader stays in the original workflow. Every original case and assertion remains.

Each physical role has one concurrency group per PR or ref. Compiler-only edits replace Linux work while preserving unaffected native/fixture repairs already running. Windows architectures have separate groups. Cache keys, permissions, actions, installation steps, and budgets stay unchanged.

Why

Static routing removes four redundant allocations without adding a runner to detect changed paths. Keeping existing steps avoids introducing another cache implementation. Independent job concurrency prevents compiler edits from discarding scheduled repair for unrelated cache roles.

Linked Issue

N/A — ongoing maintainer CI capacity work.

Visual Proof

N/A — workflow configuration only; no app interaction changes.

Testing

  • Checked all three YAML files with the existing Linux formatter and installed macOS actionlint.
  • Verified original job bodies are identical except for concurrency, and 992 source-model controls over actual parsed YAML preserve original event selection. Fifteen focused routing controls and four intentional error mutations also passed.
  • Independently reviewed source, cache keys, permissions, caller event context, and concurrency roles.
  • Both corrected cache-policy files passed locally: all 67 original expanded cases, including real Bash fixture checks, plus two targeted lint checks.

Before/after allocation prediction: compiler-only event: 5 → 1 physical runners (four fewer); all other previously selected classes: at most the original five. These are locally verified configuration counts, not hosted before/after timings. Overall runner-second savings and fleet throughput remain unmeasured.

Local accepted qualification commands used 0.089763s wall / 0.094800s child CPU. An initial actionlint attempt found the enclosing worktree instead of the owned candidate; that failed context attempt cost 0.077218s / 0.079035s, was retained, and was corrected by giving only the owned candidate its own Git root. The formatter was not repeated.

The first ordinary wave on head 8cec1c58 failed on an untouched upstream production file exceeding the 300-line limit. Its four attempt-1 runs used 451 assigned runner-seconds / 9 physical allocations, with 581 queue-seconds recorded separately. All five warmer jobs passed; full test qualification was blocked. These costs remain counted.

This head incorporates actual upstream main 9c1d5d2f, which extracted the declaration into a separate module without changing the lint limit. The unchanged three YAML files were reapplied; the PR adds no production edits. A complete copy of that main source passed the actual oxlint check locally: 32,154 files, zero warnings/errors; 7.475840s wall / 15.837510s child CPU. The pinned public CLI ran with the ordinary --format github flags. Previously passed formatter/actionlint/routing checks were preserved.

An earlier local attempt stopped before oxlint: pnpm automatically began dependency preparation through a shared dependency link and rejected the hoist directory. Its 2.358974s wall / 2.151269s CPU cost is retained separately. It rewrote local bin wrappers; the known original oxlint wrapper was restored, and that broader local provider is quarantined. The successful correction used separately copied unchanged public lint tools, with no pnpm, installs, shared dependency link, or library changes. No unchanged CI rerun or waiver was used.

The second ordinary wave on 4f18bdff passed static analysis and all five warmers, but two unit shards failed because the cache-policy tests still looked for moved jobs in the old workflow. This regression came from this change. The correction follows the real platform caller’s uses path, so disconnected or misrouted workflow jobs still fail the contracts. Its four attempt-1 runs used 3,793 assigned runner-seconds / 16 physical allocations, with 67 queue-seconds separate. Across both terminal PR waves: 4,244 runner-seconds / 25 allocations; 648 queue-seconds separate. These costs remain counted.

The two-file correction was formatted once (0.081830s wall / 0.021760s CPU). Its two targeted lint commands and all 67/67 tests passed in 1.742304s wall / 2.163381s child CPU on a healthy independent local provider, using the current workflow/action readers and stock Bun configuration, isolation, six setups, and four-worker limit. All source overlays were restored and owned process groups closed; the quarantined provider was not used. This scoped result does not claim full local root/native readiness. Ordinary CI on corrected head 4ad77dca passed: all five full unit shards, static analysis, relay integration, all five warmers, the Headless detector, and the LoC check. Its five attempt-1 runs used 3,669 assigned runner-seconds / 17 physical allocations, with 1,298 queue-seconds separate. Across all three terminal PR waves, including both failures: 7,913 runner-seconds / 42 allocations; 1,946 queue-seconds separate. There were no reruns, manual dispatches, or manual cancellations.

The PR merged as 845b7232 at 2026-10-12 23:34:58 UTC after complete legacy-main queued and in-progress queries were both empty. All three automatic main push runs also passed: both warmer entrypoints and Headless. They used 457 runner-seconds / 6 allocations; 71 queue-seconds separate. The full known PR plus automatic main lifecycle used 8,370 runner-seconds / 48 allocations; 2,017 queue-seconds separate, including both failed PR waves. Unrelated manual dispatches sharing the workflow SHA are recorded separately and are not attributed to this change.

Review

The moved jobs preserve their original bodies, and the two caller jobs allocate no physical runners. GitHub documents same-commit local workflow reuse and caller-associated context, preserving PR cache-save restrictions. Its job concurrency rules allow one active and one pending job per role. Schedules do not cancel active roles; other events request cancellation of matching active roles. New same-role jobs replace pending jobs. Cache roles share no artifacts or job dependencies.

Agent skill upstream boundary

  • Not applicable; no upstream skill material is copied.

Notes

Merge only after old workflow-level warming for the same main ref is naturally terminal; otherwise old and new concurrency groups cannot coordinate during transition. No manual cancellation is needed. Linux ARM and both Windows jobs are unchanged; SSH/mobile and production behavior are unaffected. Whole-lifecycle runner-second improvement is not claimed from static routing alone. Local verification recorded Git environment only after the first owned-project initialization; the owned Git root and unchanged primary state were verified afterward. Subsequent preparation explicitly guarded inherited Git variables.

Checklist

  • Small testing/CI-only scope; before/after mechanism and rationale explained.
  • No UI proof required; cross-platform and remote scope considered.
  • Local formatter, actionlint, routing controls, and both affected test files passed; corrected-head ordinary CI and automatic main runs passed; all lifecycle costs retained.

@coderabbitai

coderabbitai Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 13f73eb9-d94f-496a-8e5c-e57aacca2d49
📥 Commits

Reviewing files that changed from the base of the PR and between 4f18bdf and 4ad77dc.

📒 Files selected for processing (2)
  • config/scripts/ci-dependency-download-cache.test.mjs
  • config/scripts/linux-package-fixture-cache.test.mjs

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.

📝 Walkthrough

Walkthrough

The change adds reusable cache-warming jobs for ARM Linux, Windows, and Linux package fixtures. A path-filtered workflow delegates to those jobs. The existing warmup workflow expands its path filters, moves concurrency to the Linux x64 job, and calls platform warmups for scheduled or manually dispatched runs.

Priority: ⬇️ Low

Merge Risk: ⚪ Minimal · up to 4ad77

Compiler-only changes warm Linux alone while the other intended events retain platform warming. The one-time old/new overlap may duplicate cache work, but does not replace cache entries or fail warmer jobs; no material merge-blocking risk was identified.

Pre-merge checks · Passed 5
Passed Passed checks (5 passed)
Check name Status Explanation
Description check Passed The description follows the required structure and provides clear scope, rationale, testing details, visual-proof status, review notes, and checklist coverage. The maintainer-specific Linked Issue exc…
Title check Passed The title is concise, specific, and accurately identifies the primary change: routing compiler recipe changes to Linux-only cache warming.
Docstring Coverage Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 2…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@nwparker
nwparker force-pushed the nwparker/ci-compiler-cache-role-routing-c0e2b733 branch from 8cec1c5 to 4f18bdf Compare October 12, 2026 22:32
@nwparker
nwparker merged commit 845b723 into main Oct 12, 2026
36 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant