Skip to content

ci: manual sign-and-notarize check for Plannotator Snapshots - #1799

Merged
backnotprop merged 3 commits into
mainfrom
ci/snapshots-sign-check
Oct 8, 2026
Merged

backnotprop merged 3 commits into
mainfrom
ci/snapshots-sign-check

Conversation

@backnotprop

Copy link
Copy Markdown
Owner

A workflow_dispatch workflow (Actions → Snapshots sign check → Run workflow) that builds Plannotator Snapshots.app from a chosen ref (default feat/shots-macos), signs it with the Developer ID from the Apple secrets, notarizes and staples it, then verifies three things: codesign --verify --deep --strict, Gatekeeper's assessment says "Notarized Developer ID", and stapler validate. It uploads the signed zip as an artifact (7 days) and makes no release.

Why: release.yml signs only on tag pushes, and release tags are immutable, so the secrets need proving before a release depends on them.

  • Needs all six secrets (APPLE_DEVELOPER_ID_P12, _P12_PASSWORD, _IDENTITY, APPLE_NOTARY_KEY_P8, _KEY_ID, _ISSUER_ID) and fails naming any that are missing.
  • permissions: contents: read, SHA-pinned actions as in release.yml, a temporary keychain removed at the end, decoded key files deleted after use.
  • workflow_dispatch only, so only people with write access can run it; nothing runs on PRs.
  • actionlint clean.

🤖 Generated with Claude Code

A workflow_dispatch job that builds Plannotator Snapshots.app from a chosen
ref, signs it with the Developer ID from the Apple secrets, notarizes and
staples it, and verifies the signature, Gatekeeper's notarized assessment
and the staple. It uploads the zip and makes no release, so the secrets can
be proven before a tag depends on them (release tags are immutable). It
needs all six Apple secrets and fails naming any that are missing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
backnotprop and others added 2 commits October 8, 2026 10:43
… from a protected environment

The ref is passed to scripts through env (never pasted into a script), a
first step with no secrets accepts only a branch or tag of this repository
by exact name and resolves it to a commit, and checkout uses that commit.
The Apple secrets come from the protected GitHub Environment apple-signing.
Decoded key files are removed by a trap even when a step fails.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
git ls-remote matches patterns against the end of ref names, so a tag named
x/refs/tags/main matched an input of main. Keep only exact names, and refuse
a name that is both a branch and a tag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@backnotprop
backnotprop merged commit b3111d5 into main Oct 8, 2026
28 checks passed
@backnotprop
backnotprop deleted the ci/snapshots-sign-check branch October 8, 2026 18:18
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