release: rc notes resolve to the base version; publish without jq
CI / shell (shellcheck + syntax) (push) Successful in 14s
CI / python 3.11 (push) Successful in 17s
CI / python 3.12 (push) Successful in 20s
CI / python 3.13 (push) Successful in 21s
TrueNAS compatibility / compat (push) Successful in 10s
Release / release (push) Successful in 14s

release_notes.py 'notes v0.6.0-rc1' looked for a CHANGELOG section literally named
v0.6.0-rc1. check() already used base_version(); extract_notes() did not. So the
release workflow cut the tag, passed every gate, and then died extracting the body --
the candidate existed but was never published.

Caught in an rc, which is the entire point of having them.

Also: the Gitea publish and issue steps used jq, which is not guaranteed on a
self-hosted runner. A publish step that dies on a missing tool leaves a tag with no
release behind it, and a bug report that dies on one is a warning system that does
not warn. Both now use python3, which setup-python guarantees.
This commit is contained in:
2026-07-13 18:38:02 +00:00
parent c250bc8f5d
commit 8c1b4c45f5
4 changed files with 105 additions and 42 deletions
+6 -1
View File
@@ -107,10 +107,15 @@ def changelog_versions(text: str) -> list[str]:
def extract_notes(text: str, version: str) -> str:
"""The body of one version's section, without its heading.
A release candidate resolves to its BASE version: v0.6.0-rc2 ships the same code
as v0.6.0 and therefore the same notes, and the CHANGELOG only ever has the one
section. Without this, the release workflow cut the tag, passed every gate, and
then died extracting the body -- so the candidate existed but was never published.
Raises KeyError if the version has no section -- a release with an empty or
wrong body is worse than a failed release.
"""
want = normalise(version)
want = base_version(version)
lines = text.splitlines()
start = None