<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Flux – Flux releases</title><link>https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/</link><description>Recent content in Flux releases on Flux</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/index.xml" rel="self" type="application/rss+xml"/><item><title>Flux: Flux controller releases</title><link>https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/controllers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/controllers/</guid><description>
&lt;p>The Flux controllers are
&lt;a href="https://kubernetes.io/docs/concepts/extend-kubernetes/operator/" target="_blank">Kubernetes operators&lt;/a>,
each controller has its own Git repository and release cycle (see below for details).&lt;/p>
&lt;p>Controller repositories and their interdependencies:&lt;/p>
&lt;ol>
&lt;li>
&lt;a href="https://github.com/fluxcd/source-controller" target="_blank">source-controller&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://github.com/fluxcd/kustomize-controller" target="_blank">kustomize-controller&lt;/a> (imports &lt;code>fluxcd/source-controller/api&lt;/code>)&lt;/li>
&lt;li>
&lt;a href="https://github.com/fluxcd/helm-controller" target="_blank">helm-controller&lt;/a> (imports &lt;code>fluxcd/source-controller/api&lt;/code>)&lt;/li>
&lt;li>
&lt;a href="https://github.com/fluxcd/notification-controller" target="_blank">notification-controller&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://github.com/fluxcd/image-reflector-controller" target="_blank">image-reflector-controller&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://github.com/fluxcd/image-automation-controller" target="_blank">image-automation-controller&lt;/a> (imports &lt;code>fluxcd/source-controller/api&lt;/code> and &lt;code>fluxcd/image-reflector-controller/api&lt;/code>)&lt;/li>
&lt;/ol>
&lt;h2 id="api-versioning">API versioning&lt;/h2>
&lt;p>The Flux APIs (Kubernetes CRDs) follow the
&lt;a href="https://kubernetes.io/docs/reference/using-api/#api-versioning" target="_blank">Kubernetes API versioning&lt;/a> scheme.&lt;/p>
&lt;h3 id="alpha-version">Alpha version&lt;/h3>
&lt;p>An alpha version API e.g. &lt;code>v1alpha1&lt;/code> is considered experimental and should be used on
test environments only.&lt;/p>
&lt;p>The schema of objects may change in incompatible ways in a later API version.
The Custom Resources may require editing and re-creating after a CRD update.&lt;/p>
&lt;p>An alpha version API becomes deprecated once a subsequent alpha or beta API version is released.
A deprecated alpha version is subject to removal after a three month period.&lt;/p>
&lt;p>An alpha API is introduced when its proposal reaches the &lt;code>implementable&lt;/code> phase in the
&lt;a href="https://github.com/fluxcd/flux2/tree/main/rfcs" target="_blank">Flux RFC process&lt;/a>.
We encourage users to try out the alpha APIs and provide feedback
(e.g. on CNCF Slack or in the form of GitHub issues/discussions)
which is extremely valuable during early stages of development.&lt;/p>
&lt;h3 id="beta-version">Beta version&lt;/h3>
&lt;p>A beta version API e.g. &lt;code>v2beta1&lt;/code> is considered well-tested and safe to use in production.&lt;/p>
&lt;p>The schema of objects may change in incompatible ways in a subsequent beta or stable API version.
The Custom Resources may require editing after a CRD update for which migration instructions will be
provided as part of the controller changelog.&lt;/p>
&lt;p>A beta version API becomes deprecated once a subsequent beta or stable API version is released.
A deprecated beta version is subject to removal after a six-months period.&lt;/p>
&lt;h3 id="stable-version">Stable version&lt;/h3>
&lt;p>A stable API version, e.g. &lt;code>v2&lt;/code>, is considered feature complete.&lt;/p>
&lt;p>Any changes to the object schema do not require editing or re-creating of Custom Resources.
Schema fields can&amp;rsquo;t be removed, only new fields can be added with a default value that
doesn&amp;rsquo;t affect the controller&amp;rsquo;s current behaviour.&lt;/p>
&lt;p>A stable API version becomes deprecated once a subsequent stable version is released.
Stable API versions are not subject to removal in any future release within a controller major version.&lt;/p>
&lt;p>In effect, this means that for as long as Flux &lt;code>v2&lt;/code> is being maintained, all the stable API versions
will be supported.&lt;/p>
&lt;h2 id="controller-versioning">Controller versioning&lt;/h2>
&lt;p>The Flux controllers and their Go API packages are released by following the
&lt;a href="https://go.dev/doc/modules/version-numbers" target="_blank">Go module version numbering&lt;/a> conventions:&lt;/p>
&lt;ul>
&lt;li>&lt;code>vX.Y.Z-rc.W&lt;/code> release candidates e.g. &lt;code>v1.0.0-rc.1&lt;/code>&lt;/li>
&lt;li>&lt;code>vX.Y.Z&lt;/code> stable releases e.g. &lt;code>v1.0.0&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>The Flux project maintains release branches for the most recent three minor releases
of each controller e.g. &lt;code>release/v1.0.x&lt;/code>, &lt;code>release/v1.1.x&lt;/code> and &lt;code>release/v1.2.x&lt;/code>.&lt;/p>
&lt;p>The API versioning and controller versioning are indirectly related. For example,
a source-controller minor release &lt;code>v1.1.0&lt;/code> can introduce a new API version
&lt;code>v1beta1&lt;/code> for a Kind &lt;code>XRepository&lt;/code> in the &lt;code>source.toolkit.fluxcd.io&lt;/code> group.&lt;/p>
&lt;h3 id="release-candidates">Release candidates&lt;/h3>
&lt;p>Release candidates are intended for testing new features or improvements before a final release.&lt;/p>
&lt;p>In most cases, a maintainer will publish a release candidate of a controller for Flux users
to tests it on their staging clusters. Release candidates are not meant to be deployed in production
unless advised to do so by a maintainer.&lt;/p>
&lt;h3 id="patch-releases">Patch releases&lt;/h3>
&lt;p>Patch releases are intended for critical bug fixes to the latest minor version, such as addressing security
vulnerabilities or fixes to severe problems with no workaround.&lt;/p>
&lt;p>Patch releases do not contain breaking changes, feature additions or any type of user-facing changes.
If a security fix requires a breaking change, then a minor release will provide the fix.&lt;/p>
&lt;p>We expect users to be running the latest patch release of a given minor release as soon as the
controller release is included in a Flux patch release.&lt;/p>
&lt;h3 id="minor-releases">Minor releases&lt;/h3>
&lt;p>Minor releases are intended for backwards compatible feature additions and improvements.
Note that breaking changes may occur if required by a security vulnerability fix.&lt;/p>
&lt;p>In addition, minor releases are used when updating Kubernetes dependencies such
as &lt;code>k8s.io/api&lt;/code> from one minor version to another.&lt;/p>
&lt;p>In effect, this means a controller minor version will be released at least every four months, after each
Kubernetes minor version release. For in-depth information about this, please refer to the
&lt;a href="#release-cadence">release cadence&lt;/a> section of this document.&lt;/p>
&lt;h3 id="major-releases">Major releases&lt;/h3>
&lt;p>Major releases are intended for drastic changes in the controller behaviour or security stance.&lt;/p>
&lt;p>A controller major release will be announced ahead of time throughout all communication channels,
and a support window of one year will be provided for the previous major version.&lt;/p>
&lt;h2 id="release-cadence">Release cadence&lt;/h2>
&lt;p>Flux controllers are &lt;em>at least&lt;/em> released at the same rate as Kubernetes, following their cadence of three
minor releases per year.&lt;/p>
&lt;p>To properly validate the controllers against the latest Kubernetes version,
we typically allocate a time window of around two weeks for end-to-end testing of Flux controllers.
The newly released controllers offer support for Kubernetes N-2 minor versions.&lt;/p>
&lt;p>It is worth noting that in certain scenarios where project dependencies are not in sync with
the Kubernetes version or conflicts arise, this two-week timeframe may prove insufficient,
requiring additional time to address the issues appropriately.&lt;/p>
&lt;p>A Flux controller may have more than three minor releases per year, if maintainers decide to ship a
new feature or optimisation ahead of schedule.&lt;/p>
&lt;h2 id="supported-releases">Supported releases&lt;/h2>
&lt;p>For Flux controllers we support the last three minor releases.&lt;/p>
&lt;p>Security fixes may be back-ported to those three minor versions as patch releases,
depending on severity and feasibility.&lt;/p>
&lt;p>Note that back-porting is provided by the community on a best-effort basis.&lt;/p>
&lt;h2 id="release-artifacts">Release artifacts&lt;/h2>
&lt;p>Each controller release produces the following artifacts:&lt;/p>
&lt;ul>
&lt;li>Source code (GitHub Releases page)&lt;/li>
&lt;li>Software Bill of Materials in SPDX format (GitHub Releases page)&lt;/li>
&lt;li>SLSA provenance attestations (GitHub Releases page)&lt;/li>
&lt;li>Kubernetes manifests such as CRDs and Deployments (GitHub Releases page)&lt;/li>
&lt;li>Signed checksums of source code, SBOM and manifests (GitHub Releases page)&lt;/li>
&lt;li>Multi-arch container images (GitHub Container Registry and DockerHub)&lt;/li>
&lt;/ul>
&lt;p>All the artifacts are cryptographically signed and can be verified with Cosign and GitHub OIDC.&lt;/p>
&lt;p>The release artifacts can be accessed based on the controller name and version.&lt;/p></description></item><item><title>Flux: Flux shared packages releases</title><link>https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/packages/</guid><description>
&lt;p>The Go packages in
&lt;a href="https://github.com/fluxcd/pkg" target="_blank">github.com/fluxcd/pkg&lt;/a> are dedicated Go modules,
each module has its own set of dependencies and release cycle.&lt;/p>
&lt;p>These packages are primarily meant for internal use in Flux controllers and
for projects which integrate and/or extend Flux.&lt;/p>
&lt;h2 id="release-versioning">Release versioning&lt;/h2>
&lt;p>The Flux packages are released by following the
&lt;a href="https://go.dev/doc/modules/version-numbers" target="_blank">Go module version numbering&lt;/a> conventions:&lt;/p>
&lt;ul>
&lt;li>&lt;code>NAME/vX.Y.Z-rc.W&lt;/code> release candidates e.g. &lt;code>runtime/v1.0.0-rc.1&lt;/code>&lt;/li>
&lt;li>&lt;code>NAME/vX.Y.Z&lt;/code> stable releases e.g. &lt;code>runtime/v1.0.0&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>To import or update a Flux package in a Go project:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>go get github.com/fluxcd/pkg/runtime@v1.0.0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="release-candidates">Release candidates&lt;/h3>
&lt;p>Release candidates are intended for testing new features or improvements.&lt;/p>
&lt;p>In most cases, a maintainer will cut a release candidate of a package to include it
in a Flux controller release candidate.&lt;/p>
&lt;p>Release candidates are not meant to be included in Flux stable releases.
Before cutting a stable release of a controller, all imported Flux packages must be pinned to a stable version.&lt;/p>
&lt;h3 id="patch-releases">Patch releases&lt;/h3>
&lt;p>Patch releases are intended for critical bug fixes to the latest minor version, such as addressing security
vulnerabilities or fixes to severe problems with no workaround.&lt;/p>
&lt;p>Patch releases should not contain breaking changes, feature additions or any type of improvements.&lt;/p>
&lt;p>Patch releases should be used when updating dependencies such as &lt;code>k8s.io/api&lt;/code> from one patch version to another.&lt;/p>
&lt;h3 id="minor-releases">Minor releases&lt;/h3>
&lt;p>Minor releases are intended for backwards compatible feature additions and improvements.&lt;/p>
&lt;p>Minor releases should be used when updating dependencies such as &lt;code>k8s.io/api&lt;/code> from one minor version to another.
If a
&lt;a href="https://github.com/kubernetes/sig-release/blob/master/release-engineering/versioning.md" target="_blank">Kubernetes minor version&lt;/a>
upgrade requires a breaking change (e.g. removal of an API such as &lt;code>PodSecurityPolicy&lt;/code>) in a Flux package public API,
then a major version release is necessary.&lt;/p>
&lt;h3 id="major-releases">Major releases&lt;/h3>
&lt;p>Major releases are intended for backwards incompatible feature additions and improvements.&lt;/p>
&lt;p>Any change to a package public API, such as a change to a Go function signature, requires a new major release.&lt;/p>
&lt;h2 id="supported-releases">Supported releases&lt;/h2>
&lt;p>For Flux Go packages we only support the latest stable release. We expect for projects that depend on
Flux packages to stay up-to-date by automating the Go modules updates with tools like Dependabot.&lt;/p>
&lt;p>In effect, this means we&amp;rsquo;ll not backport CVE fixes to an older minor or major version of a package.&lt;/p>
&lt;h2 id="deprecation-policy">Deprecation policy&lt;/h2>
&lt;p>A Flux Go package can be deprecated at any time. Usually a deprecated package may be replaced a
different one, but there are no guarantees to always have a suitable replacement.&lt;/p>
&lt;p>A deprecated package is marked as so in its &lt;code>go.mod&lt;/code> e.g.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic">// Deprecated: use github.com/fluxcd/pkg/tar instead.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic">&lt;/span>module github.com&lt;span style="color:#666">/&lt;/span>fluxcd&lt;span style="color:#666">/&lt;/span>pkg&lt;span style="color:#666">/&lt;/span>untar
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Flux: Flux release procedures</title><link>https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/procedure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/procedure/</guid><description>
&lt;p>This document provides an overview of the release procedures for each component
type in the Flux project. It is intended for project maintainers, but may also
be useful for contributors who want to understand the release process.&lt;/p>
&lt;p>If you have any questions, please reach out to another maintainer for
clarification.&lt;/p>
&lt;h2 id="table-of-contents">Table of contents&lt;/h2>
&lt;ul>
&lt;li>
&lt;a href="#general-rules">General rules&lt;/a>
&lt;ul>
&lt;li>
&lt;a href="#signing-releases">Signing releases&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;a href="#component-types">Component types&lt;/a>
&lt;ul>
&lt;li>
&lt;a href="#shared-packages">Shared packages&lt;/a>&lt;/li>
&lt;li>
&lt;a href="#controllers">Controllers&lt;/a>
&lt;ul>
&lt;li>
&lt;a href="#controllers-minor-releases">Minor releases&lt;/a>&lt;/li>
&lt;li>
&lt;a href="#controllers-patch-releases">Patch releases&lt;/a>&lt;/li>
&lt;li>
&lt;a href="#controllers-release-candidates">Release candidates&lt;/a>&lt;/li>
&lt;li>
&lt;a href="#controllers-preview-releases">Preview releases&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;a href="#distribution">Distribution&lt;/a>
&lt;ul>
&lt;li>
&lt;a href="#distribution-minor-releases">Minor releases&lt;/a>&lt;/li>
&lt;li>
&lt;a href="#distribution-minor-release-website">Minor release website&lt;/a>&lt;/li>
&lt;li>
&lt;a href="#distribution-patch-releases">Patch releases&lt;/a>&lt;/li>
&lt;li>
&lt;a href="#distribution-release-candidates">Release candidates&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;a href="#backport-changes-for-patch-releases">Backport changes for patch releases&lt;/a>
&lt;ul>
&lt;li>
&lt;a href="#manual-backporting">Manual backporting&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="general-rules">General rules&lt;/h2>
&lt;h3 id="signing-releases">Signing releases&lt;/h3>
&lt;p>To ensure the integrity and authenticity of releases, all releases must be
signed with a GPG key. The public key must be uploaded to the GitHub account of
the maintainer, and the private key must be kept secure.&lt;/p>
&lt;p>In addition, we recommend the following practices:&lt;/p>
&lt;ol>
&lt;li>Safeguard your GPG private key, preferably using a hardware security key
like a YubiKey.&lt;/li>
&lt;li>Use a subkey dedicated to signing releases, set an expiration date for
added security, and keep the master key offline. Refer to
&lt;a href="https://riseup.net/en/security/message-security/openpgp/best-practices#key-configuration" target="_blank">this guide&lt;/a>
for detailed instructions.&lt;/li>
&lt;/ol>
&lt;p>We understand that this may seem overwhelming. If you are not comfortable with
the process, don&amp;rsquo;t hesitate to seek assistance from another maintainer who has
experience with signing releases.&lt;/p>
&lt;p>Please note that SSH signatures are not supported at this time due to limited
availability of SSH signature verification outside the &lt;code>git&lt;/code> CLI.&lt;/p>
&lt;h2 id="component-types">Component types&lt;/h2>
&lt;h3 id="shared-packages">Shared packages&lt;/h3>
&lt;p>To release a
&lt;a href="https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/packages/">package&lt;/a> as a project maintainer, follow these steps:&lt;/p>
&lt;ol>
&lt;li>Tag the &lt;code>main&lt;/code> branch using SemVer.&lt;/li>
&lt;li>Sign the tag according to the
&lt;a href="#general-rules">general rules&lt;/a>.&lt;/li>
&lt;li>Push the signed tag to the upstream repository.&lt;/li>
&lt;/ol>
&lt;p>Use the following commands as an example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git clone https://github.com/fluxcd/pkg.git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git switch main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git tag -s -m &lt;span style="color:#4070a0">&amp;#34;&amp;lt;module&amp;gt;/&amp;lt;semver&amp;gt;&amp;#34;&lt;/span> &lt;span style="color:#4070a0">&amp;#34;&amp;lt;module&amp;gt;/&amp;lt;semver&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin &lt;span style="color:#4070a0">&amp;#34;&amp;lt;module&amp;gt;/&amp;lt;semver&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In the commands above, &lt;code>&amp;lt;module&amp;gt;&lt;/code> represents the relative path to the directory
containing the &lt;code>go.mod&lt;/code> file, and &lt;code>&amp;lt;semver&amp;gt;&lt;/code> refers to the SemVer version of the
release. For instance, &lt;code>runtime/v1.0.0&lt;/code> for
&lt;a href="https://github.com/fluxcd/pkg/tree/main/runtime" target="_blank">&lt;code>fluxcd/pkg/runtime&lt;/code>&lt;/a>,
or &lt;code>http/fetch/v0.1.0&lt;/code> for
&lt;a href="https://github.com/fluxcd/pkg/tree/main/http/fetch" target="_blank">&lt;code>fluxcd/pkg/http/fetch&lt;/code>&lt;/a>.&lt;/p>
&lt;p>Before cutting a release candidate, ensure that the package&amp;rsquo;s tests pass
successfully.&lt;/p>
&lt;p>Here&amp;rsquo;s an example of releasing a candidate from a feature branch:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git switch &amp;lt;feature-branch&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git tag -s -m &lt;span style="color:#4070a0">&amp;#34;&amp;lt;module&amp;gt;/&amp;lt;semver&amp;gt;-&amp;lt;feature&amp;gt;.1&amp;#34;&lt;/span> &lt;span style="color:#4070a0">&amp;#34;&amp;lt;module&amp;gt;/&amp;lt;semver&amp;gt;-&amp;lt;feature&amp;gt;.1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin &lt;span style="color:#4070a0">&amp;#34;&amp;lt;module&amp;gt;/&amp;lt;semver&amp;gt;-&amp;lt;feature&amp;gt;.1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="controllers">Controllers&lt;/h3>
&lt;p>To release a
&lt;a href="https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/controllers/">controller&lt;/a> as a project maintainer, follow the
steps below. Note that the release procedure differs depending on the type of
release.&lt;/p>
&lt;h5 id="controllers-minor-releases">Controllers: minor releases&lt;/h5>
&lt;ol>
&lt;li>
&lt;p>Checkout the &lt;code>main&lt;/code> branch and pull changes from the remote repository.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Create a &amp;ldquo;release series&amp;rdquo; branch for the next minor SemVer range, e.g.,
&lt;code>release/v1.2.x&lt;/code>, and push it to the remote repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git switch -c release/v1.2.x main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin release/v1.2.x
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>From the release series branch, create a release preparation branch for the
specific release.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git switch -c release-v1.2.0 release/v1.2.x
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Add an entry to &lt;code>CHANGELOG.md&lt;/code> for the new release and commit the changes.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>vim CHANGELOG.md
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git add CHANGELOG.md
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git commit -s -m &lt;span style="color:#4070a0">&amp;#34;Add changelog entry for v1.2.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Update &lt;code>github.com/fluxcd/&amp;lt;name&amp;gt;-controller/api&lt;/code> version in &lt;code>go.mod&lt;/code> and
&lt;code>newTag&lt;/code> value in &lt;code>config/manager/kustomization.yaml&lt;/code> to the target SemVer
(e.g., &lt;code>v1.2.0&lt;/code>). Commit and push the changes.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>vim go.mod
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>vim config/manager/kustomization.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git add go.mod config/manager/kustomization.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git commit -s -m &lt;span style="color:#4070a0">&amp;#34;Release v1.2.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin release-v1.2.0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Create a pull request for the release branch and merge it into the release
series branch (e.g., &lt;code>release/v1.2.x&lt;/code>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Create &lt;code>api/&amp;lt;next semver&amp;gt;&lt;/code> and &lt;code>&amp;lt;next semver&amp;gt;&lt;/code> tags for the merge commit in
&lt;code>release/v1.2.x&lt;/code>. Ensure the tags are signed according to the
&lt;a href="#general-rules">general
rules&lt;/a>, and push them to the remote repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git switch release/v1.2.x
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git pull origin release/v1.2.x
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git tag -s -m &lt;span style="color:#4070a0">&amp;#34;api/v1.2.0&amp;#34;&lt;/span> api/v1.2.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin api/v1.2.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git tag -s -m &lt;span style="color:#4070a0">&amp;#34;v1.2.0&amp;#34;&lt;/span> v1.2.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin v1.2.0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Confirm that the CI builds and releases the newly tagged version.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Create a pull request for the release series branch and merge it into &lt;code>main&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Add the &lt;code>backport/v1.2.x&lt;/code> label to &lt;code>.github/labels.yaml&lt;/code> and create a pull request against &lt;code>main&lt;/code>.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h5 id="controllers-patch-releases">Controllers: patch releases&lt;/h5>
&lt;ol>
&lt;li>
&lt;p>Ensure everything to be included in the release is backported to the
&amp;ldquo;release series&amp;rdquo; branch (e.g., &lt;code>release/v1.2.x&lt;/code>). If not, refer to the
&lt;a href="#backport-changes-for-patch-releases">backporting&lt;/a> section.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>From the release series branch, create a release preparation branch for the
specific patch release.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git switch release/v1.2.x
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git pull origin release/v1.2.x
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git switch -c release-v1.2.1 release/v1.2.x
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Add an entry to &lt;code>CHANGELOG.md&lt;/code> for the new release and commit the changes.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>vim CHANGELOG.md
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git add CHANGELOG.md
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git commit -s -m &lt;span style="color:#4070a0">&amp;#34;Add changelog entry for v1.2.1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Update &lt;code>github.com/fluxcd/&amp;lt;name&amp;gt;-controller/api&lt;/code> version in &lt;code>go.mod&lt;/code> and
&lt;code>newTag&lt;/code> value in &lt;code>config/manager/kustomization.yaml&lt;/code> to the target SemVer
(e.g., &lt;code>v1.2.1&lt;/code>). Commit and push the changes.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>vim go.mod
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>vim config/manager/kustomization.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git add go.mod config/manager/kustomization.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git commit -s -m &lt;span style="color:#4070a0">&amp;#34;Release v1.2.1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin release-v1.2.1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Create a pull request for the release branch and merge it into the release
series branch (e.g., &lt;code>release/v1.2.x&lt;/code>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Create &lt;code>api/&amp;lt;next semver&amp;gt;&lt;/code> and &lt;code>&amp;lt;next semver&amp;gt;&lt;/code> tags for the merge commit in
&lt;code>release/v1.2.x&lt;/code>. Ensure the tags are signed according to the
&lt;a href="#general-rules">general
rules&lt;/a>, and push them to the remote repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git switch release/v1.2.x
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git pull origin release/v1.2.x
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git tag -s -m &lt;span style="color:#4070a0">&amp;#34;api/v1.2.1&amp;#34;&lt;/span> api/v1.2.1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin api/v1.2.1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git tag -s -m &lt;span style="color:#4070a0">&amp;#34;v1.2.1&amp;#34;&lt;/span> v1.2.1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin v1.2.1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Confirm that the CI builds and releases the newly tagged version.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Cherry-pick the changelog entry from the release series branch and create a
pull request to merge it into &lt;code>main&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git switch main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git pull origin main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git switch -c pick-changelog-v1.2.1 main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git cherry-pick -x &amp;lt;commit hash&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin pick-changelog-v1.2.1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h4 id="controllers-release-candidates">Controllers: release candidates&lt;/h4>
&lt;p>In some cases, it may be necessary to release a
&lt;a href="https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/controllers/#release-candidates">release
candidate&lt;/a> of a controller.&lt;/p>
&lt;p>To create a first release candidate, follow the steps to create a
&lt;a href="#controllers-minor-releases">minor
release&lt;/a>, but use the &lt;code>rc.X&lt;/code> suffix for SemVer
version to release (e.g., &lt;code>v1.2.0-rc.1&lt;/code>).&lt;/p>
&lt;p>Once the release series branch is created, subsequent release candidates and
the final (non-RC) release should follow the procedure for
&lt;a href="#controllers-patch-releases">patch controller
releases&lt;/a>.&lt;/p>
&lt;h4 id="controllers-preview-releases">Controllers: preview releases&lt;/h4>
&lt;p>In some cases, it may be necessary to release a preview of a controller.
A preview release is a release that is not intended for production use, but
rather to allow users to quickly test new features or an intended bug fix, and
provide feedback.&lt;/p>
&lt;p>Preview releases are made by triggering the &lt;code>release&lt;/code> GitHub Actions workflow on
a specific Git branch. This workflow will build the container image, sign it
using Cosign, and push it to the registry. But it does not require a Git tag,
GitHub release, or a changelog entry.&lt;/p>
&lt;p>To create a preview release, follow the steps below.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Navigate to &lt;code>https://github.com/fluxcd/&amp;lt;name&amp;gt;-controller/actions/workflows/release.yml&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Click the &lt;code>Run workflow&lt;/code> button.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Select the branch to release from the &lt;code>Branch&lt;/code> dropdown.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The default values for the &lt;code>image tag&lt;/code> (&lt;code>preview&lt;/code>) should be correct, but can
be changed if necessary.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Click the green &lt;code>Run workflow&lt;/code> button.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The workflow will now run, and the container image will be pushed to the
registry. Once the workflow has completed, the image reference will be
available in the logs, and can be shared in the relevant issue or pull
request.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="distribution">Distribution&lt;/h3>
&lt;p>To release a
&lt;a href="https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/">Flux distribution&lt;/a> as a project maintainer, follow the
steps below.&lt;/p>
&lt;p>Note that the Flux distribution contains multiple components, and you may need
to release
&lt;a href="#controllers">controllers&lt;/a> before releasing the distribution.
Automation is in place to automatically create a pull request to update the
version in the &lt;code>main&lt;/code> branch when a new controller version is released.&lt;/p>
&lt;h4 id="distribution-minor-releases">Distribution: minor releases&lt;/h4>
&lt;ol>
&lt;li>
&lt;p>Ensure everything to be included in the release is merged into the &lt;code>main&lt;/code>
branch, including any controller releases you wish to include in the
release.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Create a &amp;ldquo;release series&amp;rdquo; branch for the next minor SemVer range, e.g.,
&lt;code>release/v2.2.x&lt;/code>, and push it to the remote repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git switch -c release/v2.2.x main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Prepare the required release notes for this release, see
&lt;a href="#distribution-release-notes">release
notes&lt;/a> for more information.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Tag the release series branch with the SemVer version of the release, e.g.,
&lt;code>v1.2.0&lt;/code>. Ensure the tag is signed according to the
&lt;a href="#general-rules">general
rules&lt;/a>, and push it to the remote repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git tag -s -m &lt;span style="color:#4070a0">&amp;#34;v2.2.0&amp;#34;&lt;/span> v2.2.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin v2.2.0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Confirm that the CI builds and releases the newly tagged version.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Once the release is complete, update the release notes on GitHub with the
release notes prepared in step 3.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Post a message in the
&lt;a href="https://cloud-native.slack.com/archives/CLAJ40HV3" target="_blank">&lt;code>#flux&lt;/code> CNCF Slack channel&lt;/a>
announcing the release, and pin it.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Add the &lt;code>backport/v2.2.x&lt;/code> label to &lt;code>.github/labels.yaml&lt;/code> and create a pull request against &lt;code>main&lt;/code>.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h5 id="distribution-minor-release-website">Distribution: minor release website&lt;/h5>
&lt;p>The website at
&lt;a href="https://fluxcd.io" target="_blank">fluxcd.io&lt;/a> always reflects the latest Flux minor version. Each Flux minor release is
reflected by a respective branch in the
&lt;a href="https://github.com/fluxcd/website" target="_blank">website repo&lt;/a>, i.e. for Flux 2.3, the
website is deployed from the branch
&lt;a href="https://github.com/fluxcd/website/tree/v2-3" target="_blank">v2-3&lt;/a>. The website&amp;rsquo;s &lt;code>main&lt;/code> branch
reflects the next Flux minor release and is used for development. The website for that branch is hosted at
&lt;a href="https://main.docs.fluxcd.io" target="_blank">https://main.docs.fluxcd.io&lt;/a>. For older Flux versions, the website is hosted at
https://v2-&lt;em>MINOR&lt;/em>.docs.fluxcd.io/.&lt;/p>
&lt;p>The following instructions assume you&amp;rsquo;re updating the website for the Flux release v2.N:&lt;/p>
&lt;ol>
&lt;li>Check out the &lt;code>main&lt;/code> branch in the
&lt;a href="https://github.com/fluxcd/website/" target="_blank">website repo&lt;/a> and apply the following
changes to the &lt;code>hugo.yaml&lt;/code> file:
&lt;ol>
&lt;li>Add the following entry to &lt;code>params.versions&lt;/code>:
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>- &lt;span style="color:#062873;font-weight:bold">version&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#4070a0">&amp;#34;v2.N&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">url&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>https://fluxcd.io&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>Edit the existing &lt;code>params.versions&lt;/code> entry pointing to &lt;code>https://fluxcd.io&lt;/code> to point to
&lt;code>https://v2-(N-1).docs.fluxcd.io&lt;/code>&lt;/li>
&lt;li>Remove the oldest entry from &lt;code>params.versions&lt;/code>. We only support N-2 releases.&lt;/li>
&lt;li>Do not set &lt;code>params.version&lt;/code> - this string is used by the other branches only, and setting it here will likely cause automatic backports to fail with a conflict.&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>In &lt;code>.github/labels.yaml&lt;/code> add an entry for the &lt;code>backport:v2-N&lt;/code> label by copying the existing &lt;code>backport:v2-(N-1)&lt;/code> one.&lt;/li>
&lt;li>Commit the changes and create a PR for the &lt;code>main&lt;/code> branch.&lt;/li>
&lt;li>As soon as the PR is merged, create the &amp;ldquo;v2-N&amp;rdquo; branch from &lt;code>main&lt;/code>:
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git checkout main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git pull
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git checkout -b v2-N
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin HEAD:v2-N
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>Apply the labels &lt;code>backport:v2-(N-1)&lt;/code> and &lt;code>backport:v2-(N-2)&lt;/code> to the PR created above so that the
&lt;code>hugo.yaml&lt;/code> file gets updated in the older versions&amp;rsquo; websites. This step will lead to 2 PRs being
automatically created for the two last supported release branches of the website. &lt;strong>Do not merge these
PRs, yet!&lt;/strong>&lt;/li>
&lt;li>In the PR for the &lt;code>v2-(N-1)&lt;/code> branch, edit the &lt;code>hugo.yaml&lt;/code> file and set &lt;code>params.archived_version&lt;/code> to &lt;code>true&lt;/code>.&lt;/li>
&lt;li>Go to
&lt;a href="https://app.netlify.com/sites/fluxcd/configuration/deploys#branches-and-deploy-contexts" target="_blank">https://app.netlify.com/sites/fluxcd/configuration/deploys#branches-and-deploy-contexts&lt;/a>&lt;/li>
&lt;li>Click on &amp;ldquo;Configure&amp;rdquo;&lt;/li>
&lt;li>In &amp;ldquo;Production branch&amp;rdquo;, change the value from &lt;code>v2-(N-1)&lt;/code> to &lt;code>v2-N&lt;/code>.&lt;/li>
&lt;li>In &amp;ldquo;Additional branches&amp;rdquo; add the &amp;ldquo;v2-(N-1)&amp;rdquo; branch.&lt;/li>
&lt;li>Click &amp;ldquo;Save&amp;rdquo;.&lt;/li>
&lt;li>Now merge the 2 PRs created by the labels you applied in the previous step.&lt;/li>
&lt;li>Create another PR against the &lt;code>main&lt;/code> branch to:
&lt;ol>
&lt;li>Update the &lt;code>trigger_branch&lt;/code> URL query parameter in the file &lt;code>.github/workflows/netlify.yml&lt;/code> to point to &amp;ldquo;v2-N&amp;rdquo;.&lt;/li>
&lt;li>Update the website announcement banner in the file &lt;code>content/en/_index.html&lt;/code> to point to the blog post of
the new release, and change the string right below from &lt;code>Announcing Flux 2.N-1 GA&lt;/code> to
&lt;code>Announcing Flux 2.N GA&lt;/code>.&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>Merge the PR and backport to the &lt;code>v2-N&lt;/code> branch by applying the &lt;code>backport:v2-N&lt;/code> label to the PR.
&lt;ol>
&lt;li>In the backport PR, set the &lt;code>params.version&lt;/code> string to the version &lt;code>2.N&lt;/code>.&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;h4 id="distribution-patch-releases">Distribution: patch releases&lt;/h4>
&lt;ol>
&lt;li>
&lt;p>Ensure everything to be included in the release is backported to the
&amp;ldquo;release series&amp;rdquo; branch (e.g., &lt;code>release/v2.2.x&lt;/code>). If not, refer to the
&lt;a href="#backport-changes-for-patch-releases">backporting&lt;/a> section.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Prepare the required release notes for this release, see
&lt;a href="#distribution-release-notes">release
notes&lt;/a> for more information.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Tag the release series branch with the SemVer version of the release, e.g.,
&lt;code>v2.2.1&lt;/code>. Ensure the tag is signed according to the
&lt;a href="#general-rules">general
rules&lt;/a>, and push it to the remote repository.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git tag -s -m &lt;span style="color:#4070a0">&amp;#34;v2.2.1&amp;#34;&lt;/span> v2.2.1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin v2.2.1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Confirm that the CI builds and releases the newly tagged version.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Once the release is complete, update the release notes on GitHub with the
release notes prepared in step 2.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Post a message in the
&lt;a href="https://cloud-native.slack.com/archives/CLAJ40HV3" target="_blank">&lt;code>#flux&lt;/code> CNCF Slack channel&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h4 id="distribution-release-candidates">Distribution: release candidates&lt;/h4>
&lt;p>In some cases, it may be necessary to release a
&lt;a href="https://deploy-preview-2413--fluxcd.netlify.app/flux/releases/#release-candidates">release candidate&lt;/a>
of the distribution.&lt;/p>
&lt;p>To create a first release candidate, follow the steps to create a
&lt;a href="#distribution-minor-releases">minor
release&lt;/a>, but use the &lt;code>rc.X&lt;/code> suffix for SemVer
version to release (e.g., &lt;code>v2.2.0-rc.1&lt;/code>).&lt;/p>
&lt;p>Once the release series branch is created, subsequent release candidates and
the final (non-RC) release should follow the procedure for
&lt;a href="#distribution-patch-releases">patch releases&lt;/a>.&lt;/p>
&lt;h4 id="distribution-release-notes">Distribution: release notes&lt;/h4>
&lt;p>The release notes template for Flux distributions is available in the
&lt;a href="https://github.com/fluxcd/flux2/blob/main/docs/release/release-notes-template.md" target="_blank">release-notes-template.md&lt;/a> file.&lt;/p>
&lt;h4 id="distribution-release-and-eol-notice-update">Distribution: Release and EOL notice update&lt;/h4>
&lt;p>Release and support cadence information is published at
&lt;a href="https://endoflife.date/flux" target="_blank">https://endoflife.date/flux&lt;/a>. The source of truth for that page
is maintained in
&lt;a href="https://github.com/endoflife-date/endoflife.date/blob/master/products/flux.md" target="_blank">this Git repository&lt;/a>.
Patch releases should automatically be captured by the automation in place there in a matter of roughly one day after
release.&lt;/p>
&lt;p>New minor releases need to be added manually to the flux.md page. Create a PR updating the file accordingly.&lt;/p>
&lt;h2 id="backport-changes-for-patch-releases">Backport changes for patch releases&lt;/h2>
&lt;p>The Flux projects have a backport bot that automates the process of backporting
changes from &lt;code>main&lt;/code> to the release series branches. The bot is configured to
backport pull requests that are labeled with &lt;code>backport:&amp;lt;release series&amp;gt;&lt;/code> (e.g.,
&lt;code>backport:release/v2.1.x&lt;/code>) and have been merged into &lt;code>main&lt;/code>.&lt;/p>
&lt;p>The label(s) are preferably added to the pull request before it is merged into
&lt;code>main&lt;/code>. If the pull request is merged into &lt;code>main&lt;/code> without labeling, they can
still be added to the pull request after it has been merged.&lt;/p>
&lt;p>The backport bot will automatically backport the pull request to the release
series branch and create a pull request for the backport. It will comment on
the pull request with a link to the backport pull request.&lt;/p>
&lt;p>If the backport bot is unable to backport a pull request automatically (for
example, due to conflicts), it will comment on the pull request with
instructions on how to backport the pull request manually.&lt;/p>
&lt;h3 id="manual-backporting">Manual backporting&lt;/h3>
&lt;p>In some cases, the backport bot may not be suitable for backporting a pull
request. For example, if the pull request contains a series of changes of which
a subset should be backported. In these cases, the pull request should be
backported manually.&lt;/p>
&lt;p>To backport a pull request manually, create a new branch from the release
series branch (e.g., &lt;code>release/v2.1.x&lt;/code>) and cherry-pick the commits from the
pull request into the new branch. Push the new branch to the remote repository
and create a pull request to merge it into the release series branch.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git pull origin release/v2.1.x
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git switch -c backport-&amp;lt;pull request number&amp;gt;-to-v2.1.x release/v2.1.x
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git cherry-pick -x &amp;lt;commit hash&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># Repeat the cherry-pick command for each commit to backport&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin backport-&amp;lt;pull request number&amp;gt;-to-v2.1.x
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>