feat(ci): publish versioned Docker images from CI on tag (#91) #164

Merged
claude-bot merged 2 commits from feat/91-publish-images into main 2026-07-16 00:36:55 +00:00
Contributor

Summary

Every deploy and self-hoster built all three prod targets from source — slow first run, no immutable artifacts to roll back to, no way to pin to exactly what was tested. This publishes per-version images on tag.

Changes

  • .forgejo/workflows/release.yml: new images job (runs on vX.Y.Z tag push) — builds backend-prod, frontend-prod, bot-prod from the unified Dockerfile and pushes to git.rhoving.com/rbrooks/quest-board-{backend,frontend,bot}.
    • Version tag from the ref (v3.4.03.4.0); :latest moves only for final releases, not prereleases (v3.4.0-rc1 → version tag only).
    • Independent of the release-notes job, so a missing registry secret doesn't block the release.
  • Auth: two Actions secrets — REGISTRY_USER and REGISTRY_TOKEN (write:package scope). Documented in the workflow and in OPERATIONS.md. These must be created before the first tagged release or the images job fails at docker login.
  • Docs: OPERATIONS.md gains a Running from Published Images section with a docker-compose.images.yml override example (image: replacing build:, pin all services to one tag); README points to it.

Verification

  • release.yml parses as valid YAML.
  • Tag→tag logic checked: v3.4.03.4.0 + latest; v3.4.0-rc13.4.0-rc1 only.
  • Build targets (backend-prod/frontend-prod/bot-prod) exist in the Dockerfile and are already built by the CI docker job on every PR.

Note: the job only runs on tag push, so it isn't exercised by PR CI. First real validation is the next vX.Y.Z tag (after the secrets are set).

Closes #91

🤖 Generated with Claude Code

## Summary Every deploy and self-hoster built all three prod targets from source — slow first run, no immutable artifacts to roll back to, no way to pin to exactly what was tested. This publishes per-version images on tag. ## Changes - **`.forgejo/workflows/release.yml`**: new `images` job (runs on `vX.Y.Z` tag push) — builds `backend-prod`, `frontend-prod`, `bot-prod` from the unified Dockerfile and pushes to `git.rhoving.com/rbrooks/quest-board-{backend,frontend,bot}`. - Version tag from the ref (`v3.4.0` → `3.4.0`); `:latest` moves only for **final** releases, not prereleases (`v3.4.0-rc1` → version tag only). - Independent of the release-notes job, so a missing registry secret doesn't block the release. - **Auth**: two Actions secrets — `REGISTRY_USER` and `REGISTRY_TOKEN` (`write:package` scope). Documented in the workflow and in OPERATIONS.md. **These must be created before the first tagged release** or the `images` job fails at `docker login`. - **Docs**: OPERATIONS.md gains a *Running from Published Images* section with a `docker-compose.images.yml` override example (`image:` replacing `build:`, pin all services to one tag); README points to it. ## Verification - `release.yml` parses as valid YAML. - Tag→tag logic checked: `v3.4.0` → `3.4.0` + `latest`; `v3.4.0-rc1` → `3.4.0-rc1` only. - Build targets (`backend-prod`/`frontend-prod`/`bot-prod`) exist in the Dockerfile and are already built by the CI `docker` job on every PR. Note: the job only runs on tag push, so it isn't exercised by PR CI. First real validation is the next `vX.Y.Z` tag (after the secrets are set). Closes #91 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(ci): publish versioned Docker images from CI on tag (#91)
Some checks failed
CI / Docker image build (pull_request) Successful in 17s
CI / Backend lint (ruff) (pull_request) Successful in 49s
CI / Backend migration, tests, and audit (pull_request) Failing after 2m54s
CI / Frontend tests, audit, and build (pull_request) Successful in 3m3s
CI / Bot tests and audit (pull_request) Successful in 4m55s
7f4b82587f
Every deploy and self-hoster built all three prod targets from source —
slow first run, no immutable artifacts to roll back to, no way to pin a
deployment to exactly what was tested.

Add an `images` job to the tag-triggered release workflow that builds
backend-prod, frontend-prod, and bot-prod from the unified Dockerfile and
pushes them to the Forgejo container registry as
git.rhoving.com/rbrooks/quest-board-{backend,frontend,bot}. Each gets the
version tag (vX.Y.Z -> X.Y.Z); :latest moves only for final releases, not
prereleases. The job is independent of the release-notes job, so a missing
registry secret doesn't block the release.

Auth uses two Actions secrets (REGISTRY_USER / REGISTRY_TOKEN with the
write:package scope) — documented in the workflow and OPERATIONS.md.
OPERATIONS.md also gains a "Running from Published Images" section with a
docker-compose.images.yml override example; README points to it.

Closes #91

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
claude-bot scheduled this pull request to auto merge when all checks succeed 2026-07-15 23:08:57 +00:00
ci: re-trigger (previous run hit an infra flake)
Some checks failed
CI / Frontend tests, audit, and build (pull_request) Successful in 58s
CI / Backend migration, tests, and audit (pull_request) Failing after 50s
CI / Backend lint (ruff) (pull_request) Successful in 36s
CI / Bot tests and audit (pull_request) Successful in 1m40s
CI / Docker image build (pull_request) Successful in 2m53s
549ed2cac1
claude-bot deleted branch feat/91-publish-images 2026-07-16 00:36:56 +00:00
Sign in to join this conversation.
No description provided.