Skip to content

ci(release): write the release page from a template, with an English summary - #200

Merged
fylorn merged 1 commit into
devfrom
ci/release-notes-template
Sep 25, 2026
Merged

fylorn merged 1 commit into
devfrom
ci/release-notes-template

Conversation

@fylorn

@fylorn fylorn commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

What this changes

Release pages get a title and a fixed layout. A release is titled "ThinkWatch Lite ", and its text is, in order: an English summary from release-notes/<version>.md when that file exists, a table of the file for each platform with the Homebrew and Linux install commands, how to verify a download against its .sha256, and GitHub's generated list of pull requests. Until now the page was only the generated list, under the bare tag.

Why

The release page is where people who download by hand arrive, and it did not say which file is for which machine, how to install from the command line, or how to check a download. The tag message cannot fill that role: it is the Chinese update text that goes into latest.json.

How it works

  • scripts/release_notes.py <version> <generated list> writes the text. It refuses a malformed version, and a summary that is empty, contains Chinese characters or starts a top-level heading (the workflow sets the title).
  • New job release-body (ubuntu, runs on tags and on rehearse/**): asks releases/generate-notes for the list, runs the script, writes the result to the run summary and uploads it as an artifact. publish now needs it.
  • publish passes name and body_path to action-gh-release and no longer sets generate_release_notes. It writes the text only when the release does not exist yet (the same rule as ThinkWatch-Core#191), so a re-run neither appends a second list nor overwrites a page edited after publishing.
  • The comment on the tag-notes step is corrected: since 2026.9.13 (fix(update): announce a new version with a notification, and show only the version #153) the update window shows only the version; the tag text still goes into latest.json, and older installs show it.
  • CONTRIBUTING gets a Releases section: the tag, the rehearsal branch, and the two texts.
  • release-notes/2026.9.16.md is the English version of the 2026.9.16 tag notes.

How it was verified

  • python3 scripts/release_notes_test.py: 17 tests, run on Python 3.14 and 3.9. They check the five file names against the manifest step in release.yml, the install and checksum commands, that no winget command appears, the summary checks, and every file in release-notes/. Changing one file name in release.yml, or adding a Chinese line to a summary, fails them.
  • actionlint with shellcheck on both workflows: nothing in the new steps (the existing SC2046 in the signing step is untouched). CI runs actionlint without shellcheck, as before.
  • Rehearsal: run 36091652370 on rehearse/release-notes (this commit). The release-body job finished in under a minute; its artifact (the same file the job appends to the run summary) is byte-identical to the page rendered locally for 2026.9.16. The five build jobs were cancelled once that was known and then re-run to completion (attempt 2): all passed, and publish was skipped, as in every rehearsal.
  • The list from generate-notes for v2026.9.16 is byte-identical to the list the 2026.9.16 page carried before this change, so a real release gets the same list as before.

Notes for review

🤖 Generated with Claude Code

…summary

The GitHub release text used to be only GitHub's generated list of pull
requests, under a title that was just the tag. A release is now titled
"ThinkWatch Lite <version>", and its text has, in order:

- an English summary from release-notes/<version>.md, when that file
  exists;
- a table of the file for each platform, and the Homebrew and Linux
  install commands;
- how to verify a download against its .sha256;
- GitHub's generated list of pull requests.

scripts/release_notes.py builds the text. A new release-body job runs it
on tags and on rehearse/** pushes, so a rehearsal shows the page in its
run summary within a minute, without waiting for the installers. Publish
writes the text only when it creates the release: a re-run no longer
appends a second generated list, and a page edited after publishing is
left as it is.

The tag message keeps its role as the notes of latest.json; it is not
the release page. The comment that called it the text shown in the app
is corrected: since 2026.9.13 the update window shows only the version.

scripts/release_notes_test.py checks the file names against release.yml,
the install and checksum commands, and every file in release-notes/. CI
runs it on every pull request, so a broken summary is caught before a
tag is pushed rather than after.

release-notes/2026.9.16.md is the English version of the 2026.9.16 tag
notes, which the live 2026.9.16 release page now carries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@fylorn
fylorn merged commit 973e14e into dev Sep 25, 2026
12 of 18 checks passed
@fylorn
fylorn deleted the ci/release-notes-template branch September 25, 2026 07:01
@fylorn fylorn mentioned this pull request Sep 25, 2026
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