Repository navigation
ci(nightly): shorten the release-pool signing chain (about 18 to 15 min to publish) - #33554
Conversation
signer-build no longer waits for the runner pick; signer-app checks out the build tree sparse and starts the app's notarization upload itself, beside its artifact upload, so signer-app-notary goes away; signer-dmg waits for Apple's Accepted answer before signing the DMG and reads only the app's Info.plist for the appcast instead of the whole signed app; launch-smoke-nightly reads the unsigned DMG in parallel ranges first. Both notarizations, the helper's, the legacy-identity chain, notary_submit and the overtaken gate stay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-bf341308e0feeab87f14
|
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)
Shipped in:
|
|
Review (codex gpt-6.1-sol high): SHIP at 3ffd4a7 No blocking findings. The helper, app and DMG notarization order, the overtaken gate, the legacy jobs, the sparse-checkout dependencies and the digest checks remain intact. Release environments, permissions and runner routes are unchanged. 140 scoped tests passed, plus YAML parsing and shell syntax checks. Follow-ups:
|
|
Found 2 test failures on Blacksmith runners: Failures
|
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Summary
Leo, 2026-11-03: "the signing/publishing don't require 30 cores". The NEXT nightly's release-pool signing chain is mostly waiting, not work. In run 41570134320 it took 18.2 min from the end of
build-nightly-app(03:25:28) topublish-nightly's end (03:43:38). The step times show where the waiting is:signer-buildneededpick-nightly-sign-runner, so its hosted pickup and cache restore (43 s) sat between the pick andsigner-app. Nothing in it reads the pick's outputs since ci(nightly): route credentialed signers through trusted Linux set #30081 put it back on the signer route. It now needs onlydecideand builds while the app does.signer-appspent 37 s on a full checkout of the build tree, though it reads onlyscripts/and the top-level entitlements. It now checks out sparse (sparse-checkout: scripts; cone mode keeps the root files).signer-apphad uploaded its artifact andsigner-app-notaryhad been picked up, checked out, and had downloaded and unpacked the app (≈50 s after signing).signer-appnow starts the upload to Apple itself (release-signer/submit-app.sh start) right after packing. It runs in the background beside the artifact uploads, andsubmit-app.sh finishhands the submission id on as an output.signer-app-notaryis gone.signer-dmgdownloaded the whole 355 MB signed app (50 s) only to read its Info.plist for the appcast.signer-appnow hands that Info.plist on as its own small artifact, with its digest as an output, andsigner-dmgchecks it against the digest.launch-smoke-nightlyread the unsigned DMG in one download-artifact stream (205 s). Withsigner-dmgshorter, that would have put it on publish's path. It now reads in parallel ranges first (fetch_run_artifact.py), assigner-dmg-imageand the final-DMG verify already do, with download-artifact as the fallback.The DMG image step stays on a Mac (hdiutil). Verify DMG and the launch smoke already run side by side (#32378).
What stays
signer-staple-app.shpolls Apple for the ticket, which exists only for an accepted submission).signer-dmgadds an explicit Accepted check,release-signer/wait-app-notary.sh, before it signs the DMG:notary-wait, then the notary log'sstatusmust beAccepted. The DMG's own sign, notarize and staple is unchanged.sign-app.sh, helper-first) is untouched.legacy-signer-*jobs are unchanged. They still needsigner-build, which now finishes earlier, so the change can only bring them forward.notary_submit(release signer: wait out Apple notary rate limits instead of failing the nightly #33028).submit-app.shsubmits through it, so a 429 rate limit is still waited out and retried.signer-appstill needspick-nightly-sign-runnerwithovertaken != 'true'.mktemp -d(umask 077) that the script's EXIT trap removes. The background upload owns its own key directory and removes it when the upload ends. No secret, environment or permission changes. Runners are unchanged: GitHub-hosted Ubuntu first, Blacksmith 4 vCPU on a re-run, sotests/test_ci_self_hosted_guard.shneeds no new allowlist line.signer-dmgnever signs, as before.signer-dmg's wait now fails on any answer other than Accepted.nightly.yml goes from 487,267 to 489,623 bytes (cap 490,000).
Performance
Before: run 41570134320's job and step times. After: projected from those same step times; the first NEXT nightly after merge gives the measured number (follow-up comment).
Testing
Run locally with system python3, all passing:
tests/test_nightly_signer_jobs.py(updated:signer-app-notarygone; submit and wait order; Info.plist digest;signer-buildneeds onlydecide; launch smoke's ranged read)tests/test_release_signer_*.py(newAppNotarizationTests: background submit hands on the id; failed upload or missing id failsfinish; wait passes only Accepted; key never on argv or in the signer's env; key dirs removed)tests/test_nightly_sign_runner.py,tests/test_nightly_step_coverage.py,tests/test_workflow_file_size.py,tests/test_ci_signing_keychain_is_deleted_before_bundle_code.py,tests/test_ci_nightly_off_blacksmith.py,tests/test_supplychain_security.py,tests/test_ci_self_hosted_guard.sh, plustests/test_nightly_trusted_routing.py,tests/test_fetch_run_artifact.pyand the other tests that read the signer jobs.tests/test_nightly_universal_build.shfails ("nightly preparation must run on Blacksmith Linux…") identically on baseorigin/feat-cmux-next; it is not from this change.Observed / Not run
signer-app-notarylog.nightly-nextwith the release environment can sign and notarize. The first nightly after merge is the end-to-end check. If the pool path fails,build-sign-notarize-nightly(the macOS signer) still signs that build, as today.Changelog
none
risk: high (release signing, CI)
🤖 Generated with Claude Code
Agent session: agent session
Open in [code]smith · Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Shortens the release-pool signing chain in the nightly workflow, cutting the time from the end of
build-nightly-appto publish from about 18 minutes to about 15 minutes.signer-buildnow needs onlydecide;signer-appchecks out the build tree sparse and starts Apple's notarization upload in the background, so thesigner-app-notaryjob is gone.signer-dmgwaits for Apple'sAcceptedanswer before signing the DMG and reads only the app's Info.plist for the appcast.launch-smoke-nightlydownloads the unsigned DMG in parallel ranges first.Both notarizations stay in order: the Mac still staples the app's ticket before the DMG, and
signer-dmgchecks the Accepted answer before signing. The legacy NIGHTLY-identity chain, the Computer Use helper notarization,notary_submitretries, and the overtaken gate are unchanged.Risk: high (release signing, CI).
Written for commit 1ccc9a8. Summary will update on new commits.