Add tag-based release workflow #45

Merged
miro merged 9 commits from claude/release-strategy-36db27 into main 2026-10-10 19:39:20 +00:00
Owner

Summary

  • Merges to main no longer deploy. CI publishes sha-<short> images only (no more :latest) and ignores changes that only touch docker-compose.prod.yml.
  • New release.yml, run with fj actions dispatch release.yml main: retags the already-built image as CalVer YYYY.M.N, pins it in docker-compose.prod.yml, commits and tags v<version>, creates a Forgejo release with git-cliff notes, then calls the deploy webhook (gitsync rereads the compose file).
  • Adds cliff.toml and a Releases section in the README.

Before merging

  • Add the RELEASE_TOKEN secret (PAT with repo write scope).
  • Dispatch the first release right after merge: prod compose still says :latest, which CI no longer updates. The first release's notes cover the whole history.
  • Set up a container cleanup rule for ^sha- versions (keep release tags matching ^\d{4}\.\d+\.\d+$).

Not tested

The workflows haven't been run. Likely trouble spots: node on the docker runner (used to build the release JSON) and $GITHUB_SERVER_URL resolving to the right host. A failure before the push step deploys nothing.

## Summary - Merges to `main` no longer deploy. CI publishes `sha-<short>` images only (no more `:latest`) and ignores changes that only touch `docker-compose.prod.yml`. - New `release.yml`, run with `fj actions dispatch release.yml main`: retags the already-built image as CalVer `YYYY.M.N`, pins it in `docker-compose.prod.yml`, commits and tags `v<version>`, creates a Forgejo release with `git-cliff` notes, then calls the deploy webhook (gitsync rereads the compose file). - Adds `cliff.toml` and a Releases section in the README. ## Before merging - Add the `RELEASE_TOKEN` secret (PAT with repo write scope). - Dispatch the first release right after merge: prod compose still says `:latest`, which CI no longer updates. The first release's notes cover the whole history. - Set up a container cleanup rule for `^sha-` versions (keep release tags matching `^\d{4}\.\d+\.\d+$`). ## Not tested The workflows haven't been run. Likely trouble spots: `node` on the `docker` runner (used to build the release JSON) and `$GITHUB_SERVER_URL` resolving to the right host. A failure before the push step deploys nothing.
Add tag-based release workflow
All checks were successful
CI / docker (arm64, docker-arm64) (pull_request) Successful in 11s
CI / lint (pull_request) Successful in 25s
CI / format (pull_request) Successful in 35s
CI / docker (amd64, docker-amd64) (pull_request) Successful in 13s
CI / typecheck (pull_request) Successful in 40s
CI / manifest (pull_request) Has been skipped
CI / build (pull_request) Successful in 41s
E2E / playwright (pull_request) Successful in 53s
9fef9de61a
Merges to main now only publish sha-<short> images. A manually dispatched
release workflow retags the image as CalVer, pins it in docker-compose.prod.yml,
tags, creates a release with git-cliff notes and triggers the deploy.
Show the release version in the nav; move release creation into a script
All checks were successful
CI / docker (arm64, docker-arm64) (pull_request) Successful in 10s
CI / lint (pull_request) Successful in 25s
CI / format (pull_request) Successful in 32s
CI / docker (amd64, docker-amd64) (pull_request) Successful in 12s
CI / typecheck (pull_request) Successful in 38s
CI / build (pull_request) Successful in 40s
CI / manifest (pull_request) Has been skipped
E2E / playwright (pull_request) Successful in 54s
f8acba82f7
APP_VERSION is set at runtime from docker-compose.prod.yml (the image is
retagged, not rebuilt, so the version can't be baked in at build time).
Ship the version as a thin image layer instead of an env var
Some checks failed
CI / docker (arm64, docker-arm64) (pull_request) Successful in 11s
CI / lint (pull_request) Successful in 27s
CI / manifest (pull_request) Has been cancelled
CI / build (pull_request) Has been cancelled
CI / format (pull_request) Has been cancelled
CI / typecheck (pull_request) Has been cancelled
E2E / playwright (pull_request) Has been cancelled
CI / docker (amd64, docker-amd64) (pull_request) Has been cancelled
9749baaa40
The release workflow builds a per-arch layer adding /app/VERSION on top of the
image CI built, then publishes the multi-arch tag from those.
Link the nav version to its release page
All checks were successful
CI / docker (arm64, docker-arm64) (pull_request) Successful in 12s
CI / typecheck (pull_request) Successful in 29s
CI / format (pull_request) Successful in 34s
CI / lint (pull_request) Successful in 42s
CI / build (pull_request) Successful in 39s
CI / docker (amd64, docker-amd64) (pull_request) Successful in 12s
CI / manifest (pull_request) Has been skipped
E2E / playwright (pull_request) Successful in 51s
65c01c1741
miro force-pushed claude/release-strategy-36db27 from 65c01c1741
All checks were successful
CI / docker (arm64, docker-arm64) (pull_request) Successful in 12s
CI / typecheck (pull_request) Successful in 29s
CI / format (pull_request) Successful in 34s
CI / lint (pull_request) Successful in 42s
CI / build (pull_request) Successful in 39s
CI / docker (amd64, docker-amd64) (pull_request) Successful in 12s
CI / manifest (pull_request) Has been skipped
E2E / playwright (pull_request) Successful in 51s
to 156a2df092
Some checks failed
CI / docker (arm64, docker-arm64) (pull_request) Successful in 10s
CI / docker (amd64, docker-amd64) (pull_request) Has been cancelled
CI / manifest (pull_request) Has been cancelled
CI / build (pull_request) Has been cancelled
CI / format (pull_request) Has been cancelled
CI / typecheck (pull_request) Has been cancelled
CI / lint (pull_request) Has been cancelled
E2E / playwright (pull_request) Has been cancelled
2026-10-10 19:33:27 +00:00
Compare
Refetch the version every 10 minutes instead of never
Some checks failed
CI / docker (arm64, docker-arm64) (pull_request) Successful in 10s
CI / lint (pull_request) Successful in 26s
CI / format (pull_request) Successful in 37s
CI / typecheck (pull_request) Successful in 42s
CI / build (pull_request) Successful in 43s
CI / docker (amd64, docker-amd64) (pull_request) Successful in 27s
CI / manifest (pull_request) Has been skipped
E2E / playwright (pull_request) Has been cancelled
64e37374ca
Use FORGEJO_* variables in the release and image-tag steps
Some checks failed
CI / docker (arm64, docker-arm64) (pull_request) Successful in 3s
CI / lint (pull_request) Successful in 32s
CI / docker (amd64, docker-amd64) (pull_request) Successful in 6s
CI / manifest (pull_request) Has been skipped
CI / format (pull_request) Successful in 42s
CI / build (pull_request) Successful in 48s
CI / typecheck (pull_request) Successful in 49s
E2E / playwright (pull_request) Has been cancelled
4ba146d5fb
Drop a comment
All checks were successful
CI / docker (arm64, docker-arm64) (pull_request) Successful in 11s
CI / lint (pull_request) Successful in 27s
CI / format (pull_request) Successful in 38s
CI / docker (amd64, docker-amd64) (pull_request) Successful in 13s
CI / build (pull_request) Successful in 41s
CI / manifest (pull_request) Has been skipped
CI / typecheck (pull_request) Successful in 44s
E2E / playwright (pull_request) Successful in 54s
2d28c4f3be
Keep the first release's notes short
All checks were successful
CI / docker (arm64, docker-arm64) (pull_request) Successful in 2s
CI / lint (pull_request) Successful in 27s
CI / docker (amd64, docker-amd64) (pull_request) Successful in 3s
CI / manifest (pull_request) Has been skipped
CI / format (pull_request) Successful in 43s
CI / build (pull_request) Successful in 45s
CI / typecheck (pull_request) Successful in 47s
E2E / playwright (pull_request) Successful in 1m1s
a8fd3b1ae8
miro merged commit 508b528918 into main 2026-10-10 19:39:20 +00:00
miro deleted branch claude/release-strategy-36db27 2026-10-10 19:39:20 +00:00
miro referenced this pull request from a commit 2026-10-10 19:39:21 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
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
miro/files!45
No description provided.