Skip to content

Add GitHub macOS notarized release#43

Open
jmcte wants to merge 4 commits into
mainfrom
codex/windows-release-validation
Open

Add GitHub macOS notarized release#43
jmcte wants to merge 4 commits into
mainfrom
codex/windows-release-validation

Conversation

@jmcte

@jmcte jmcte commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add a GitHub Actions release workflow that imports a Developer ID certificate into a temporary keychain.
  • Build, sign, notarize, staple, checksum, and publish a versioned Flapline DMG.
  • Document the protected prod environment secrets required for unattended Apple release signing.

Governing Issue

No linked issue. This release automation was explicitly requested by the project owner.

Validation

  • bash -n scripts/ci/run-macos-notarized-release.sh
  • actionlint .github/workflows/macos-notarized-release.yml
  • bash scripts/ci/run-release-verification.sh
  • Apple signing and notarization require the protected prod environment secrets to be configured before the workflow can run.

Bootstrap Governance

  • Work is on a feature branch.
  • Signing material is referenced only as protected GitHub environment secrets.
  • No certificate, private key, Apple credential, or local environment file is committed.

Merge Automation

Auto-merge is not safe to enable until the release-workflow review is complete and the protected Apple signing inputs are configured.

Notes

The workflow uses an App Store Connect API key with notarytool, avoiding an Apple ID password in automation. It creates a stapled DMG and SHA-256 checksum for each exact SemVer tag or approved manual release.

Build a Developer ID signed Flapline saver, package it as a DMG, submit it to Apple notary service, staple the ticket, and publish the artifact with a checksum.
@jmcte
jmcte requested a review from a team as a code owner July 12, 2026 09:19
Hermes-omt
Hermes-omt previously approved these changes Jul 12, 2026

@Hermes-omt Hermes-omt left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Approved. I found no blocking issues in the new notarized macOS release workflow or release script.

Validation on Hermes/macOS: route proof confirmed Darwin on Mac.Home; PR head 5821a53 contains origin/main; live PR checks are green; bash syntax, actionlint, the repo release verification script, and a signing-disabled Release Xcode build all passed. The Xcode build produced the expected Flapline.saver artifact.

I did not enable auto-merge because this release path is intentionally gated on protected prod Apple signing/notary secrets being configured before unattended release automation is used.

@jmcte
jmcte enabled auto-merge (squash) July 13, 2026 07:28
Reuse APW CLI's fail-closed credential contract, portable Base64 decoding, temporary keychain isolation and restoration, and dry-run tests for Flapline's signed and stapled DMG release path.

@Hermes-omt Hermes-omt left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Reviewed the live PR head 737f3f3bfe6abe5e828affe8ade807cda5af7388 on Hermes after refreshing the stale local worktree. CI is green, the branch is current with main, and auto-merge is already enabled. I found no merge-blocking issues in the notarized release workflow, signing script, dry-run test, or launch docs.

Validation run on Hermes: bash -n scripts/ci/run-macos-notarized-release.sh, bash scripts/ci/test-macos-notarized-release.sh, actionlint .github/workflows/macos-notarized-release.yml, and Xcode project/scheme/build-settings inspection with Xcode 26.6.

Non-blocking note: the docs treat APPLE_DEVELOPER_IDENTITY as required, while the script falls back to Developer ID Application if it is absent. That fallback should still work on a clean runner with only the imported cert, but making it required would give a clearer failure mode.

Hermes-omt
Hermes-omt previously approved these changes Jul 16, 2026

@Hermes-omt Hermes-omt left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Node-local review completed on Hermes (Mac.Home/Darwin) at PR head f7afacc, matching expected. Four commits: upstream merge + paths-filter v4 upgrade + macos-notarized-release workflow + release/test scripts. All 6 CI checks passing. No secrets leaked in diff. Security: ephemeral keychain with EXIT trap cleanup, env-var gate before secret decode, tool-existence preflight on six macOS binaries, dry-run path guarded. Minor non-blocking note: APPLE_DEVELOPER_IDENTITY from secrets is optional and could be empty (codesign fails loudly if so), but current behavior is acceptable as a fast-fail. Branch up-to-date with main. Recommend approve via Pheidon control-plane finalizer.

@athena-omt athena-omt added status:needs-review PR is ready for Athena review. review:athena Athena review governance requested. labels Jul 17, 2026

@Hermes-omt Hermes-omt left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Blocking findings:

  1. .github/workflows/macos-notarized-release.yml interpolates ${{ inputs.version }} directly into a bash run: block. A manually dispatched value can alter shell syntax before the SemVer check, in a job that receives production signing and notarization secrets. Pass the input through env, read it as a quoted shell variable, then validate it; never interpolate workflow inputs directly into shell source.

  2. Manual dispatch builds the selected workflow ref, but gh release create "$tag" does not bind a newly created tag to GITHUB_SHA; an absent tag is created from the default branch. This can publish an artifact built from one commit under a release tag pointing at another. Require and verify refs/tags/v$version resolves to GITHUB_SHA, or explicitly create/verify the tag at GITHUB_SHA before publishing.

After repair, add coverage for the safe input transport and tag/SHA binding, then rerun release-script checks and macOS build validation.

@Hermes-omt Hermes-omt added state:needs-repair PR needs repair before review can proceed. and removed status:needs-review PR is ready for Athena review. review:athena Athena review governance requested. labels Jul 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state:needs-repair PR needs repair before review can proceed.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants