chore(release): create the release process #618

Merged
fuzzy merged 1 commit from chore/tpagectl-release-process into main 2026-08-09 18:14:03 +00:00
Owner

What

Implements Phase 9 release process (roadmap #297).

  • Semantic versioning (#294) — a guard step in release.yml fails any tag that is not vX.Y.Z (the workflow triggers on v*, so this pins releases to strict semver).
  • Changelog from commits (#295) — a step computes the previous tag (git tag --sort=-version:refname | sed -n '2p'), runs git log --oneline --no-merges <prev>..HEAD, and groups commits by conventional-commit type (Added/Fixed/Docs/Chores/CI/Testing/Refactor/Performance/Build/Style/Other), written to release-body.md. A finalize step then PATCHes that body onto the created release.
  • Tarballs and checksums (#296)thwap-actions/golang-release already builds the binaries and writes checksums.txt; a finalize step additionally packages every binary into <bin>_<ver>_<os>_<arch>.tar.gz (.zip for windows) and uploads them to the release.
  • Documented the flow in cmd/tpagectl/README.md (Releasing section).

Why

Roadmap task #297, the first item in Phase 9.

Testing

  • Workflow YAML parses; pre-commit "Validate Forgejo Actions files" and "check yaml" pass
  • Changelog grouping script simulated against a scratch git repo with conventional commits — correctly buckets feat/fix into Added/Fixed with short-SHA bullets
  • Tarball packaging simulated against fake dist dirs — .tar.gz for unix, .zip for .exe, checksums.txt skipped, correct archive names/contents
  • go test ./... passes (30 packages); no Go changes

Breaking Changes

None. release.yml behavior is additive; golang-release and docker-build are untouched.

Notes

All release-API/tarball logic lives in this repo's workflow per the chosen approach. The thwap-actions/golang-release setup-python issue (#1) is fixed and closed.

Closes #294
Closes #295
Closes #296
Closes #297

## What Implements Phase 9 release process (roadmap #297). - **Semantic versioning (#294)** — a guard step in `release.yml` fails any tag that is not `vX.Y.Z` (the workflow triggers on `v*`, so this pins releases to strict semver). - **Changelog from commits (#295)** — a step computes the previous tag (`git tag --sort=-version:refname | sed -n '2p'`), runs `git log --oneline --no-merges <prev>..HEAD`, and groups commits by conventional-commit type (Added/Fixed/Docs/Chores/CI/Testing/Refactor/Performance/Build/Style/Other), written to `release-body.md`. A finalize step then `PATCH`es that body onto the created release. - **Tarballs and checksums (#296)** — `thwap-actions/golang-release` already builds the binaries and writes `checksums.txt`; a finalize step additionally packages every binary into `<bin>_<ver>_<os>_<arch>.tar.gz` (`.zip` for windows) and uploads them to the release. - Documented the flow in `cmd/tpagectl/README.md` (Releasing section). ## Why Roadmap task #297, the first item in Phase 9. ## Testing - [x] Workflow YAML parses; pre-commit "Validate Forgejo Actions files" and "check yaml" pass - [x] Changelog grouping script simulated against a scratch git repo with conventional commits — correctly buckets `feat`/`fix` into Added/Fixed with short-SHA bullets - [x] Tarball packaging simulated against fake dist dirs — `.tar.gz` for unix, `.zip` for `.exe`, `checksums.txt` skipped, correct archive names/contents - [x] `go test ./...` passes (30 packages); no Go changes ## Breaking Changes None. `release.yml` behavior is additive; `golang-release` and `docker-build` are untouched. ## Notes All release-API/tarball logic lives in this repo's workflow per the chosen approach. The `thwap-actions/golang-release` setup-python issue (#1) is fixed and closed. Closes #294 Closes #295 Closes #296 Closes #297
chore(release): create the release process
All checks were successful
CI / build (pull_request) Successful in 9s
CI / test (pull_request) Successful in 5m1s
CI / docker (pull_request) Successful in 1m56s
CI / lint (pull_request) Successful in 5m33s
CI / lint (push) Successful in 8m7s
CI / test (push) Successful in 11m36s
CI / docker (push) Successful in 20m4s
CI / build (push) Successful in 22m50s
205e9529e1
release.yml now formalizes the release pipeline on v* tags:

- #294: a semantic-version guard fails non-vX.Y.Z tags.
- #295: a changelog is generated from git log since the previous tag,
  grouped by conventional-commit type, and set as the release body.
- #296: alongside the binaries and checksums.txt from
  thwap-actions/golang-release, a finalize step packages every binary
  into a .tar.gz (or .zip on windows) and uploads them to the release.

Documented the flow in cmd/tpagectl/README.md.

Closes #294
Closes #295
Closes #296
Closes #297
fuzzy scheduled this pull request to auto merge when all checks succeed 2026-08-09 16:42:19 +00:00
the.auditor left a comment

Clean release process. The semver guard, commit-grouped changelog (conventional-commit bucketing with short-SHA bullets), and the finalize step (PATCH release body, package .tar.gz/.zip, upload via the Forgejo API) are logically sound and match the documented flow in the README. Approving; one robustness issue filed.

Suggestions

  1. .forgejo/workflows/release.yml (Finalize step) – Packaging couples to golang-release output conventions: artifacts are expected in cmd/<bin>/dist, and only .exe-suffixed names get zipped. If the action's output path or naming differs, the loops silently skip and the release ships without archives — no error. Validate the dist dirs exist and fail loudly. Filed as #619.

Notes

  • Reusable actions remain pinned at mutable @main#615 applies here too.
  • Changelog "previous tag" is the 2nd tag in a global version-sorted list, not necessarily reachable from HEAD; a tag on an unrelated branch could skew the commit range (minor for a single-main-line repo).
  • Strict semver guard rejects pre-release tags (v1.1.0-rc1) — intended, worth documenting.
  • checksums.txt covers the binaries; the newly built archives aren't checksummed.

Praise

  • Changelog grouping correctly handles unknown prefixes via other, strips the conventional-commit prefix from subjects, and skips merges.
  • The finalize step correctly skips checksums.txt when packaging and uses the Forgejo API for both the body PATCH and octet-stream asset upload.
  • Semver guard runs before any build work, so a bad tag fails fast.
Clean release process. The semver guard, commit-grouped changelog (conventional-commit bucketing with short-SHA bullets), and the finalize step (PATCH release body, package `.tar.gz`/`.zip`, upload via the Forgejo API) are logically sound and match the documented flow in the README. Approving; one robustness issue filed. ## Suggestions 1. `.forgejo/workflows/release.yml` (Finalize step) – Packaging couples to `golang-release` output conventions: artifacts are expected in `cmd/<bin>/dist`, and only `.exe`-suffixed names get zipped. If the action's output path or naming differs, the loops silently skip and the release ships without archives — no error. Validate the dist dirs exist and fail loudly. Filed as #619. ## Notes - Reusable actions remain pinned at mutable `@main` — #615 applies here too. - Changelog "previous tag" is the 2nd tag in a global version-sorted list, not necessarily reachable from HEAD; a tag on an unrelated branch could skew the commit range (minor for a single-main-line repo). - Strict semver guard rejects pre-release tags (`v1.1.0-rc1`) — intended, worth documenting. - `checksums.txt` covers the binaries; the newly built archives aren't checksummed. ## Praise - Changelog grouping correctly handles unknown prefixes via `other`, strips the conventional-commit prefix from subjects, and skips merges. - The finalize step correctly skips `checksums.txt` when packaging and uses the Forgejo API for both the body PATCH and octet-stream asset upload. - Semver guard runs before any build work, so a bad tag fails fast.
fuzzy merged commit 205e9529e1 into main 2026-08-09 18:14:03 +00:00
fuzzy deleted branch chore/tpagectl-release-process 2026-08-09 18:14:03 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
thwap/thwap-pagesd!618
No description provided.