Skip to content

Commit eba4ec8

Browse files
katipallyclaude
andcommitted
ci(release): publish GitHub Release before pushing appcast to main
Reorder so the notarized DMG/ZIP are published as a GitHub Release BEFORE the version-bump/appcast commit is pushed back to main. The deliverable users download must never depend on a protected-branch push succeeding — if that push fails, the release is already live and the only stale artifact is the Sparkle feed, which is recoverable. Also clarifies the failure message: the release is published; only appcast.xml on main is stale. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 234025f commit eba4ec8

1 file changed

Lines changed: 36 additions & 29 deletions

File tree

.github/workflows/release.yml

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,39 @@ jobs:
460460
--size "${{ env.ZIP_SIZE }}" \
461461
--download-url "https://github.com/katipally/Doom-Coder/releases/download/${{ env.TAG }}/DoomCoder-${{ env.VERSION }}.zip"
462462
463+
# Publish the GitHub Release (with the notarized DMG + ZIP) BEFORE the
464+
# appcast push to main. The deliverable users actually download must not
465+
# depend on the bookkeeping commit succeeding — if the protected-branch
466+
# push ever fails, the release is already live and recoverable. It also
467+
# guarantees the appcast's download URL resolves the moment it lands.
468+
- name: Create GitHub Release
469+
uses: softprops/action-gh-release@v3.0.0
470+
env:
471+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
472+
with:
473+
name: "Doom Coder ${{ env.TAG }}"
474+
files: |
475+
DoomCoder-${{ env.VERSION }}.dmg
476+
DoomCoder-${{ env.VERSION }}.zip
477+
generate_release_notes: true
478+
body: |
479+
## 📦 Installation
480+
481+
**DMG (recommended):**
482+
1. Download **`DoomCoder-${{ env.VERSION }}.dmg`** below
483+
2. Open it and drag **DoomCoder** into your Applications folder
484+
3. Launch — no Gatekeeper warnings, no "unidentified developer" prompts
485+
486+
**ZIP:**
487+
1. Download **`DoomCoder-${{ env.VERSION }}.zip`**
488+
2. Unzip and move `DoomCoder.app` to `/Applications`
489+
490+
DoomCoder is **signed with a Developer ID and notarized by Apple**.
491+
Existing users receive automatic updates via the built-in Sparkle updater.
492+
493+
---
494+
Full changelog: [CHANGELOG.md](https://github.com/katipally/Doom-Coder/blob/main/docs/CHANGELOG.md)
495+
463496
- name: Commit version bump and appcast.xml
464497
run: |
465498
git config user.name "github-actions[bot]"
@@ -523,37 +556,11 @@ jobs:
523556
sleep $((attempt * 2))
524557
done
525558
526-
echo "::error::Failed to push version bump after 5 attempts"
559+
echo "::error::appcast.xml/version-bump push to main failed after 5 attempts."
560+
echo "::error::The GitHub Release IS already published — only the Sparkle"
561+
echo "::error::auto-update feed (appcast.xml on main) is stale. See README/RELEASING."
527562
exit 1
528563
529-
- name: Create GitHub Release
530-
uses: softprops/action-gh-release@v3.0.0
531-
env:
532-
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
533-
with:
534-
name: "Doom Coder ${{ env.TAG }}"
535-
files: |
536-
DoomCoder-${{ env.VERSION }}.dmg
537-
DoomCoder-${{ env.VERSION }}.zip
538-
generate_release_notes: true
539-
body: |
540-
## 📦 Installation
541-
542-
**DMG (recommended):**
543-
1. Download **`DoomCoder-${{ env.VERSION }}.dmg`** below
544-
2. Open it and drag **DoomCoder** into your Applications folder
545-
3. Launch — no Gatekeeper warnings, no "unidentified developer" prompts
546-
547-
**ZIP:**
548-
1. Download **`DoomCoder-${{ env.VERSION }}.zip`**
549-
2. Unzip and move `DoomCoder.app` to `/Applications`
550-
551-
DoomCoder is **signed with a Developer ID and notarized by Apple**.
552-
Existing users receive automatic updates via the built-in Sparkle updater.
553-
554-
---
555-
Full changelog: [CHANGELOG.md](https://github.com/katipally/Doom-Coder/blob/main/docs/CHANGELOG.md)
556-
557564
- name: Clean up keychain
558565
if: always()
559566
run: |

0 commit comments

Comments
 (0)