Query Connector Release Documentation
Releases are driven by the version field in app_version.yml. Bumping
that field on main triggers automation that tags the merge commit, builds
and publishes the Query Connector Docker image to GHCR, creates a GitHub
Release with auto-generated notes, and posts the release link to Slack.
Semantic Versioning
Releases follow Semantic Versioning 2.0.0 with each release's version following the pattern of MAJOR.MINOR.PATCH.
-
MAJOR versions introduce breaking changes.
A breaking change breaks backwards compatibility with previously released versions. In other words, a breaking change is something that may cause a client's implementation to stop working when upgrading from a previous version. Common examples of breaking changes include:
- Deleting a package or public functions/methods
- Deleting public function parameters
- Changing a function name
- Changing the name or order of required parameters
- Adding new required parameters
- Removing, restricting or changing functionality offered by a public function
Major version releases may also include non-breaking enhancements and fixes.
Major version releases will reset MINOR and PATCH versions to 0.
-
MINOR versions introduce new, non-breaking functionality.
Releases with enhancements that do not break backwards compatibility require a minor version update. Common examples of non-breaking changes include:
- Adding a package, module, or method
- Adding optional parameters
Minor version releases may also include fixes.
Minor versions will reset PATCH to 0.
-
PATCH versions introduce non-breaking bug fixes.
Releases that only contain fixes are released as patches.
Cut a release
- Decide the next semver version (
X.Y.Z):- Patch (
X.Y.Z+1): backwards-compatible bug fixes. - Minor (
X.Y+1.0): backwards-compatible new functionality. - Major (
X+1.0.0): incompatible API changes.
- Patch (
- Check with the broader team to see if there's any additional functionality someone wishes to merge into the release.
- Open a PR titled
Release vX.Y.Zthat bumpsversioninapp_version.ymlandversioninpackage.jsontoX.Y.Z. Do not include avprefix in the files; the workflow prepends it when tagging. Keep both files in sync with the same version number. - Get review and merge to
main. - The
Releaseworkflow runs automatically on the merge commit:- tags the merge commit as
vX.Y.Z - builds the Query Connector Docker image for
linux/amd64 - pushes
vX.Y.Z,vX.Y,vX, andlatesttags to GHCR - publishes a GitHub Release named
vX.Y.Zwith auto-generated notes - posts the release link to Slack (if configured)
- tags the merge commit as
On GHCR, the vX.Y and vX tags float to the latest release within that line;
the vX.Y.Z tag is immutable.
The Release workflow does not deploy. The dev environment
(https://queryconnector.dev) tracks the main image tag, which is built and
pushed by the CD workflow on every merge to main (see below), so dev is
already up to date by the time a release is cut. Versioned (vX.Y.Z) images
are published to GHCR for downstream consumers to deploy intentionally.
Hotfix
Same flow. Open a PR that bumps the patch number (e.g. 1.0.0 to 1.0.1) and
merge.
Non-release pushes
Pushes to main that do not bump the version field are handled by the
CD workflow, which builds and pushes the Docker image tagged with main
only. No git tag or GitHub Release is created. The CD workflow then triggers
the Terraform deploy workflow, which redeploys the main image to the dev
environment. This is the normal dev build and deploy flow.
Verification
After merging a release PR, confirm:
- [ ] Actions tab: the
Releaseworkflow run on the merge commit is green. - [ ] Tags:
git fetch --tags && git tag -l "vX.Y.Z"shows the new tag. - [ ] GitHub Releases:
vX.Y.Zis published (not draft) with PR-list notes. - [ ] GHCR:
query-connectorhasvX.Y.Z,vX.Y,vX, andlatesttags pointing at this release. - [ ] Slack: the release-notifications channel received the release link (if configured).
Failure modes
- Tag
vX.Y.Zalready exists at a different commit: the workflow fails loudly during thedetect-releasejob. Bump to the next available version in a new PR. - Partial failure (tag and image created, release step failed): re-run the workflow from the Actions tab. The collision check treats a same-SHA tag as a no-op, and the GitHub Release creation falls back to fetching an existing release, so re-runs are idempotent.
- Non-semver version: the workflow rejects pre-release suffixes
(e.g.
1.0.0-rc.1). Use a strictX.Y.Zformat.
Release notes
GitHub auto-generates notes from PRs merged since the previous vX.Y.Z tag.
The category and exclusion rules live in .github/release.yml.
For more on customizing release notes, see GitHub's automatically generated release notes documentation.