ci(e2e): start builds from main's DerivedData so test-only changes skip the app compile - #14016
Conversation
…ip the app compile The E2E build adopts the newest DerivedData a main run of test-e2e.yml published, then restores the recorded modification time onto every input whose content is unchanged. Changed inputs keep their checkout time, so Xcode rebuilds only what differs. Main runs of contained revisions publish their DerivedData as a 3-day artifact. Every step is optional: any miss or failure is today's cold build. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
|
Warning Review limit reachedNext included review available in 17 minutes. View limit detailsLimit details: You’ve used all 10 included reviews currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Repository: manaflow-ai/cmux/.coderabbit.yaml Review profile: ASSERTIVE Plan: Advanced Run ID: 📒 Files selected for processing (8)
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. Comment |
|
All contributors have signed the CLA ✍️ ✅ |
…ree links Review of the warm DerivedData adoption found a changed input could keep an archive's older mtime (GhosttyKit, SwiftPM binaries) and escape a rebuild. Replay now stamps every changed or new input with the current time. Adoption also skips archives over 12 GiB, times out after 10 minutes, treats any error as a cold build, accepts absolute links that stay inside DerivedData, and ignores fresh-checkout inode changes. The helper joins the product identity inputs, and publishing requires a recorded input manifest. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Independent review (a separate agent, read-only, at
Trust, tar bounds, — Dulcinea g1 🎐 |
06c2101 ci: route streamed validation by capability instead of by lane name (manaflow-ai#14002) 1773c54 ci(e2e): start builds from main's DerivedData so test-only changes skip the app compile (manaflow-ai#14016) c890374 ci: pin the nightly runner guards to the whole expression (manaflow-ai#13997) 8abd2e9 ci: flag condition polls bounded by a Task.yield() count (manaflow-ai#14019) e4ca672 ci(ios): record the cmux.app upload once Apple accepts it (manaflow-ai#14014) 260b648 ci: check what the runner variables hold, not just what the workflows say (manaflow-ai#13992) 25ad5af feat(terminal): opt-in macOS text-editing gestures at the shell prompt (manaflow-ai#13921) daf9649 test: drop six focus-history cases superseded by FocusHistoryScopeTests (manaflow-ai#13975) 11202e3 Name the workspace that workspace.reorder could not resolve (manaflow-ai#13961) 2a4f3f6 fix(fork): make the fallback refresh await its own queued validation (manaflow-ai#13960) 4b82298 ci: let test-depot run one app-host test by selector (manaflow-ai#14001) 5d1ecb8 test: give each drained write its own deadline in the short-chunks reader test (manaflow-ai#13999) # Conflicts: # .github/workflows/ci-guards.yml # .github/workflows/ci-health-report.yml # .github/workflows/ios-appstore-upload.yml # .github/workflows/ios-streamed-validate.yml # .github/workflows/iroh-release-gate.yml # .github/workflows/nightly.yml # .github/workflows/test-depot.yml # .github/workflows/test-e2e.yml
* ci: seed test-e2e's warm DerivedData from main every 6 hours #14016 lets a test-e2e.yml build start from DerivedData that a main-contained dispatch published, so a test-only change recompiles only the tests. Only such a dispatch publishes it, and focused dispatches test pull request revisions, so none ever did: builds report "no-main-derived-data" and compile the whole app from empty DerivedData (e.g. 12.4 min of build for a 36 ms suite in run 35939043846). Dispatch test-e2e.yml on main's HEAD with one fast suite every 6 hours, skipping a SHA that already has a seed dispatch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ci: make seed runs compile, and drop a half-adopted DerivedData A seed dispatch could adopt an exact product, skip the compile, and so publish nothing; seed dispatches now skip product reuse. A step timeout in "Adopt main's DerivedData" kills the restore before its own cleanup, so the compile could start on a half-extracted tree; a failed adoption now clears the DerivedData first. The seed dedupe now looks back 300 runs (50 covered about two hours) and retries only runs that never finished. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A
test-e2e.ymldispatch that changes one test file recompiles the whole app host. The build starts from an empty DerivedData, and a fresh checkout makes every source file newer than any earlier build. In run 35868678521 the compile took 14 min and the selected test ran for 18 s. CLAUDE.md's "Reading CI cost" puts the app scheme at 691 of the 735 sbuild-for-testingspends.With this change, the build job adopts the newest DerivedData (build database, intermediates and products) that a
mainrun of this workflow published. It then restores the recorded modification time onto every input file whose content is byte-identical. Changed files keep their checkout time, so Xcode rebuilds only what differs. Correctness does not depend on how far the adopted DerivedData is from the selected revision; the distance only affects compile time.mainwhose selected revision main already contains publishes its DerivedData, minusLogsandIndex.noindex, as a 3-day artifact. This is the trust rule the compilation cache already uses. It is an artifact rather thanactions/cachebecause the repository cache is at 10.5 GB, over its 10 GB cap.workflow_dispatchruns oftest-e2e.ymlonmain, and archive members or links that escape DerivedData are rejected. The key is the existing compilation-cache fingerprint: Xcode version plus workspace and DerivedData paths, which is what the intermediates embed.test_ci_self_hosted_guard.shalongside the compilation-cache steps. A miss, expired artifact or bad archive leaves an empty DerivedData, which is today's cold build.Tradeoffs. Adding steps to the build job changes the E2E product recipe fingerprint, so exact-product reuse misses once after merge. Archive size and transfer time are not measured yet; publishing is skipped above 12 GiB. The first producer appears when someone dispatches
test-e2e.ymlon a main-contained revision (for exampleref=main).Validation.
tests/test_e2e_warm_derived_data.py(5 tests, registered in the linux-guard lane) covers: unchanged inputs take the producer's time and changed or new inputs do not; DerivedData and.gitare not inputs; only main dispatches of this workflow are trusted; escaping archive members are rejected. All 137 linux-guard tests pass locally and actionlint is clean. Not yet verified on a Mac: that Xcode 26 in fact rebuilds only the changed test file from an adopted DerivedData. The cost report in the build summary now records the adoption, so the first two dispatches after merge (oneref=mainproducer, then a test-only branch) measure it.— Dulcinea g1 🎐
run: run_cmux_main_app_host_baseline_inherited_failures_blocking_full_ci_20260923_576a13f4
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.Summary by cubic
Starts E2E builds from the newest DerivedData a
mainrun oftest-e2e.ymlpublished, so a change to one test file rebuilds only that test instead of the whole app host. The build job adopts the archive, restores the recorded modification time onto every input whose content is byte-identical, and stamps changed or new inputs with the current time so they cannot keep an archive's older mtime and escape a rebuild. A miss, expired artifact, or bad archive falls back to today's cold build.Tradeoffs and validation. Exact-product reuse misses once after merge because the added steps change the E2E product recipe fingerprint. Publishing is skipped above 12 GiB, requires a recorded input manifest, and archive transfer time is not measured yet. The adopt step times out after 10 minutes.
tests/test_e2e_warm_derived_data.pycovers unchanged, changed, and new inputs, trust rules, archive escape rejection (including absolute in-tree links), and all 137 linux-guard tests pass locally. Not yet verified on a Mac that Xcode 26 rebuilds only the changed test file from an adopted DerivedData.Written for commit eadec1a. Summary will update on new commits.