Pushing a vX.Y.Z tag to teddychan/ice-2 triggers
.github/workflows/release.yml, which builds, Developer ID-signs, notarizes,
and staples the app, uploads Ice-2-vX.Y.Z.zip to the GitHub Release,
publishes the signed Sparkle appcast to docs/ice-2/appcast.xml in this
repo, and bumps the Homebrew cask teddychan/tap/ice-2.
The app-owned feed is the one the app reads — SUFeedURL in
App/Info.plist is
https://raw.githubusercontent.com/teddychan/ice-2/main/docs/ice-2/appcast.xml.
The same appcast is also copied to teddychan/www.dragonapp.com
(https://www.dragonapp.com/ice-2/appcast.xml), but that copy is only a
temporary mirror for installs still on v2.14.3 or older, and is scheduled
to be dropped at the next minor release. See the appcast_mirror_repo comment
in .github/workflows/release.yml — that comment is the source of truth for
the migration and its retirement trigger.
Reuse the same values already on clipmenu-2 (same Apple Team 4AF3KGGV29):
DEVELOPER_ID_CERT_P12_BASE64DEVELOPER_ID_CERT_PASSWORDNOTARY_KEY_P8_BASE64NOTARY_KEY_IDNOTARY_ISSUER_IDPUBLIC_RELEASE_TOKEN(PAT with write access toteddychan/homebrew-tapand — while the mirror lasts —teddychan/www.dragonapp.com. The appcast in this repo is published with the built-inGITHUB_TOKEN, whichpermissions: contents: writeinrelease.ymlcovers.)SPARKLE_EDDSA_PRIVATE_KEY(the shared EdDSA private key; its public halfp+F/ivF5bAYcmuNuCMNHcRv123A6LHFpCBagFm7Adu8=is inApp/Info.plist)
The workflow runs on a GitHub-hosted macOS runner — public repos get free
Actions minutes, so no self-hosted runner is required. Ice 2 targets the macOS
26 SDK, which the shared pipeline's default macos-15 image lacks, so the
caller passes swiftpm_runner: macos-26; despite the name that input drives
the job's runs-on for all build kinds, not just swiftpm. The "Select Xcode"
step then picks the newest Xcode on the image.
- Bump
MARKETING_VERSIONinIce.xcodeprojand commit. git tag vX.Y.Z && git push origin vX.Y.Z.- Watch the Release workflow. On success, verify:
-
The feed the app actually reads — prints X.Y.Z:
curl -s https://raw.githubusercontent.com/teddychan/ice-2/main/docs/ice-2/appcast.xml | grep sparkle:shortVersionStringCheck this URL, not
https://www.dragonapp.com/ice-2/appcast.xml: the site copy is only the mirror, and it is served by the GitHub Pages CDN, which can keep returning the previous appcast for minutes after a successful publish — which looks exactly like a failed release. -
brew update && brew livecheck teddychan/tap/ice-2→ X.Y.Z -
spctl -a -t installaccepts the downloaded zip's app.
-
- The app bundle id is
com.dragonapp.ice(rebranded from the upstreamcom.jordanbaird.Ice). Keep the cask'suninstall/zappaths in sync with this id. - The first tagged run validates the
xcodebuildexport-signing path. If-exportArchiveerrors on signing style, setsigningStyletoautomaticin.github/release/exportOptions.plistand drop the manualCODE_SIGN_*overrides from the archive step.