Skip to content

ci(release): publish a signed Intel macOS DMG - #1825

Open
matt2e wants to merge 1 commit into
mainfrom
ci/macos-intel-dmg
Open

matt2e wants to merge 1 commit into
mainfrom
ci/macos-intel-dmg

Conversation

@matt2e

@matt2e matt2e commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Publishes a signed, notarized Intel macOS DMG (Buzz_<version>_x64.dmg) and updater archive next to the Apple Silicon one in every desktop preview. Intel installs also get a darwin-x86_64 entry in the preview updater feed. Buzz 0.X shipped an Intel build (block/buzz release-macos-x64), but buzz-app only had the arm64 job, so Intel users (e.g. 2020/2021 Intel Macs) had nothing to install.

  • release.yml: the macOS build job is now a matrix over aarch64-apple-darwin / x86_64-apple-darwin. Both legs build with --target, sign and notarize through the same action, and check that the app executable, goose-acp and buzz-agent-command match the leg's architecture.
    • Each leg also checks that its app executable embeds the updater key and endpoint. Promotion only inspects the arm64 executable, so without this a broken x64 build could reach the feed.
    • The build step fails fast if the selected Rust lacks the target's standard library.
    • publish verifies and assembles both macOS artifacts. promote_preview downloads and verifies the x64 updater archive too.
    • The legacy buzz-foundation executable fallback in promotion is gone: no preview with that name can be promoted any more, because none has an x64 archive.
  • Cross-compiling: Hermit's Rust installs only the host's (arm64) standard library, and pnpm 11 has no darwin-x64 build, so an Intel runner isn't an option either. The x64 leg installs the same pinned Rust release through rustup with the x86_64-apple-darwin std, the same way the Windows job selects the pin.
  • Feed/retention: scripts/preview-feed.mjs and scripts/prune-preview-releases.mjs gain darwin-x86_64 → Buzz_<version>_x64.app.tar.gz.
  • tauri.conf.json: sets bundle.macOS.minimumSystemVersion to 10.15, so Intel Macs on older macOS get the system's "requires a newer macOS" message instead of a crash. We previously inherited Tauri's default 10.13. Apple Silicon is unaffected: its floor is 11.0 either way.
  • README and docs/releases.md now list the Intel DMG.

Validation

  • I rebuilt with minimumSystemVersion: 10.15. The Intel Info.plist now says LSMinimumSystemVersion 10.15, and Buzz links with minos 10.15 (Tauri passes it to the cargo build). The sidecars keep a 10.12 floor, which is below the launch gate.
  • Both sidecars from the Intel DMG run under Rosetta: goose-acp --version prints goose-acp 1.56.0, and buzz-agent-command gives its expected usage error. I didn't launch the app itself, so my installed Buzz profile wasn't touched.
  • A local x86_64 cross-build (pnpm tauri build --ci --no-sign --bundles dmg --target x86_64-apple-darwin, Rust 1.98.1 plus the official x86_64 std) produced Buzz_0.7.0_x64.dmg (35 MiB). lipo -archs shows x86_64 for Buzz, goose-acp and buzz-agent-command, and none of them link non-system libraries.
  • node --test passes for desktop-release, preview-feed, prune-preview-releases and packaging (21/21). New coverage: a missing Intel artifact blocks publication, and there are assertions on the matrix and on --target. On eb441539, the full node --test tests/integration/*.test.mjs run gives 228/229. The one failure, macOS launchers preserve icon… in worktree-icon.test.mjs, fails the same way on a clean origin/main (10039529).

Not yet validated / rollout notes

  • CI: the signing/notarization path only runs on main, so the first scheduled run after merge is the first real signed Intel build. Candidate-only runs don't build macOS.
  • No Intel hardware run yet: nobody has launched the app on an Intel Mac. Lucas Isaza, who raised this, has a 2021 Intel Mac and could try the first build.
  • Promotion right after merge: the promotion gate now requires an x64 archive, so previews published before this change can no longer be re-promoted. The first post-merge preview has to publish successfully before promotion works again; once it is live, rollback protection already blocks promoting older previews.
  • CI cost: one more macOS job per run. The arm64 rust-cache key changes, so the first run is a cold build for both legs.

🤖 Generated with Claude Code

@matt2e
matt2e requested a review from a team as a code owner October 28, 2026 14:22

@kalvinnchau kalvinnchau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Two release compatibility findings; details inline.

Comment thread .github/workflows/release.yml
Comment thread src-tauri/tauri.conf.json Outdated
"macOS": { "entitlements": "entitlements.plist" },
"macOS": {
"entitlements": "entitlements.plist",
"minimumSystemVersion": "10.15"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 [P2] Align the Intel minimum OS with the frontend WebKit requirements

The 10.15 gate admits Catalina, whose latest WebKit is Safari 15.6.1, but Vite 8's default build target here includes Safari 16.4 and the frontend uses Tailwind 4 plus color-mix(), which require newer WebKit. Thus an Intel Catalina installation passes the OS gate despite unsupported frontend features. The source compatibility mismatch is established; exact Catalina rendering/JS failure was not exercised. Raise and document the minimum to a supported OS/WebKit combination (macOS 11 with sufficiently updated WebKit is the proposed floor), or explicitly support and test the older frontend target; lowering only the JS target does not address Tailwind's requirements.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account.

  • P1: The existing Hermit/rustup finding remains applicable. At this head, the affected compilation is now buzz-agent-command; the outer target-library check still does not cover the nested compiler. Preserve an absolute rustup compiler selection through the command chain and validate that path.
  • PR material: Correct the 10.15 minimum-OS claim and distinguish historical validation from this revision. The unchanged Tauri configuration requires macOS 12.0, and the bundled Goose pin is now 1.57.0.
  • Optional docs: docs/releases.md:66–68 should distinguish arm64 verification at promotion from both macOS architectures’ build-time checks.

Rocket, Mantis and Groot completed independent lanes. Head 59b15f118f6383c52601b3baabdeb7a98d82696f; base e210c8a472cc49ee7c0b49b62bfad10fd5ef4c8e. Source-only: no builds/tests or app execution. Required CI passed in the snapshot; signed Intel packaging, install/update behavior and release-job cost remain unverified.

Build the macOS preview job as an aarch64/x64 matrix. The Intel leg
cross-compiles x86_64-apple-darwin on the Apple Silicon runner with the
pinned Rust release from rustup, since Hermit's Rust ships only the host
standard library. Both legs are signed, notarized and verified, and the
preview feed gains a darwin-x86_64 updater entry.

Co-authored-by: Jitter <2b2e6415e748c35180847a37aadae06a11e30dddc76b784e7fd9354c4eb42e7a@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Matt Toohey <contact@matttoohey.com>
@matt2e
matt2e force-pushed the ci/macos-intel-dmg branch from 59b15f1 to 517c523 Compare October 30, 2026 00:33
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.

3 participants