Kgateway maintains releases through a GitHub-Actions + GoReleaser pipeline. This guide provides step-by-step instructions for creating a minor or a patch release.
Making any changes here? See if you should update the issue template at .github/ISSUE_TEMPLATE/RELEASE-REQUEST.md to keep its checklist in sync.
Kgateway uses Semantic Versioning 2.0.0 to communicate the impact of every release
(MAJOR.MINOR.PATCH). Artifacts (binaries, images, etc) are built by GoReleaser and
published by a single Release workflow
that can be run on demand via workflow_dispatch. Each release starts by creating a
tracking issue (see issue #11406
as an example) so that every task is visible and auditable.
After confirming that you have permissions to push to the Kgateway repo, set the environment variables that will be used throughout the release workflow:
export MINOR=0
export REMOTE=originIf needed, clone the Kgateway repo:
git clone -o ${REMOTE} https://github.com/kgateway-dev/kgateway.git && cd kgatewayIf the release branch does not exist, create one:
-
Create a new release branch from the
mainbranch. The branch should be namedv2.${MINOR}.x, for example,v2.0.x:git checkout -b v2.${MINOR}.x -
Push the branch to the Kgateway repo:
git push ${REMOTE} v2.${MINOR}.x
-
On
main, bumpROLLING_MAIN_VERSIONin the Makefile to the next minor's rolling tag via a PR (for example, after cuttingv2.3.x, set it tov2.4.0-main), sincemainnow tracks the next minor. -
On
main, bumpgateway-api-versionin the e2e test workflow to 1 version lower than what is used in go.mod (since this is an upgrade test) -
Update the OSV security scan workflow branch allowlist in .github/workflows/osv-scanner.yaml to include the new release branch, and drop any branch that is no longer LTS. This workflow only scans an explicit set of branches, so each newly cut release branch must be added to both the scheduled scan matrix and the
workflow_dispatchbranch options. This allowlist is the single source of truth for which branches get scanned: tooling such ashack/osvtooland thecve-bumpskill reads it rather than hardcoding the branch list, so keeping it current is all that is needed.
Before a release is cut, maintainers typically use the OSV scan results for the branch that will be released and clear any open source-dependency findings that would otherwise ship in the release artifact. The release workflow does not run this triage for you, so it belongs in the release checklist.
If you are using Codex, Claude Code, etc., the cve-bump skill
(invoked with @cve-bump, Clear CVEs, etc. depending on the coding
agent) wraps this workflow and uses hack/osvtool as the canonical
entry point. For a manual run, start with the table view to see the
current branch state:
./hack/osvtool --table --target source --state todo
./hack/osvtool --table --target image --state todoUse --state todo to focus on critical and high findings, or --state open
when you want the full severity picture. hack/osvtool reads the branch
allowlist from .github/workflows/osv-scanner.yaml,
so the branches it checks stay aligned with the scheduled scan workflow.
For a specific release branch, pull the raw alerts and decide how each one will be handled:
./hack/osvtool --raw --branch v2.3.x --target source --state todo
./hack/osvtool --raw --branch v2.3.x --target image --state todoThe usual outcomes are:
- bump a dependency to the first fixed version when the advisory has a fix
- update
osv-scanner.tomlonly for confirmed false positives - leave the finding open and defer the release if there is no safe fix yet
Once the dependency bumps or ignore-list updates land (for images, as
opposed to source code, note that this only happens upon release),
manually rerun the osv-scanner GitHub Action or wait for its nightly
run. Then rerun the skill or hack/osvtool for the release branch to
confirm the branch is clean enough to publish. If you add or retire a
release branch, update the allowlist in the OSV workflow before
relying on the scan results for that branch.
A patch release is generated from an existing release branch, e.g. v2.2.x. After all the necessary backport pull requests have merged, you can proceed to the next section.
Navigate to the Release workflow page.
Use the "Run workflow" drop-down in the right corner of the page to dispatch a release, then:
- Select the branch to release from
- Minor release: Select the
mainbranch. - Patch release: Select the release branch, e.g.
v2.2.x, that will be patched.
- Minor release: Select the
- Enter the version for the release to create, e.g.
v2.0.3. This will trigger the release process and result in a new GitHub release, v2.0.3 for example. - Click on the "validate release" option, which bootstraps an environment from the generated artifacts and runs the conformance suite against that deployed environment.
- The workflow automatically generates release notes and publishes them with the GitHub release. If you need to preview them locally, see Generating Release Notes below.
The workflow generates release notes automatically (see Release Notes below). Once the workflow completes, review the release notes on the GitHub release and edit the description if anything was miscategorized.
The Release workflow runs make release-notes automatically and feeds the output to GoReleaser, so no
manual step is required when cutting a release. Under the hood it invokes
hack/generate-release-notes.sh, which:
- Finds all PR numbers from commit messages between the previous tag and the new release
- Fetches PR details via the GitHub API
- Extracts content from
release-notecode blocks in PR descriptions - Categorizes entries by
kind/labels (breaking_change, feature, fix, deprecation, documentation, cleanup, install, bump)
To preview release notes locally — for example to sanity-check what an upcoming release will include — you can invoke the script directly:
GITHUB_TOKEN=<your_token> ./hack/generate-release-notes.sh -p v2.0.3 -c v2.1.0This writes _output/RELEASE_NOTES.md. Run ./hack/generate-release-notes.sh --help for all options.
Verify the release has been published to the releases page and contains the expected assets.
Follow the quickstart guide to ensure the steps work using the new release. Note: You need to manually replace the current version with the new version until the documentation is updated in the next step.
The Kgateway documentation must be updated to reference the new version.
If needed, clone the Kgateway.dev repo:
git clone -o $REMOTE https://github.com/kgateway-dev/kgateway.dev.git && cd kgateway.devBump the Kgateway version used by the docs. The following is an example of bumping from v2.0.3 to v2.0.4:
sed -i '' '1s/^2\.0\.3$/2.0.4/' assets/docs/versions/n-patch.mdOptionally, update the Gateway API version if Kgateway bumps this dependency. The following is an example of bumping Gateway API from v1.2.1 to v1.3.0:
GW_API_VERSION=$(cd ../kgateway && go list -m sigs.k8s.io/gateway-api | awk '{print $2}' | sed 's/^v//' && cd ../kgateway.dev)
sed -i '' "1s/.*/${GW_API_VERSION}/" assets/docs/versions/k8s-gw-version.mdThe kgateway.dev repo does not use branches to support documentation for previous versions. It uses versioned folders and conrefs. See PR 447 as an example of updating v2.0.4 to v2.0.5 when v2.1.0 was the latest release.
Sign, commit, and push the changes.
FORK=<name_of_my_fork>
git commit -s -m "Bumps Kgateway release version"
git push $FORKSubmit a pull request to merge the changes from your fork to the kgateway.dev upstream.
The following projects consume Kgateway and should be updated or an issue created to reference the new release (not required for a patch release):
- Create an issue and submit a pull request to llm-d-infra to bump the Kgateway version. See PR 146 as an example. Note The quickstart guide should be tested with the new Kgateway version before submitting the PR.