Release Process
This page describes the branching model, versioning scheme, and step-by-step release workflow for the Storage Service. The repository follows trunk-based development on main; releases are cut by tagging from main.
Branching
There is one long-lived branch: main. Feature branches use <conventional-type>/<short-kebab-case-description> and merge to main via pull request. There are no next, release/*, or hotfix/* branches.
| Branch | Purpose |
|---|---|
main | The trunk. Always reflects the latest agreed state of the project. |
type/slug | Short-lived feature branches; merged to main via PR. |
Version Files
The project maintains version information in three files:
version.json-- Containsversion,apiVersion, anddocVersionfields:
{
"version": "MAJOR.MINOR.PATCH",
"apiVersion": "MAJOR.MINOR",
"docVersion": "MAJOR.MINOR.PATCH",
"dependencies": {}
}
The apiVersion documents the API contract version as MAJOR.MINOR. It is kept in lockstep with the URL path segment (/api/v<MAJOR>, derived from the routes directory under src/routes/v<MAJOR>/): the MAJOR of apiVersion always matches the MAJOR in the URL. MINOR bumps document backwards-compatible additions to the API surface and do not change the URL.
package.json-- Theversionfield must matchversion.json.documentation/package.json-- Theversionfield must match thedocVersioninversion.json.
Release Notes And Changelog
Two files at the repository root capture release information; both are maintained by hand alongside the code that ships in the release.
RELEASE_NOTES.md-- Human-facing per-release summary. Describes what changes for the operator or integrator. Consumers browse this file at the tagged commit for the release summary.CHANGELOG.md-- Technical per-release log in Keep a Changelog format (Added/Changed/Removed/Fixed).
Pre-release Tags
Versions may carry a pre-release identifier for staged rollouts:
v<X.Y.Z>-rc.<n>for release candidates.v<X.Y.Z>-alpha.<n>and-beta.<n>for earlier-stage previews.v<X.Y.Z>-pre.<n>for ad-hoc pre-release builds.
Pre-release tags push the semver-tagged Docker image but do not move the :latest pointer, so a pre-release does not become the default pull target.
Release Workflow
The release flow is:
PRs -> main -> tag v<X.Y.Z> from main
Step-by-step
-
Confirm
mainis release-ready. CI green, no in-flight breaking work that should land first, migration guides updated if this is a major release. -
Open a release-prep branch from
main:
git checkout main
git pull --ff-only
git checkout -b chore/release-X.Y.Z
- Bump the version everywhere it appears:
version.json-- updateversion(anddocVersionif generating a docs cut).package.json-- updateversion.
-
Update release notes and changelog. Add a new top-level
## X.Y.Zsection toRELEASE_NOTES.mdwith the human-facing summary, and a new top-level## [X.Y.Z] - YYYY-MM-DDsection toCHANGELOG.mdin Keep a Changelog format. -
Generate a documentation snapshot if
docVersionchanged:
yarn release:doc
-
Commit and push the release-prep branch, open a pull request against
main, get it reviewed, and merge it. -
Tag the merge commit with the release version (prefixed
v):
git checkout main
git pull --ff-only
git tag vX.Y.Z
git push origin vX.Y.Z
The tag push triggers the Docker workflow, which builds and pushes ghcr.io/uncefact/project-storage-service:X.Y.Z and :latest (the :latest tag is suppressed for pre-release suffixes).
Hotfix Workflow
For an urgent fix against a released version:
- Branch from the affected release tag:
git checkout -b fix/short-description vX.Y.Z
-
Apply the fix and open a pull request against
main. -
After the PR merges, cut a new patch tag from
main(vX.Y.Z+1).
If main has diverged enough that hotfixing directly from main is risky, tag the patch from the hotfix branch and push that tag (the docker workflow fires either way), then merge the fix back to main separately.
Creating a New Documentation Version
Documentation versions are managed through the scripts/release-doc.js script. To create a new documentation version manually:
yarn release:doc
The documentation is automatically built and deployed to GitHub Pages via the build_publish_docs.yml pipeline, which triggers on push to main.