Skip to content

ci(desktop): guard the installers and version-pin release notes - #150

Merged
VickyXAI merged 1 commit into
mainfrom
fix/desktop-ci-release-guards
Sep 2, 2026
Merged

ci(desktop): guard the installers and version-pin release notes#150
VickyXAI merged 1 commit into
mainfrom
fix/desktop-ci-release-guards

Conversation

@VickyXAI

@VickyXAI VickyXAI commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Two gaps in desktop-ci.yml's release job, found reviewing #146 while cutting desktop-v0.2.0-beta.2.

Worth noting up front: #146's own fix is verified working. Its first-ever production run was beta.2, and the CI-generated SHA256SUMS.txt hashes match GitHub's asset digests exactly, with filenames matching the uploaded assets (Franklin.Setup.0.2.0-beta.2.exe). This PR addresses what that code does not cover.

Nothing checked that both installers arrived

download-artifact does not fail when its pattern matches no artifacts, so a partial download would publish a release with one installer plus a SHA256SUMS.txt that looks complete — the checksum step succeeds either way. Adds an explicit count check for exactly one .dmg and one .exe before anything is hashed or uploaded.

Release notes were destroyed by re-runs

The body was a hardcoded two-sentence blurb in the workflow. action-gh-release updates an existing release, so notes written by hand on the release page were silently replaced the moment the job was re-run. And since every release got the same two sentences, both beta.1 and beta.2 had to be hand-edited afterward.

The body now comes from apps/desktop/release-notes/<version>.md, checked in with the version bump:

  • Re-running a release reproduces the same body instead of clobbering it.
  • The filename carries the version, so notes cannot go stale against a newer tag — a common failure with a single RELEASE_NOTES.md.
  • A tag with no matching file falls back to the original blurb rather than failing, so re-running tags that predate this change still works.

actions/checkout is added ahead of the download step, not after: it cleans the workspace by default and would otherwise delete the installers.

beta.2's published notes are checked in as the first file, so a re-run of that tag now reproduces what is live.

Verification

Both run: scripts were extracted exactly as Actions de-indents the YAML block scalars, then executed:

  • notes step, no notes file → falls back to the blurb, name=Franklin Desktop 0.9.9
  • notes step, notes file present → copies it, name=Franklin Desktop 0.2.0-beta.3
  • guard, one dmg + one exe → passes
  • guard, dmg only / exe only / empty dir → exits 1 in all three

Not addressed

softprops/action-gh-release@v2 is a floating major tag on a job holding contents: write, so its code changes without review. (Checked: the Node 20 deprecation does not apply — v2's action.yml currently declares using: "node24". v3.0.3 exists if you want to pin deliberately.)

🤖 Generated with Claude Code

https://claude.ai/code/session_01EdbfY8FiReoKH32UKeKfzN

Two gaps in the release job, found reviewing #146 while cutting 0.2.0-beta.2.

Nothing checked that both installers arrived. `download-artifact` does not fail
when its `pattern` matches no artifacts, so a partial download would have
published a release with one installer plus a SHA256SUMS.txt that looked
complete. Adds an explicit count check for exactly one .dmg and one .exe before
anything is hashed or uploaded.

The release body was a hardcoded blurb in the workflow, which meant notes
written by hand on the release page were silently replaced the moment the job
was re-run — and every release after the first got two sentences, so 0.2.0-beta.1
and beta.2 both had to be edited afterward. The body now comes from
apps/desktop/release-notes/<version>.md, checked in alongside the version bump.
The filename carries the version so notes cannot go stale against a newer tag,
and a tag with no file falls back to the old blurb rather than failing, which
keeps re-runs of existing tags working.

`actions/checkout` is added ahead of the download step, not after: it cleans the
workspace by default and would otherwise delete the installers.

Verified by extracting both `run:` scripts exactly as Actions de-indents them
and executing them: the notes step covers present and missing notes files, and
the guard passes on one dmg + one exe and exits 1 on dmg-only, exe-only, and
empty.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EdbfY8FiReoKH32UKeKfzN
@VickyXAI
VickyXAI merged commit 52efc88 into main Sep 2, 2026
6 checks passed
@VickyXAI
VickyXAI deleted the fix/desktop-ci-release-guards branch September 2, 2026 02:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant