Skip to content

Unlock the signing keychain inside the package job - #72

Merged
evandhoffman merged 1 commit into
mainfrom
ci/unlock-keychain-in-job
Oct 5, 2026
Merged

evandhoffman merged 1 commit into
mainfrom
ci/unlock-keychain-in-job

Conversation

@evandhoffman

Copy link
Copy Markdown
Contributor

Why

On 2026-10-05 an Apple M6 Mac mini (MacMiniM6_01) replaced the macOS runner. Its LaunchAgent keeps GitHub's default SessionCreate = true, so every job runs in its own security session and finds the login keychain locked. The old runner used SessionCreate = false.

A comment-only commit pushed straight to main that day (2e4f73c) cut v1.9.2. Its package job then failed in Build monitor.app:

Developer ID Application: EVAN DAVID HOFFMAN (94S5PZTVPY): no identity found
error: could not sign .build/monitor.app as Developer ID Application: ...

So v1.9.2 is published with no files attached.

Change

  • package.yml: unlocks the login keychain with the MACOS_KEYCHAIN_PASSWORD org secret before it builds, when SIGN_IDENTITY is set, and locks it again in an always() last step. It declares the secret for workflow_call.
  • release.yml: passes the secret to package.yml. A called workflow sees no secrets otherwise.
  • package.yml manual runs take an optional tag, so a release whose package job failed can get its files. After merge: gh workflow run package.yml -R evanwtf/monitor -f tag=v1.9.2.
  • AGENTS.md and docs/signing.md: describe the in-job unlock in place of SessionCreate = false. The notary profile is now made from the App Store Connect API key; the app-specific password failed with HTTP 401.

The same unlock landed in fancontrol's release.yml (39433e3). The secret is an org secret, visible only to fancontrol and monitor.

Test plan

  • After merge, gh workflow run package.yml -R evanwtf/monitor -f tag=v1.9.2. It unlocks, signs, notarizes, attaches the files to v1.9.2, and locks the keychain again.

The macOS runner was replaced on 2026-10-05 (MacMiniM6_01). It keeps
GitHub's default SessionCreate = true, so each job runs in its own
security session and finds the login keychain locked: v1.9.2's package
job failed with "no identity found". package.yml now unlocks the
keychain with the MACOS_KEYCHAIN_PASSWORD org secret and locks it again
at the end; release.yml passes the secret through.

A manual run of package.yml now takes a tag, so a release whose package
job failed can get its files. The notary profile is now made from the
App Store Connect API key; the app-specific password failed with 401.
@evandhoffman evandhoffman added the release:skip Merging this publishes no release label Oct 5, 2026
@evandhoffman
evandhoffman merged commit bc0c2ac into main Oct 5, 2026
@evandhoffman
evandhoffman deleted the ci/unlock-keychain-in-job branch October 5, 2026 21:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release:skip Merging this publishes no release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant