Skip to content

ci(release): sign with Developer ID and notarize the darwin binaries - #48

Merged
bcollard merged 1 commit into
mainfrom
feat/developer-id-signing
Oct 26, 2026
Merged

bcollard merged 1 commit into
mainfrom
feat/developer-id-signing

Conversation

@bcollard

Copy link
Copy Markdown
Owner

Signs release binaries with the Developer ID certificate (team PZARL6555S) and notarizes them, using the same secrets and keychain steps as Pastiche.

Why: a stable team ID that an MDM/EDR allowlist (Kandji, Falcon) can trust across releases, and no Gatekeeper friction on managed Macs. Not a fix for the data path: measured on a Mac with Falcon 8.10 + Kandji, Apple-signed and ad-hoc clients alike reach the lima0 IP and MetalLB VIPs.

Piece What
scripts/sign-darwin.sh Developer ID + hardened runtime + timestamp + entitlement; notarytool submit when NOTARY_* set; ad-hoc when no identity
.goreleaser.yaml post-build hook calls the script
release.yml secret preflight, temp keychain, notary credential check, post-build verification (spctl → "Notarized Developer ID"), workflow_dispatch snapshot run
Makefile make build uses the keychain's Developer ID when present

Verified locally: a Developer ID + hardened-runtime build starts a VM; goreleaser build --snapshot signs both architectures with the team ID and entitlement.

Before the next tag: set the five secrets (same names as Pastiche), then gh workflow run release.yml to test notarization without publishing.

🤖 Generated with Claude Code

scripts/sign-darwin.sh is now the single signing path (Makefile and the
goreleaser post-build hook):

- MARINA_SIGN_IDENTITY set: Developer ID, hardened runtime, secure timestamp,
  virtualization entitlement; with NOTARY_* also set, notarytool submit
  --wait and fail on anything but Accepted (printing the notary log).
- unset: ad-hoc, as before.

release.yml imports the certificate into a temporary keychain (as Pastiche
does), checks the secrets and notary credentials up front, verifies each
binary's team ID, entitlement and Gatekeeper verdict ("Notarized Developer
ID"), and gains workflow_dispatch: a snapshot run that signs and notarizes
but publishes nothing.

make build picks the keychain's Developer ID identity when present.
Verified locally: a Developer ID + hardened-runtime build starts a VM, and
goreleaser's hook inherits MARINA_SIGN_IDENTITY for both architectures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@bcollard
bcollard merged commit f94f5ad into main Oct 26, 2026
1 check passed
@bcollard
bcollard deleted the feat/developer-id-signing branch October 26, 2026 21:55
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.

1 participant