Organization-wide CI/CD building blocks for thaw-app.
Product repos (including apps that are not yet under thaw-app) should reference these actions by their org-qualified GitHub path, pinned to a commit SHA:
uses: thaw-app/org-ci/actions/configure-signing@<sha>
uses: thaw-app/org-ci/actions/build@<sha>
uses: thaw-app/org-ci/actions/export-and-package@<sha>
uses: thaw-app/org-ci/actions/notarize-and-validate@<sha>
uses: thaw-app/org-ci/actions/sparkle-release@<sha>export-and-package defaults to fetching DMG art from the public org repo thaw-app/brand-assets. Override brand-assets-repository / dmg-background if needed.
| Action | Purpose |
|---|---|
actions/configure-signing |
Import Developer ID cert + notarytool profile |
actions/build |
xcodebuild archive (Developer ID, hardened runtime) |
actions/export-and-package |
Export + signed DMG |
actions/notarize-and-validate |
notarytool + staple + Gatekeeper |
actions/sparkle-release |
Sparkle ZIP, appcast, optional gh-pages publish |
By default, sparkle-release keeps ZIP download URLs and appcast Pages on the
caller repository (legacy). To split installers from update payloads:
| Artifact | Typical home |
|---|---|
| DMG / human GitHub Release | Application repo (for example thaw-app/Thaw) |
Sparkle ZIP, deltas, appcast.xml |
Dedicated updates repo (for example thaw-app/updates) |
Pass:
- uses: thaw-app/org-ci/actions/sparkle-release@<sha>
with:
# …
updates-repository: thaw-app/updates
updates-token: ${{ secrets.UPDATES_GITHUB_TOKEN }}
release-html-url: https://github.com/${{ github.repository }}/releases/tag/${{ inputs.tag }}
publish-appcast: "true"updates-token needs contents: write on the updates repo (release assets are
uploaded by the caller workflow; this token is used for appcast gh-pages
push and for reading the existing feed / prior ZIPs). When updates-repository
is empty, behavior is unchanged and github.token is enough.
All five actions in a ship pipeline must run in the same job (shared $RUNNER_TEMP keychain, exported app, Sparkle env).
Typical order:
configure-signingbuildexport-and-packagenotarize-and-validatesparkle-release(optional)
configure-signing and notarize-and-validate share a keychain path (default $RUNNER_TEMP/buildagent.keychain). Override both with the same keychain-path if needed.
- Release / Sparkle publish on the caller repo:
permissions: contents: write(DMG / GitHub Release) - Dedicated updates feed: a PAT or GitHub App token with
contents: writeon the updates repo (updates-token), plus callercontents: writefor the DMG release - Read-only DMG builds can omit write if they only upload artifacts
If two Sparkle publishes can race on gh-pages, set a workflow concurrency group, for example:
concurrency:
group: sparkle-appcast
cancel-in-progress: falseThe publish step also retries refetch+push a few times on conflict.
- Pass exactly one of
project-nameorworkspace-name enable-hardened-runtimedefaults totrue(needed for notarization unless the Xcode project already sets it)
- Actions are product-agnostic: pass
app-name, scheme,asset-prefix, etc. from the caller. - No org membership is required to use these actions from a public consumer repo; only public read of
thaw-app/org-ci(andthaw-app/brand-assetswhen used).