Skip to content

feat(release): dual-arch builds (universal + arm64) with per-lane feeds - #72

Merged
bbjansen merged 1 commit into
mainfrom
feature/dual-arch-release
Oct 30, 2026
Merged

bbjansen merged 1 commit into
mainfrom
feature/dual-arch-release

Conversation

@bbjansen

Copy link
Copy Markdown
Owner

What

Ship two separately auto-updating artifacts per release, and slim them down.

  • Build once (universal via xcodebuild), derive the arm64 artifact by lipo-thinning the products — no second ~8-min build.
  • Two lanes, two feeds: universal → appcast.xml (unchanged, so existing v0.1.7 installs keep updating); arm64 → appcast-arm64.xml (derived from SIMPLETON_SU_FEED_URL, no new variable). Each bundle embeds its own feed, so a copy only ever auto-updates within its own lane.
  • Slim: -enableCodeCoverage NO (the auto-generated SPM scheme was instrumenting every compile with -profile-generate/-fcoverage-mapping — hence __LLVM_COV + a runtime .profraw) plus a symbol strip. Universal ~202 MB → ~100 MB; arm64 ~50 MB.
  • Factor the sign → notarize → EdDSA → publish logic into scripts/ci/publish-lane.sh (called once per lane); make-app-bundle.sh gains SIMPLETON_APP_OUT to emit both bundles in one run.
  • Attach both zips to the GitHub release; docs/release-and-updates.md updated.

Verification (local, against real published products)

  • Both bundles assemble; universal is fat (x86_64 arm64), arm64 is arm64-only.
  • Each carries the correct SUFeedURL (appcast.xml vs appcast-arm64.xml) and the @executable_path rpath.
  • Strip alone took the universal binary 202 MB → 102 MB; arm64 bundle ~52 MB.
  • Both launch and stay alive with no crash.
  • actionlint + shellcheck clean.

Coverage-off is verified by a new CI build-step diagnostic (size -m checks for __LLVM_COV) since it's a build-time setting.

After merge

Cut v0.1.8 → confirm both artifacts attach, both appcasts publish, and both download+launch — then promote to Latest.

Ship two separately auto-updating artifacts per release and slim them down.

- Build once with xcodebuild (universal), derive the arm64 artifact by
  lipo-thinning the products — avoids a second ~8-min build.
- Two lanes, two Sparkle feeds: universal → appcast.xml (unchanged, so
  existing installs keep updating), arm64 → appcast-arm64.xml (derived
  from SIMPLETON_SU_FEED_URL; no extra variable). Each bundle embeds its
  own feed so a copy only auto-updates within its lane.
- Slim the binary: pass -enableCodeCoverage NO (the auto-generated SPM
  scheme instruments every compile with -profile-generate/-fcoverage-
  mapping, bloating the binary and dropping a .profraw at runtime), and
  strip the executable in make-app-bundle. Universal ~202 MB → ~100 MB;
  arm64 ~50 MB.
- Factor sign → notarize → EdDSA → publish into scripts/ci/publish-lane.sh,
  called once per lane; make-app-bundle gains SIMPLETON_APP_OUT so it can
  emit both bundles in one run.
- Attach both zips to the GitHub release; docs updated.

Verified locally end-to-end against real products: both bundles assemble,
carry the right arch + feed URL + rpath, and launch without crashing.
@bbjansen
bbjansen merged commit fda515c into main Oct 30, 2026
5 checks passed
@bbjansen
bbjansen deleted the feature/dual-arch-release branch October 30, 2026 18:08
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.

2 participants