Skip to content

ci: notarize macOS binaries via GoReleaser + quill#240

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

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

Conversation

@mfacenet
Copy link
Copy Markdown
Collaborator

@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.16.0.

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

Adds optional macOS code signing + notarization to the GoReleaser-driven release pipeline using the notarize.macos (quill-backed) configuration, reusing the existing ubuntu-latest release job and wiring required Apple secrets into the GoReleaser step.

Changes:

  • Adds a new notarize.macos block to .goreleaser.yaml to sign + submit macOS binaries for notarization.
  • Exposes Apple signing/notary credentials to the GoReleaser GitHub Action step via workflow env.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
.goreleaser.yaml Adds GoReleaser notarization configuration for macOS artifacts.
.github/workflows/release.yml Passes macOS signing/notary secrets into the GoReleaser release step.

Comment thread .goreleaser.yaml
# SBOM'd, and cosign-signed.
notarize:
macos:
- enabled: '{{ isEnvSet "MACOS_SIGN_P12" }}'
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