Release process
This page is for maintainers cutting a Prism release. Operators installing one should follow Deployment and Upgrades.
Branches
Section titled “Branches”- Feature and fix branches merge into
devthrough pull requests. devis the integration branch for the next release. It is always built from source.mainholds released code. It only moves through a reviewed pull request fromdev.- Both branches require the Quality gate. Nobody pushes to them directly, and force pushes stay disabled.
The Quality gate covers frontend lint, tests and builds, the backend suite, the semantic viewer’s tests and build, the Rust workspace (format, clippy, generated contracts, licence and source policy, tests on Linux, macOS and Windows, the WebAssembly build, hygiene) with projection parity, the source and release Compose files, and the release-bundle tests.
What never publishes images
Section titled “What never publishes images”Pull requests, feature branches, pushes and merges to dev, ordinary pushes
to main and manual workflow runs publish nothing. Only a version tag on
main does.
Cut a release
Section titled “Cut a release”-
Freeze the release scope on
dev. -
Wait for every pull request in scope to merge and for the
devQuality gate to pass. -
Write the release notes as
docs/releases/<tag>.md, for exampledocs/releases/v5.2.0.md, and merge them intodev. The file must not be empty: it becomes the GitHub Release text andRELEASE_NOTES.mdin the deployment bundle. -
Open a pull request from
devtomainand get it reviewed and approved. -
Merge it without bypassing
main’s protection. -
Wait for the Quality gate run on the
mainpush to succeed. -
Create the tag on that
maincommit:Terminal window git tag v5.2.0 <main commit> -
Push the tag, once:
Terminal window git push origin v5.2.0
Tags are v<major>.<minor>.<patch>, optionally with a prerelease suffix:
v5.2.0, v5.2.0-alpha, v5.2.0-alpha.1. Build metadata such as
v5.2.0+build.1 is refused, because it is not a valid Docker tag.
What the tag workflow does
Section titled “What the tag workflow does”The Tagged release images workflow runs on every v* tag.
Validation
Section titled “Validation”Before any build, it checks that:
- the tag is a valid version;
docs/releases/<tag>.mdexists and is not empty;- the tagged commit is on
main; - that commit has a successful Quality gate push run on
main.
A tag made from dev or a feature branch fails here. If you pushed the tag
before the main run finished, wait for the run and re-run the failed tag
workflow; don’t create another tag.
Build and smoke test
Section titled “Build and smoke test”On a GitHub-hosted Linux AMD64 runner, it:
- builds the backend and frontend images locally;
- starts PostgreSQL, the API, both workers and the frontend from them;
- waits for every service to be healthy;
- checks API readiness, frontend health, both worker processes, the embedded
Git revision, the
x86_64architecture, andkicad-cli --versionandprism-kicad --versionin the API and the worker; - tears the test stack down.
Only after every check passes does it sign in to the GitHub Container Registry. A failed smoke test publishes nothing.
Images
Section titled “Images”| Image | |
|---|---|
ghcr.io/krishna-swaroop/kicad-prism-backend |
API and both workers |
ghcr.io/krishna-swaroop/kicad-prism-frontend |
web app and proxy |
A stable tag such as v5.2.0 publishes 5.2.0, 5.2, 5 and latest. A
prerelease such as v5.2.0-alpha.1 publishes only 5.2.0-alpha.1, never the
floating tags.
Only Linux AMD64 images are published. ARM64 images need a public, reproducible ARM64 KiCad base and their own native smoke test; an AMD64 image running under emulation does not count.
Deployment bundle
Section titled “Deployment bundle”After publishing the images, the workflow:
- reads the exact registry digests of the images it tested;
- writes the bundle’s
.env.examplewith those digests; - adds
VERSION,RELEASE_NOTES.mdand aSHA256SUMSfile over the bundle; - packs
kicad-prism-<tag>-linux-amd64.tar.gzand its.sha256checksum; - creates or updates the GitHub Release for the tag.
A tag with a prerelease suffix is marked as a prerelease. A stable release becomes GitHub’s latest release; a prerelease does not.
When the workflow fails
Section titled “When the workflow fails”| Failure | What to do |
|---|---|
| validation | fix the branch, the quality gate run or the notes file, and re-run. Never move the tag. |
| build or smoke test | fix it through dev, promote to main again, and use a new version tag |
| a transient error before publishing | re-run the same tag workflow |
| after some images were published | investigate before re-running, and check the final bundle holds the digests you intended |
Never publish substitute images under a release tag by hand.
Other release workflows
Section titled “Other release workflows”These are separate from the server release and run on their own:
- Native release builds the
prism-kicadbinaries and the WebAssembly package. It runs manually (a dry run unless you choose to publish) or on aprism-kicad-v<version>tag. - Build KiCad Plugin builds the desktop plugin for macOS, Linux and Windows. It runs only manually, and can attach the result to a GitHub Release.