Skip to content

ci: notarize macOS binaries via GoReleaser + quill#18

Open
mfacenet wants to merge 1 commit into
mainfrom
chore/macos-notarization
Open

ci: notarize macOS binaries via GoReleaser + quill#18
mfacenet wants to merge 1 commit into
mainfrom
chore/macos-notarization

Conversation

@mfacenet
Copy link
Copy Markdown
Contributor

@mfacenet mfacenet commented Jun 2, 2026

What

Adds cross-platform macOS code signing + notarization to the release pipeline using GoReleaser's quill-backed notarize.macos block — no macOS runner required, the existing ubuntu-latest job is reused.

  • New notarize.macos block in .goreleaser.yaml, placed pre-archive so the signed+notarized binary is what gets tarred, checksummed, SBOM'd, and cosign-signed.
  • Five Apple secrets mapped into the GoReleaser step's env: in release.yml.

Safe to merge before secrets exist

The block is gated on enabled: '{{ isEnvSet "MACOS_SIGN_P12" }}'. With the secrets unset (current state, forks, local/snapshot builds), notarization is silently skipped and the release works unchanged.

Required secrets (add to repo before they take effect)

Secret Value
MACOS_SIGN_P12 base64 of the Developer ID Application .p12
MACOS_SIGN_PASSWORD the .p12 export password
MACOS_NOTARY_ISSUER_ID App Store Connect Issuer ID (UUID)
MACOS_NOTARY_KEY_ID App Store Connect Key ID
MACOS_NOTARY_KEY base64 of the App Store Connect .p8

Follow-up (not in this PR)

The xattr quarantine-strip postflight in the cask is intentionally kept until a notarized release is verified (cut an RC tag, confirm quill's notarization succeeds), then removed separately. Removing it before notarization is live would reintroduce the Gatekeeper prompt.

Validation

goreleaser check passes on 2.15.4.

Note

Notarized artifacts are bare binaries in .tar.gz, which can't be stapled (only bundles/dmg/pkg). Gatekeeper does an online check on first run — fine for brew-installed CLIs.

Add a cross-platform notarize.macos block (quill-backed, no Mac runner
needed) to the GoReleaser config and wire the Apple signing secrets into
the release workflow. Gated on MACOS_SIGN_P12, so releases without the
secrets configured are unaffected.

The xattr quarantine-strip postflight in the cask is intentionally kept
until a notarized release is verified, then removed in a follow-up.
Copilot AI review requested due to automatic review settings June 2, 2026 22:17
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR extends sting’s release pipeline to produce macOS-signed and notarized CLI binaries using GoReleaser’s quill-backed notarize.macos support, while keeping the release job on ubuntu-latest and gating notarization on the presence of signing credentials.

Changes:

  • Added a GoReleaser notarize.macos configuration to code sign and notarize the sting macOS artifact before packaging.
  • Wired required Apple signing/notary secrets into the GoReleaser GitHub Actions step environment so the notarization flow can run in CI when configured.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
.goreleaser.yaml Adds the notarize.macos block (enabled via env gating) to sign + notarize the macOS build artifact.
.github/workflows/release.yml Exposes the Apple signing/notary secrets to the GoReleaser action step via env:.

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