Skip to content

Commit b66d648

Browse files
docs(ops): document the develop→main release flow
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 2990bb5 commit b66d648

1 file changed

Lines changed: 57 additions & 0 deletions

File tree

docs/operations/releases.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Releases
2+
3+
This repo uses the Jarvus **develop→main Release-PR** flow (the
4+
`JarvusInnovations/infra-components` `release-prepare` / `release-validate` /
5+
`release-publish` composite actions). Versioned releases are cut from a
6+
changelog'd PR; merging it tags the release and publishes the container image.
7+
8+
## The flow
9+
10+
```
11+
feature branch ──▶ develop ──(push)──▶ "Release: vX.Y.Z" PR into main
12+
│ (review changelog, adjust bump)
13+
▼ (merge)
14+
tag vX.Y.Z ──▶ GHCR image :vX.Y.Z + :latest
15+
```
16+
17+
1. **Merge work into `develop`.** Feature branches PR into `develop` (CI runs on
18+
`develop` and on every PR).
19+
2. **Push `develop`.** `release-prepare.yml` opens (or updates) a
20+
**`Release: vX.Y.Z`** PR into `main` with a bot-generated `## Changelog`
21+
comment. The version is computed from the last `v*` tag + the commits since.
22+
3. **Review the Release PR.** Sort the changelog, confirm the semver bump
23+
(edit the PR title to override the version if needed — `release-validate.yml`
24+
keeps it well-formed). Use the **`release-flow`** skill for the changelog +
25+
bump conventions.
26+
4. **Merge the Release PR.** `release-publish.yml` creates the `vX.Y.Z` tag and
27+
GitHub release. The tag push triggers `container-publish.yml`, which builds
28+
and pushes `ghcr.io/codeforphilly/codeforphilly-ng:vX.Y.Z` and `:latest`.
29+
5. **Deploy.** The cluster picks up the image per
30+
[deploy.md](./deploy.md) (the published `:vX.Y.Z` / `:latest` tags replace
31+
the previously-manual `:sandbox` build for versioned releases).
32+
33+
## Prerequisites (one-time)
34+
35+
- **`BOT_GITHUB_TOKEN`** repo (or org) secret — a PAT/app token with `repo`
36+
scope. Required by `release-publish`: a tag pushed with the default
37+
`GITHUB_TOKEN` cannot trigger `container-publish`, so the image would never
38+
build.
39+
- **GHCR package write** for Actions — the first `container-publish` run creates
40+
the package; ensure `github.com/CodeForPhilly/codeforphilly-ng`
41+
Packages grants the repo's Actions write access (the workflow uses
42+
`permissions: packages: write`).
43+
- **Branch protection on `main`** (recommended) — require a PR + green CI to
44+
merge, so releases only land via the Release PR.
45+
46+
## First release
47+
48+
There are no tags yet, so the first push to `develop` proposes **`v0.1.0`**. If
49+
you want a different baseline, edit the Release PR title before merging.
50+
51+
## Notes
52+
53+
- The manual `docker build --platform=linux/amd64 … :sandbox` path
54+
([sandbox-deploy.md](./sandbox-deploy.md)) still works for ad-hoc iteration;
55+
versioned releases now go through `container-publish` instead.
56+
- CI runners and cluster nodes are both amd64, so `container-publish` needs no
57+
`--platform` flag (that's only for local Apple-silicon builds).

0 commit comments

Comments
 (0)