1313 MACOS_SIGNING_IDENTITY : ${{ secrets.MACOS_SIGNING_IDENTITY }}
1414 MACOS_NOTARY_KEY_ID : ${{ secrets.MACOS_NOTARY_KEY_ID }}
1515 MACOS_NOTARY_ISSUER_ID : ${{ secrets.MACOS_NOTARY_ISSUER_ID }}
16+ SPARKLE_ENABLE : ${{ vars.SPARKLE_ENABLE }}
17+ SPARKLE_APPCAST_BRANCH : ${{ vars.SPARKLE_APPCAST_BRANCH }}
18+ SPARKLE_FEED_URL : ${{ secrets.SPARKLE_FEED_URL }}
19+ SPARKLE_PRIVATE_ED_KEY : ${{ secrets.SPARKLE_PRIVATE_ED_KEY }}
20+ SPARKLE_PUBLIC_ED_KEY : ${{ secrets.SPARKLE_PUBLIC_ED_KEY }}
1621 FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 : true
1722
1823jobs :
@@ -53,17 +58,17 @@ jobs:
5358 goarch : arm64
5459 wails-platform : darwin/arm64
5560 package-ext : dmg
56- asset-name : GetTokens_darwin_arm64 .dmg
57- updater-asset-name : GetTokens_darwin_arm64 .tar.gz
61+ asset-name : GetTokens_macOS_AppleSilicon .dmg
62+ updater-asset-name : GetTokens_macOS_AppleSilicon .tar.gz
5863
5964 - runner : macos-15-intel
6065 os-name : macOS amd64
6166 goos : darwin
6267 goarch : amd64
6368 wails-platform : darwin/amd64
6469 package-ext : dmg
65- asset-name : GetTokens_darwin_amd64 .dmg
66- updater-asset-name : GetTokens_darwin_amd64 .tar.gz
70+ asset-name : GetTokens_macOS_Intel .dmg
71+ updater-asset-name : GetTokens_macOS_Intel .tar.gz
6772
6873 steps :
6974 - uses : actions/checkout@v5
@@ -158,6 +163,20 @@ jobs:
158163 chmod +x build/bin/GetTokens.app/Contents/MacOS/cli-proxy-api
159164 file build/bin/GetTokens.app/Contents/MacOS/cli-proxy-api
160165
166+ - name : Configure Sparkle metadata
167+ if : runner.os == 'macOS' && env.SPARKLE_ENABLE == '1'
168+ shell : bash
169+ run : |
170+ chmod +x scripts/configure-sparkle-macos.sh
171+ scripts/configure-sparkle-macos.sh "build/bin/GetTokens.app"
172+
173+ - name : Embed Sparkle framework
174+ if : runner.os == 'macOS' && env.SPARKLE_ENABLE == '1'
175+ shell : bash
176+ run : |
177+ chmod +x scripts/prepare-sparkle-framework.sh scripts/embed-sparkle-framework.sh
178+ scripts/embed-sparkle-framework.sh "build/bin/GetTokens.app"
179+
161180 # ── Package ───────────────────────────────────────────────────────────
162181 - name : Sign and notarize macOS app
163182 if : runner.os == 'macOS'
@@ -198,10 +217,83 @@ jobs:
198217 fi
199218 rm -f "$RUNNER_TEMP/developer-id.p12" "${MACOS_NOTARY_KEY_PATH:-}"
200219
220+ sparkle-appcast :
221+ name : Publish Sparkle appcast
222+ if : vars.SPARKLE_ENABLE == '1'
223+ needs : build
224+ runs-on : macos-latest
225+ steps :
226+ - uses : actions/checkout@v5
227+ with :
228+ fetch-depth : 0
229+
230+ - uses : actions/download-artifact@v5
231+ with :
232+ path : dist/release/
233+ merge-multiple : true
234+
235+ - name : Restore previous appcast
236+ shell : bash
237+ run : |
238+ mkdir -p dist/sparkle-feed
239+ APPCAST_BRANCH="${SPARKLE_APPCAST_BRANCH:-sparkle-appcast}"
240+ if git ls-remote --exit-code origin "refs/heads/${APPCAST_BRANCH}" >/dev/null 2>&1; then
241+ git fetch origin "${APPCAST_BRANCH}:${APPCAST_BRANCH}"
242+ if git cat-file -e "${APPCAST_BRANCH}:appcast.xml" 2>/dev/null; then
243+ git show "${APPCAST_BRANCH}:appcast.xml" > dist/sparkle-feed/appcast.xml
244+ fi
245+ fi
246+
247+ - name : Generate Sparkle appcast
248+ shell : bash
249+ run : |
250+ chmod +x scripts/prepare-sparkle-framework.sh scripts/generate-sparkle-appcast.sh
251+ scripts/generate-sparkle-appcast.sh dist/release dist/sparkle-feed
252+ env :
253+ SPARKLE_RELEASE_BASE_URL : https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}
254+ SPARKLE_FULL_RELEASE_NOTES_URL : https://github.com/${{ github.repository }}/releases/tag/${{ github.ref_name }}
255+ SPARKLE_PRODUCT_URL : https://github.com/${{ github.repository }}
256+
257+ - name : Publish Sparkle appcast branch
258+ shell : bash
259+ run : |
260+ APPCAST_BRANCH="${SPARKLE_APPCAST_BRANCH:-sparkle-appcast}"
261+ PUBLISH_DIR="$RUNNER_TEMP/sparkle-appcast-publish"
262+ REPO_URL="https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git"
263+
264+ rm -rf "${PUBLISH_DIR}"
265+ if git ls-remote --exit-code origin "refs/heads/${APPCAST_BRANCH}" >/dev/null 2>&1; then
266+ git clone --branch "${APPCAST_BRANCH}" --single-branch "${REPO_URL}" "${PUBLISH_DIR}"
267+ else
268+ git clone --single-branch "${REPO_URL}" "${PUBLISH_DIR}"
269+ (
270+ cd "${PUBLISH_DIR}"
271+ git checkout --orphan "${APPCAST_BRANCH}"
272+ )
273+ fi
274+
275+ (
276+ cd "${PUBLISH_DIR}"
277+ find . -mindepth 1 -maxdepth 1 ! -name .git -exec rm -rf {} +
278+ cp "${GITHUB_WORKSPACE}/dist/sparkle-feed/appcast.xml" ./appcast.xml
279+ git add appcast.xml
280+ if git diff --cached --quiet; then
281+ echo "Sparkle appcast unchanged; skipping commit."
282+ exit 0
283+ fi
284+ git config user.name "github-actions[bot]"
285+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
286+ git commit -m "chore: update Sparkle appcast for ${GITHUB_REF_NAME}"
287+ git push origin HEAD:"${APPCAST_BRANCH}"
288+ )
289+
201290 # ── Publish GitHub Release ────────────────────────────────────────────────
202291 release :
203292 name : Publish Release
204- needs : build
293+ needs :
294+ - build
295+ - sparkle-appcast
296+ if : ${{ always() && needs.build.result == 'success' && (needs.sparkle-appcast.result == 'success' || needs.sparkle-appcast.result == 'skipped') }}
205297 runs-on : ubuntu-latest
206298 steps :
207299 - uses : actions/checkout@v5
@@ -220,9 +312,9 @@ jobs:
220312 uses : softprops/action-gh-release@v3
221313 with :
222314 files : |
223- dist/release/GetTokens_darwin_arm64 .dmg
224- dist/release/GetTokens_darwin_arm64 .tar.gz
225- dist/release/GetTokens_darwin_amd64 .dmg
226- dist/release/GetTokens_darwin_amd64 .tar.gz
315+ dist/release/GetTokens_macOS_AppleSilicon .dmg
316+ dist/release/GetTokens_macOS_AppleSilicon .tar.gz
317+ dist/release/GetTokens_macOS_Intel .dmg
318+ dist/release/GetTokens_macOS_Intel .tar.gz
227319 dist/release/checksums.txt
228320 generate_release_notes : true
0 commit comments