perf(release): reuse CI's GhosttyKit cache and build arm64-only#117
Merged
Conversation
The auto-ship lane rebuilt GhosttyKit from source on every ship (~14 min) because the prebuilt xcframework release has never actually published — the cross-repo upload silently exits 0 when its token is empty, so there are zero releases on the ghostty fork despite the pinned checksums. Instead of depending on that broken pipeline, release.yml now restores the same xcframework cache CI already builds (same ghostty-SHA key, same commit via workflow_run), and only falls back to the download/source-build on a cache miss. Also drop the Intel slice: the shipped Mac app and the GhosttyKit build are now arm64-only (native), halving the compile when it does run. Remote-daemon server binaries stay cross-platform. The ranlib-refresh workaround now matches whichever macos slice exists so it keeps running on the arm64 path.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this does
Ships get faster. Every push to main currently takes ~45 min to build and publish, and the biggest chunk of that (~14 min) is rebuilding the Ghostty framework from source on every single ship — for no reason. This makes the release reuse the framework CI already built, and drops Intel Mac builds since we're Apple Silicon only now.
Rough effect: the auto-ship lane goes from ~45 min to ~15-18 min, and the release job itself from ~25 min to ~8-9 min.
Why the framework was rebuilding every time
The prebuilt-framework release has never once published.
build-ghosttykit.ymluploads to the ghostty fork using a token that resolves empty, and when it's empty the upload step just silently exits 0 and reports success. So there are zero releases on the fork despite 175+ green runs, the pinned checksums point at nothing, anddownload-prebuilt-ghosttykit.sh404s and source-builds every time.Rather than chase the missing token (needs repo-admin), this sidesteps it: CI already caches the built framework keyed by ghostty SHA, and the release runs on the exact same commit right after CI. So the release just restores that cache. Cache miss falls back to today's behavior, so nothing new can break.
Summary
release.yml: add anactions/cachestep forGhosttyKit.xcframeworkkeyed identically to CI (ghosttykit-v2-<hash>); the download/source-build step now only runs on a cache miss.release.yml: build the Release appARCHS="arm64"(wasarm64 x86_64); the arch-verify step now asserts single-arch arm64.build-ghosttykit.yml+ensure-ghosttykit.sh:-Dxcframework-target=native(arm64-only) instead ofuniversal.ensure-ghosttykit.sh: the Xcode-26 ranlib-refresh workaround now matches whichever macos slice exists (macos-arm64ormacos-arm64_x86_64) so it keeps running on the arm64 path.test_ci_universal_release_settings.sh: inverted to assert arm64-only (also swapped a stalesetup.shcheck toensure-ghosttykit.sh, the file that actually carries the flag — that check was silently passing on nothing before).What's intentionally not here
Follow-up (not this PR)
The dead prebuilt-publish pipeline is still there, now bypassed. Two ways to resolve it later: add the
GHOSTTY_RELEASE_TOKENsecret and make the upload fail loudly instead of lying, or deletebuild-ghosttykit.yml+ the hand-maintained checksums entirely and go cache-only.Test Plan
ruby -ryamlloads both workflow filesbash -non the touched scriptstests/test_ci_universal_release_settings.shpassesarm64 x86_64/xcframework-target=universalrefs remain