Repository navigation
build: v3.1.0 release pipeline with signing, notarization, icon and single version source (TASK-009) - #21
Merged
Conversation
…ingle version source (TASK-009) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
One version source:
VERSION(3.1.0).build_app.shwrites it toCFBundleShortVersionStringandgit rev-list --count HEADtoCFBundleVersion. The CLIversioncommand printsMacOptimizer Pro v3.1.0from the bundle. The release workflow checks that the tag isv<VERSION>.Bundle: universal binary (arm64 + x86_64) via
UNIVERSAL=1, minos 14.0.LSUIElement=false(keeps the Dock icon),LSMinimumSystemVersion14.0, a newNSHumanReadableCopyright, andCFBundleLocalizationsen/tr. The build now fails ifen.lprojortr.lprojis missing from the resource bundle.Icon:
Scripts/build_icns.shturns the masterResources/Brand/AppIcon-1024.pnginto all iconset sizes (sips) and thenAppIcon.icns(iconutil) on every build. The current master is an original placeholder drawn byScripts/make_icon.swift(CoreGraphics). That generator runs only if the master is missing. To use the designed logo, replace the PNG.Entitlements:
Scripts/MacOptimizer.entitlementsis empty on purpose: hardened runtime, not sandboxed, no exceptions. The reasoning is in the file and indocs/RELEASING.md.Scripts/release.sh:codesign --options runtime --timestamp, then runscodesign --verify --strict --deepandspctl./Applicationslink and signs it.codifya-notary, or an API key in CI), then staples and validates it.spctlon the DMG and writes a.sha256.DRY_RUN=1skips notarization.CI:
release.ymlbuilds an unsigned universal DMG for tags as a workflow artifact.sign-and-notarizejob runs only when all five secrets exist. It uses a temporary keychain and API-key notarization, creates a draft release, and cleans up afterwards. It is skipped without failing when the secrets are absent.ci.ymlnow builds the universal bundle on PRs and checks the version, the icon, both .lproj folders and both architectures.docs/RELEASING.mdcovers the local flow, the icon and the CI secrets.Test plan
swift buildandswift test(scratch path /private/tmp/release-build): 87 XCTest, 0 failuresDRY_RUN=1 ./Scripts/release.sh:flags=0x10000(runtime), with authority chain Developer ID Application: OSMAN CAGRI GENC (N83DXM47FV) → Developer ID CA → Apple Root CA, and TeamIdentifier N83DXM47FVvalid on diskUnnotarized Developer ID, which is expected before notarizationMacOptimizer.appand theApplicationslink. The app has AppIcon.icns plus en.lproj and tr.lproj, passescodesign --verify --strict --deep, and prints version 3.1.0.🤖 Generated with Claude Code