Repository navigation
release: derive the install text from signing state, fix the changelog link (closes #443) - #444
Merged
Merged
Conversation
…g link (closes #443) The install boilerplate in release.yml's Publish step was hardcoded and had drifted from reality on every release since v1.1.0 — whose own tag annotation already read "macOS bundles are now both signed and notarized". The published body still said: On first launch Gatekeeper will warn that the bundle is unsigned; right-click → Open to bypass. Verified against the shipped QuMesh-1.4.1-macos.dmg, that is false: Authority=Developer ID Application: maClara, LLC (53R32TQWB6) CodeDirectory flags=0x10000(runtime) spctl -a -t exec: accepted, source=Notarized Developer ID xcrun stapler validate: The validate action worked! Telling users to bypass Gatekeeper on a bundle that passes it is worse than saying nothing. Both platform lines now derive from whether the signing secrets are provisioned. That is accurate by construction: the Notarize step has no continue-on-error, so with MAC_NOTARIZE_APPLE_ID set the macOS job fails before publish if notarization fails. Windows is genuinely unsigned (WIN_SIGN_THUMBPRINT is empty), so its SmartScreen wording stays and self-corrects if a cert is provisioned — the platforms have diverged and the text has to say so rather than being flipped wholesale. Two more defects in the same heredoc: The changelog link never had a base ref. `compare/...$TAG` renders as `compare/...v1.4.1`, which is a 404; no previous tag was ever computed. It now comes from `gh release view --json tagName` — with no argument that resolves the latest release, still the previous one at publish time — and the line is dropped entirely when there is none. Not `git describe`: this job checks out at depth 1 with no tag history. And the release body never contained the release notes. app/release- notes/<TAG>.md fed only the Sparkle appcast, so in-app updaters showed the full notes while the Releases page — where people land from a link — showed install instructions, a broken changelog link, and no description of what changed. The source-precedence block is now resolved once into $NOTES_MD_FILE that both consumers read. Body assembly moves to .github/scripts/release-body.sh so it can be tested. release.yml only fires on v*.*.* tags, so nothing in CI ever exercised this text — which is precisely how it stayed wrong across five releases. test-release-body.sh covers 22 assertions (both signing states per platform, the three changelog cases, H1 stripping, and the APT block staying literal) and runs on every PR. Verified to fail when the old hardcoded macOS text is restored. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #443.
The install boilerplate in
release.yml's Publish release step was hardcoded and has been wrong on every release since v1.1.0 — whose own tag annotation already read "macOS bundles are now both signed and notarized". Three defects, all visible on the v1.4.1 release page.1. The macOS line was false
Verified against the published
QuMesh-1.4.1-macos.dmg:Telling users to right-click → Open past a Gatekeeper prompt that never appears is worse than saying nothing at all.
Both platform lines now derive from whether the signing secrets are provisioned:
Accurate by construction: the
Notarizestep has nocontinue-on-error, so with the secret set the macOS job fails before publish if notarization fails. Windows is genuinely unsigned (WIN_SIGN_THUMBPRINTis empty), so its SmartScreen wording stays and self-corrects when a cert is provisioned — the two platforms have diverged and the text has to say so rather than being flipped wholesale.2. The changelog link 404s
compare/...$TAGhas no base ref →compare/...v1.4.1→ 404. Now fromgh release view --json tagName(with no argument that resolves the latest release, which at publish time is still the previous one), and dropped entirely when there is none. Deliberately notgit describe: this job checks out at depth 1 with no tag history.3. The release body never contained the release notes
app/release-notes/<TAG>.mdfed only the Sparkle appcast<description>. So in-app updaters showed the full notes while the Releases page — where people land from a link — showed install instructions, a broken changelog link, and nothing about what changed. The source-precedence block is now resolved once into$NOTES_MD_FILEthat both consumers read, so they cannot drift apart again.Tests
Body assembly moves to
.github/scripts/release-body.shso it can be tested.release.ymlonly fires onv*.*.*tags, so nothing in CI ever exercised this text — precisely how it stayed wrong across five releases. Newrelease-bodyjob on every PR runs 22 assertions:prev == current# QuMesh <version>stripped (GitHub already renders the title) while##sub-headings survive, and a notes file with no H1 keeps its first line${ID}${VERSION_ID}unexpanded, trailing backslashes intactVerified to fail (3 of 22) when the old hardcoded macOS text is restored.
actionlintreports no new findings on either workflow;shellcheckis clean on both scripts.Verification
Dry-ran the full
Resolve release notes→Publish releasechain locally againstapp/release-notes/v1.4.1.mdwith a stubbedgh, producing the 150-line body the next release will publish.Follow-ups, not in this PR
.dmgbut not toQuMesh.appinside it, so a user who copies the app out and first launches it offline falls back to an online notarization check.gh release editonce this merges, not a workflow change.