Releases¶
mcp-test follows semantic versioning. Every push to main is
verified by CI; every git tag matching v* triggers a release.
Where to find a release¶
- Binaries for macOS, Linux, and Windows are attached to each
release on
GitHub Releases,
bundled with
LICENSEandREADME.md. - Container images are published to
GitHub Container Registry
with three tags:
latest,vX.Y.Z,vX.
Cutting a release¶
# Make sure main is green.
git checkout main && git pull
git status # clean
# Tag and push.
git tag -a v0.1.0 -m "v0.1.0"
git push origin v0.1.0
GitHub Actions (.github/workflows/release.yml) takes over from
there:
- Sets up Go and Buildx, logs into GHCR.
- Runs
goreleaser release --clean:- Cross-compiles binaries for
linux/amd64,linux/arm64,darwin/amd64,darwin/arm64,windows/amd64. - Builds a multi-arch container image and pushes to
ghcr.io/plexara/mcp-test:vX.Y.Z,:vX,:latest. - Generates a GitHub Release with a generated changelog
grouped by
feat:,fix:,security:, others. - Attaches all binary archives plus a
checksums.txt.
- Cross-compiles binaries for
The whole pipeline takes ~3-5 minutes.
Versioning policy¶
- Major (
v1,v2): breaking change to the config schema, the HTTP API, the audit-row structure, or the tool input/output shapes. The deterministic-output guarantees onfixed_response,lorem, andflakymay change at major boundaries; patch- and minor-version bumps preserve them. - Minor (
v1.1,v1.2): new tools, new portal pages, new optional config fields. Existing configs and tests stay valid. - Patch (
v1.0.1): bug fixes, dependency bumps, doc-only changes.
v0.x.y is a different beast: until we hit v1.0.0, the schema and
APIs may change between minor versions. Pin a specific tag in
production.
Verifying a release¶
For binaries:
For images, the registry stores the digest in the manifest. Pin in production deployments to a digest, not a tag:
(We do not currently sign with cosign or generate SBOMs; both are straightforward to add and we'd take a PR doing so.)
Changelog¶
Each GitHub Release page carries a generated changelog grouped by
conventional-commit type. The format is set up in .goreleaser.yml:
feat:→ Featuresfix:→ Bug Fixessecurity:→ Security- everything else → Others
Anything starting with docs:, test:, chore:, or merge commits
is excluded. Write commit messages accordingly if you want them to
land in a release note.