OpenSnek ships as a notarized GitHub Release DMG with a Finder install window (OpenSnek.app plus /Applications drag target).
- In Apple Developer, confirm the bundle ID is
io.opensnek.OpenSnek. - Create or download a
Developer ID Applicationcertificate for your team. - Export that certificate from Keychain Access as a password-protected
.p12. - In App Store Connect, create an API key for notarization.
Required repository secrets:
APPLE_DEVELOPER_ID_APP_CERT_BASE64APPLE_DEVELOPER_ID_APP_CERT_PASSWORDAPPLE_DEVELOPER_TEAM_IDAPPLE_NOTARY_KEY_IDAPPLE_NOTARY_ISSUER_IDAPPLE_NOTARY_API_KEY_P8
You can set them with:
./OpenSnek/scripts/prepare_release_secrets.sh \
--cert /path/to/developer-id-application.p12 \
--cert-password '<p12 password>' \
--team-id '<APPLE_TEAM_ID>' \
--notary-key /path/to/AuthKey_XXXX.p8 \
--notary-key-id '<KEY_ID>' \
--notary-issuer-id '<ISSUER_ID>' \
--repo gh123man/OpenSnek \
--applyWithout --apply, the script prints the gh secret set ... commands instead.
Build a signed DMG locally:
./OpenSnek/scripts/build_release_dmg.sh \
--version 0.1.0 \
--build-number 1 \
--team-id '<APPLE_TEAM_ID>' \
--notary-key-path /path/to/AuthKey_XXXX.p8 \
--notary-key-id '<KEY_ID>' \
--notary-issuer-id '<ISSUER_ID>'Dry run without notarization:
./OpenSnek/scripts/build_release_dmg.sh \
--version 0.1.0 \
--build-number 1 \
--team-id '<APPLE_TEAM_ID>' \
--skip-notarizeUnsigned packaging-only dry run:
./OpenSnek/scripts/build_release_dmg.sh \
--version 0.1.0 \
--build-number 1 \
--skip-sign \
--skip-notarizeOutput:
OpenSnek/.release/artifacts/OpenSnek-<version>.dmg
Logs and notarization output are written to:
OpenSnek/.release/logs/
The workflow lives at .github/workflows/release-dmg.yml.
Preferred release entrypoint:
./OpenSnek/scripts/cut_release.sh --version <version>That script:
- fetches and fast-forwards
main - runs
swift test --package-path OpenSnek - creates an annotated
v<version>tag - pushes
mainand the tag
The GitHub Actions workflow can also be triggered manually by pushing a version tag:
git tag v<version>
git push origin v<version>The workflow will:
- verify the tagged commit is reachable from
main - run
swift test --package-path OpenSnek - import the Developer ID certificate into a temporary keychain
- archive/export the app with Xcode
- notarize and staple the
.app - create a styled drag-install DMG, then sign, notarize, and staple it
- publish the latest top section from
CHANGELOG.mdas the GitHub Release notes - upload
OpenSnek-<version>.dmgto the matching GitHub Release
The pull-request workflow installs XcodeGen and regenerates the Xcode project from OpenSnek/project.yml to catch spec regressions. The generated OpenSnek/OpenSnek.xcodeproj is not committed:
./OpenSnek/scripts/generate_xcodeproj.shAfter a release build:
codesign --verify --deep --strict --verbose=2 "OpenSnek/.release/export/OpenSnek.app"
spctl -a -vv --type exec "OpenSnek/.release/export/OpenSnek.app"
xcrun stapler validate "OpenSnek/.release/export/OpenSnek.app"
xcrun stapler validate "OpenSnek/.release/artifacts/OpenSnek-<version>.dmg"