Skip to content

Add release CI: tag-triggered image publish + GitHub Release#55

Merged
jcschaff merged 1 commit into
mainfrom
chore/cicd-release-workflow
Jun 5, 2026
Merged

Add release CI: tag-triggered image publish + GitHub Release#55
jcschaff merged 1 commit into
mainfrom
chore/cicd-release-workflow

Conversation

@jcschaff

@jcschaff jcschaff commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

What

Adds the missing release automation. Until now the repo had only test CI (pytest, lint/typecheck, smoke) — no workflow built or pushed images. Releases were fully manual and error-prone (the in-flight 0.5.0 backend bump was caught half-built, with overlays already pointing at images that didn't exist in the registry).

Changes

  • .github/workflows/release.yaml — image publish + GitHub Release:
    • Triggers: backend-v* / frontend-v* / v* tag pushes, plus workflow_dispatch (service + version inputs).
    • plan job resolves what to build and guards that the tag version matches version.py / package.json before any build runs.
    • backend matrix builds api + worker; frontend runs npm ci && npm run build then the runtime image. amd64-only, pushed to GHCR via GITHUB_TOKEN.
    • release job cuts a GitHub Release on tag pushes (dispatch publishes images only).
  • backend/scripts/bump-backend.sh — mirrors bump-frontend.sh; bumps version.py + pyproject.toml in lockstep, commits, tags backend-vX.Y.Z (removes the two-file hand-edit footgun).
  • DocsCLAUDE.md gains a Release-automation section + tag→build table; backend/CLAUDE.md Deploy steps rewritten around the tag-triggered flow; build_and_push.sh reframed as the local / multi-arch fallback.

Tag → build contract

Tag Builds Image tag(s) Release
backend-vX.Y.Z api + worker backend-X.Y.Z yes
frontend-vX.Y.Z frontend frontend-X.Y.Z yes
vX.Y.Z all three both yes
workflow_dispatch per input per input no

Notes / decisions

  • amd64-only in CI by decision. arm64 (e.g. biosim-local) uses the build_and_push.sh multi-arch fallback — documented in backend/CLAUDE.md.
  • Deploy stays manual (kubectl apply); no kubeconfig secrets enter GitHub. RKE is on-prem and unreachable from GitHub runners.
  • The actual 0.5.0 backend release (version bump + overlay repoints + tag) is a separate PR that lands after this one.

Verification

  • actionlint passes clean on the new workflow (and existing ones).
  • Bump-script version math + no-trailing-newline version.py rewrite tested on throwaway copies.
  • Suggested first real run: workflow_dispatch with service=backend, version=0.5.0 to confirm images land in GHCR before relying on the tag path.

🤖 Generated with Claude Code

Previously, cutting a release was entirely manual (bump version files, edit
overlays, run build_and_push.sh, commit, tag, kubectl apply) — there was no
CI that built or pushed images. This adds .github/workflows/release.yaml:

- Triggers on backend-v* / frontend-v* / v* tags, plus workflow_dispatch.
- plan job resolves service + version and guards that the tag version
  matches version.py / package.json before any build runs.
- Builds platform-{api,worker} and/or platform-frontend (amd64) and pushes
  to GHCR; cuts a GitHub Release on tag pushes.

Also adds backend/scripts/bump-backend.sh (mirrors bump-frontend.sh; bumps
version.py + pyproject.toml in lockstep, commits, tags backend-vX.Y.Z) and
reconciles the release docs in CLAUDE.md / backend/CLAUDE.md to the
backend-vX.Y.Z scheme, keeping build_and_push.sh as the multi-arch fallback.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jcschaff jcschaff merged commit d5fe9b8 into main Jun 5, 2026
5 checks passed
@jcschaff jcschaff deleted the chore/cicd-release-workflow branch June 5, 2026 15:00
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