RELEASE.md
This page describes the release process and the currently planned schedule for upcoming releases as well as the respective release shepherd. Release shepherds are chosen on a voluntary basis.
Our goal is to provide a new minor release every 6 weeks. This is a new process and everything in this document is subject to change.
| release series | date of first pre-release (year-month-day) | release shepherd |
|---|---|---|
| v0.1.0 | 2019-07-31 | Chris Marchbanks (GitHub: @csmarchbanks) |
| v0.2.0 | 2019-08-28 | Goutham Veeramachaneni (Github: @gouthamve) |
| v0.3.0 | 2019-10-09 | Bryan Boreham (@bboreham) |
| v0.4.0 | 2019-11-13 | Tom Wilkie (@tomwilkie) |
| v0.5.0 | 2020-01-08 | Abandoned |
| v0.6.0 | 2020-01-22 | Marco Pracucci (@pracucci) |
| v0.7.0 | 2020-03-09 | Marco Pracucci (@pracucci) |
| v1.0.0 | 2020-03-31 | Goutham Veeramachaneni (@gouthamve) |
| v1.1.0 | 2020-05-11 | Peter Štibraný (@pstibrany) |
| v1.2.0 | 2020-06-24 | Bryan Boreham |
| v1.3.0 | 2020-08-03 | Marco Pracucci (@pracucci) |
| v1.4.0 | 2020-09-14 | Marco Pracucci (@pracucci) |
| v1.5.0 | 2020-10-26 | Chris Marchbanks (@csmarchbanks) |
| v1.6.0 | 2020-12-07 | Jacob Lisi (@jtlisi) |
| v1.7.0 | 2021-01-18 | Ken Haines (@khaines) |
| v1.8.0 | 2021-03-08 | Peter Štibraný (@pstibrany) |
| v1.9.0 | 2021-04-29 | Goutham Veeramachaneni (@gouthamve) |
| v1.10.0 | 2021-06-25 | Bryan Boreham (@bboreham) |
| v1.11.0 | 2021-08-06 | Marco Pracucci (@pracucci) |
| v1.12.0 | 2022-02-17 | Abandoned |
| v1.13.0 | 2022-06-23 | Alvin Lin (@alvinlin123) |
| v1.14.0 | 2022-11-15 | Alan Protasio (@alanprot) |
| v1.15.0 | 2023-03-27 | Ben Ye (@yeya24) |
| v1.16.0 | 2023-11-05 | Ben Ye (@yeya24) |
| v1.17.0 | 2024-04-25 | Ben Ye (@yeya24) |
| v1.18.0 | 2024-08-16 | Daniel Blando (@danielblando) |
| v1.19.0 | 2025-01-22 | Charlie Le (@charlietle) |
| v1.20.0 | 2025-10-31 | Ben Ye (@yeya24) |
| v1.21.0 | 2026-03-12 | Friedrich Gonzalez (@friedrichg) |
The release shepherd is responsible for the entire release series of a minor release, meaning all pre- and patch releases of a minor release. The process formally starts with the initial pre-release, but some preparations should be done a few days in advance.
-rc.0) and creates a new branch called release-<major>.<minor> starting at the commit tagged for the pre-release. In general, a pre-release is considered a release candidate (that's what rc stands for) and should therefore not contain any known bugs that are planned to be fixed in the final release.-rc.1, -rc.2, etc.).See the next section for details on cutting an individual release.
We use Semantic Versioning.
We maintain a separate branch for each minor release, named release-<major>.<minor>, e.g. release-1.1, release-2.0.
The usual flow is to merge new features and changes into the master branch and to merge bug fixes into the latest release branch. Bug fixes are then merged into master from the latest release branch. The master branch should always contain all commits from the latest release branch. As long as master hasn't deviated from the release branch, new commits can also go to master, followed by merging master back into the release branch.
If a bug fix got accidentally merged into master after non-bug-fix changes in master, the bug-fix commits have to be cherry-picked into the release branch, which then have to be merged back into master. Try to avoid that situation.
Maintaining the release branches for older minor releases happens on a best effort basis.
This helps ongoing PRs to get their changes in the right place, and to consider whether they need cherry-picked.
CHANGELOG.md on master
master and move the CHANGELOG entry to the top under ## master / unreleasedFor a new major or minor release, create the corresponding release branch based on the master branch. For a patch release, work in the branch of the minor release you want to patch.
To prepare release branch, first create new release branch (release-X.Y) in Cortex repository from master commit of your choice, and then do the following steps on a private branch (prepare-release-X.Y) and send PR to merge this private branch to the new release branch (prepare-release-X.Y -> release-X.Y).
git tag will be signed with that GPG key)
VERSION file to say "X.Y-rc.0"CHANGELOG.md
[CHANGE][FEATURE][ENHANCEMENT][BUGFIX]./tools/release/check-changelog.sh LAST-RELEASE-TAG...master and add any missing PR which includes user-facing changesOnce your PR with release preparation is approved, merge it to "release-X.Y" branch, and continue with publishing.
To publish a release candidate:
VERSION file has the -rc.X suffix (X starting from 0)git tag the new release (see How to tag a release) from release branch.make dist and attach them to the releasemake packages, test them with make test-packages and attach them to the releaseTo publish a stable release:
VERSION file has no -rc.X suffixdocs/getting-started/.envgit tag the new release (see How to tag a release) from release branch.make dist and attach them to the releasemake packages, test them with make test-packages and attach them to the releaserelease-x.y to master
merge-release-X.Y-to-master branch from release-X.Y branch locallymaster branch into your merge-release-X.Y-to-master and resolve conflictsmerge-release-X.Y-to-master branch into mastermerge-release-X.Y-to-master branch into master, and pushing resulting master to upstream repository. This doesn't break master branch protection, since PR has been approved already, and it also doesn't require removing the protection.integration/backward_compatibility_test.go)cd to an empty directory not within the project directorymkdir sbombom generate -o sbom/go-mod.spdx -n https://github.com/cortexproject/cortex -d <cortex repo>bom generate -o sbom/cortex-container-image.spdx -n https://github.com/cortexproject/cortex -i quay.io/cortexproject/cortex:<release tag>bom generate -o sbom/query-tee-container-image.spdx -n https://github.com/cortexproject/cortex -i quay.io/cortexproject/query-tee:<release tag>tar -zcvf sbom.tar.gz sbomcurl -H "Authorization: Bearer <your GitHub API token>" -s https://api.github.com/repos/cortexproject/cortex/releases/tags/<release tag> \
| grep "browser_download_url" \
| cut -d: -f2- \
| tr -d "\"" \
| wget -qi -
find . -maxdepth 1 -type f | xargs -L 1 gpg --armor --detach-signsbom.tar.gz to the release.asc files to the releasesign.pub which contains the public key of the PGP key you used to sign the binaries
gpg --armor --export <[email protected]>Every release is tagged with v<major>.<minor>.<patch>, e.g. v0.1.3. Note the v prefix.
You can do the tagging on the commandline:
$ tag=$(< VERSION)
$ git tag -s "v${tag}" -m "v${tag}"
$ git push origin "v${tag}"