From 70f0916060f3505ada8d19477c6196fb7570a541 Mon Sep 17 00:00:00 2001 From: Paige Calvert Date: Mon, 7 Jul 2025 14:57:15 -0600 Subject: [PATCH 1/2] Add info about how build data is not used when determining semver precendence --- docs/vendor/releases-about.mdx | 113 ++++++++++++---------- docs/vendor/releases-creating-channels.md | 24 ++++- static/images/semver-graphic.png | Bin 0 -> 37024 bytes 3 files changed, 87 insertions(+), 50 deletions(-) create mode 100644 static/images/semver-graphic.png diff --git a/docs/vendor/releases-about.mdx b/docs/vendor/releases-about.mdx index 7af25aae7b..f8754f580e 100644 --- a/docs/vendor/releases-about.mdx +++ b/docs/vendor/releases-about.mdx @@ -31,7 +31,7 @@ Replicated includes the following channels by default: You can archive or edit any of the default channels, and create new channels. For more information, see [Create and Edit Channels](releases-creating-channels). -### Settings +### Channel Settings Each channel has settings. You can customize the settings for a channel to control some of the behavior of releases promoted to the channel. @@ -74,7 +74,15 @@ Each release is promoted to one or more channels. While you are developing and t A release cannot be edited after it is promoted to a channel. This means that you can test a release on an internal development channel, and know with confidence that the same release will be available to your customers when you promote it to a channel where real customers are assigned. -### Properties +### Demotion + +A channel release can be demoted from a channel. When a channel release is demoted, the release is no longer available for download, but is not withdrawn from environments where it was already downloaded or installed. + +The demoted release's channel sequence and version are not reused. For customers, the release will appear to have been skipped. Un-demoting a release will restore its place in the channel sequence making it again available for download and installation. + +For information about how to demote a release, see [Demote a Release](/vendor/releases-creating-releases#demote-a-release) in _Managing Releases with the Vendor Portal_. + +### Release Properties Each release has properties. You define release properties when you promote a release to a channel. You can edit release properties at any time from the channel **Release History** page in the Vendor Portal. For more information, see [Edit Release Properties](releases-creating-releases#edit-release-properties) in _Managing Releases with the Vendor Portal_. @@ -100,35 +108,39 @@ As shown in the screenshot above, the release has the following properties: * **Release notes (supports markdown)**: Detailed release notes for the release. The release notes support markdown and are shown to your customer. -### Sequencing +## About Using Semantic Versioning {#semantic-versioning} -By default, Replicated uses release sequence numbers to organize and order releases, and uses instance sequence numbers in an instance's internal version history. +Semantic Versioning (SemVer) is a commonly-used and recommended versioning strategy that provides implicit information about the backwards compatibility of each version, using the format MAJOR.MINOR.PATCH: -#### Release Sequences +![semver graphic](/images/semver-graphic.png) -In the Vendor Portal, each release is automatically assigned a unique, monotonically-increasing sequence number. You can use this number as a fallback to identify a promoted or draft release, if you do not set the `Version label` field during promotion. For more information, see [Manage Releases with the Vendor Portal](releases-creating-releases). +[View a larger version of this image](/images/semver-graphic.png) -The following graphic shows release sequence numbers in the Vendor Portal: +Using SemVer for your releases is recommended because it makes versioning more predictable for users. It also lets you enforce a consistent versioning pattern for your application in the Replicated Platform. For more information about SemVer, including how precendence is determined when comparing different versions, see [Semantic Versioning 2.0.0](https://semver.org). -Release sequence numbers +You can enable and disable SemVer for releases on each channel in the channel settings. When you enable SemVer on a channel, the Vendor Portal checks all releases promoted to that channel to verify that the version label is valid SemVer. For more information about how to enable SemVer on a channel, see [Enable Semantic Versioning](/vendor/releases-creating-channels#enable-semantic-versioning) in _Create and Edit Channels_. -[View a larger version of this image](/images/release-sequences.png) +For information about the Admin Console determines precendence for releases that use SemVer, see [How the Admin Console Assigns Instance Sequence](#instance-sequence-how) below. -#### Instance Sequences +## Release and Instance Sequencing -When a new version is available for upgrade, including when KOTS checks for upstream updates as well as when the user syncs their license or makes a config change, the KOTS Admin Console assigns a unique instance sequence number to that version. The instance sequence in the Admin Console starts at 0 and increments for each identifier that is returned when a new version is available. +The Vendor Portal uses release sequence numbers to organize and order releases. The Admin Console uses instance sequence numbers to organize and order an instance's internal version history. -This instance sequence is unrelated to the release sequence dispalyed in the Vendor Portal, and it is likely that the instance sequence will differ from the release sequence. Instance sequences are only tracked by KOTS instances, and the Vendor Portal has no knowledge of these numbers. +### Vendor Portal Release Sequence -The following graphic shows instance sequence numbers on the Admin Console dashboard: +In the Vendor Portal, each release is automatically assigned a unique, monotonically-increasing sequence number. You can use this number as a fallback to identify a promoted or draft release, if you do not set the `Version label` field during promotion. For more information, see [Manage Releases with the Vendor Portal](releases-creating-releases). -Instance sequence numbers +The following graphic shows release sequence numbers in the Vendor Portal: -[View a larger version of this image](/images/instance-sequences.png) +Release sequence numbers -#### Channel Sequences +[View a larger version of this image](/images/release-sequences.png) -When a release is promoted to a channel, a channel sequence number is assigned. This unique sequence number increments by one and tracks the order in which releases were promoted to a channel. You can view the channel sequence on the **Release History** page in the Vendor Portal, as shown in the image below: +### Channel Sequence + +When a release is promoted to a channel, a channel sequence number is assigned. This unique sequence number increments by one and tracks the order in which releases were promoted to a channel. + +You can view the channel sequence on the **Release History** page in the Vendor Portal, as shown in the image below: Channel sequence on Release History page @@ -136,56 +148,59 @@ When a release is promoted to a channel, a channel sequence number is assigned. The channel sequence is also used in certain URLs. For example, a release with a *release sequence* of `170` can have a *channel sequence* of `125`. The air gap download URL for that release can contain `125` in the URL, even though the release sequence is `170`. -Ordering is more complex if some or all of the releases in a channel have a semantic version label and semantic versioning is enabled for the channel. For more information, see [Semantic Versioning Sequence](#semantic-versioning-sequence). - -#### Semantic Versioning Sequence +### Admin Console Instance Sequence -For channels with semantic versioning enabled, the Admin Console sequences instance releases by their semantic versions instead of their promotion dates. +When a new version is available for upgrade (including when KOTS checks for upstream updates, when the user syncs their license, or when the user makes a config change) the KOTS Admin Console assigns a unique instance sequence number to that version. -If releases without a valid semantic version are already promoted to a channel, the Admin Console sorts the releases that do have semantic versions starting with the earliest version and proceeding to the latest. The releases with non-semantic versioning stay in the order of their promotion dates. For example, assume that you promote these releases in the following order to a channel: +The instance sequence in the Admin Console is unrelated to the release sequence in the Vendor Portal. Instance sequences are only tracked by KOTS instances, and the Vendor Portal has no knowledge of these numbers. It is also likely that the instance sequence number is different than the Vendor Portal release sequence. -- 1.0.0 -- abc -- 0.1.0 -- xyz -- 2.0.0 +The following shows instance sequence numbers on the Admin Console dashboard: -Then, you enable semantic versioning on that channel. The Admin Console sequences the version history for the channel as follows: +Instance sequence numbers -- 0.1.0 -- 1.0.0 -- abc -- xyz -- 2.0.0 +[View a larger version of this image](/images/instance-sequences.png) -### Semantic Versioning +#### How the Admin Console Assigns Instance Sequence {#instance-sequence-how} -Semantic versioning is available with the Replicated KOTS v1.58.0 and later. Note the following: +The instance sequence in the Admin Console starts at 0 and increments for each identifier that is returned when a new version is available. -- For applications created in the Vendor Portal on or after February 23, 2022, semantic versioning is enabled by default on the Stable and Beta channels. Semantic versioning is disabled on the Unstable channel by default. +The Admin Console assigns instance sequence numbers using the following logic, depending on how semantic versioning is used: -- For existing applications created before February 23, 2022, semantic versioning is disabled by default on all channels. +* For channels _without_ semantic versioning (SemVer) enabled, the Admin Console sequences releases by their promotion dates. -Semantic versioning is recommended because it makes versioning more predictable for users and lets you enforce versioning so that no one uses an incorrect version. +* For channels _with_ SemVer enabled, the Admin Console sequences releases by their semantic version. For information about how precedence is determined in SemVer, see [11. +Precedence refers to how versions are compared to each other when ordered](https://semver.org/#spec-item-11) in the Semantic Versioning 2.0.0 documentation. -To use semantic versioning: + The following shows an example of how the Admin Console sequences releases that use SemVer: -1. Enable semantic versioning on a channel, if it is not enabled by default. Click the **Edit channel settings** icon, and turn on the **Enable semantic versioning** toggle. -1. Assign a semantic version number when you promote a release. + - 2.13.0 + - 2.12.1 + - 2.12.0 + - 2.12.0-2 + - 2.12.0-1 + - 2.11.0 -Releases promoted to a channel with semantic versioning enabled are verified to ensure that the release version label is a valid semantic version. For more information about valid semantic versions, see [Semantic Versioning 2.0.0](https://semver.org). + :::note + Build metadata in the semantic version string is ignored when determining version precedence. For example, the Admin Console interprets 2.12.0, 2.12.0+1, and 2.12.0+2 as the same version. Instead of using build metadata in your semantic version labels, Replicated recommends that you increment the patch version. Or, use pre-release identifiers. For example, 1.0.0-alpha or 1.0.0-1. + ::: -If you enable semantic versioning for a channel and then promote releases to it, Replicated recommends that you do not later disable semantic versioning for that channel. +* For channels with SemVer enabled where there is at least one release that does _not_ use SemVer, the Admin Console sequences the releases with semantic versioning by their version label. The release(s) with non-semantic versioning stay in the order of their promotion dates. -You can enable semantic versioning on a channel that already has releases promoted to it without semantic versioning. Any subsequently promoted releases must use semantic versioning. In this case, the channel will have releases with and without semantic version numbers. For information about how Replicated organizes these release sequences, see [Semantic Versioning Sequences](#semantic-versioning-sequence). + For example, assume that you promote these releases in the following order to a channel: -### Demotion + - 1.0.0 + - abc + - 0.1.0 + - xyz + - 2.0.0 -A channel release can be demoted from a channel. When a channel release is demoted, the release is no longer available for download, but is not withdrawn from environments where it was already downloaded or installed. + Then, you enable SemVer on that channel. The Admin Console sequences the version history for the channel as follows: -The demoted release's channel sequence and version are not reused. For customers, the release will appear to have been skipped. Un-demoting a release will restore its place in the channel sequence making it again available for download and installation. - -For information about how to demote a release, see [Demote a Release](/vendor/releases-creating-releases#demote-a-release) in _Managing Releases with the Vendor Portal_. + - 0.1.0 + - 1.0.0 + - abc + - xyz + - 2.0.0 ## Vendor Portal Pages diff --git a/docs/vendor/releases-creating-channels.md b/docs/vendor/releases-creating-channels.md index a8ffc44e56..846aa95f74 100644 --- a/docs/vendor/releases-creating-channels.md +++ b/docs/vendor/releases-creating-channels.md @@ -24,7 +24,7 @@ To create a channel: 1. Click **Create Channel**. -## Edit a Channel +## Edit Channel Settings To edit the settings of an existing channel: @@ -39,6 +39,28 @@ To edit the settings of an existing channel: For more information about channel settings, see [Settings](releases-about#settings) in _About Channels and Releases_. +## Enable Semantic Versioning + +You can enable and disable semantic versioning (SemVer) for releases on each channel. When you enable SemVer on a channel, the Vendor Portal checks all releases promoted to that channel to verify that the version label is valid SemVer. + +You can enable SemVer on a channel that already has releases promoted to it that do not use semantic versioning. Any subsequently promoted releases must use semantic versioning. In this case, the channel will have releases with and without semantic version numbers. For more information, see [About Using Semantic Versioning](/vendor/releases-about#semantic-versioning) in _About Channels and Releases_. + +:::note +If you enable SemVer for a channel and then promote releases to it, Replicated recommends that you do _not_ later disable SemVer for that channel. +::: + +To enable semantic versioning on a channel: + +1. In the Vendor Portal, go to **Channels** and click the **Edit channel settings** icon. + + The **Channel settings** dialog opens. For example: + + Channel Settings dialog in the Vendor Portal + +1. Enable the **Enable semantic versioning** toggle. + + The next time that you promote a release to the channel, assign the release a semantic version number. + ## Archive a Channel You can archive an existing channel to prevent any new releases from being promoted to the channel. diff --git a/static/images/semver-graphic.png b/static/images/semver-graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..ffd9c1535180e854df1597938191a8a7e2264693 GIT binary patch literal 37024 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 KE_nI&!~X#nWx)sl literal 0 HcmV?d00001 From 1d5a90699893638edace8a8ccc73b82e8f9b3328 Mon Sep 17 00:00:00 2001 From: Paige Calvert Date: Tue, 8 Jul 2025 12:14:52 -0600 Subject: [PATCH 2/2] edits --- docs/enterprise/updating-app-manager.mdx | 43 +++++++++++++++++++- docs/vendor/releases-about.mdx | 52 ++++-------------------- 2 files changed, 49 insertions(+), 46 deletions(-) diff --git a/docs/enterprise/updating-app-manager.mdx b/docs/enterprise/updating-app-manager.mdx index 370f935061..610a4fa9d1 100644 --- a/docs/enterprise/updating-app-manager.mdx +++ b/docs/enterprise/updating-app-manager.mdx @@ -9,6 +9,8 @@ import ViewAirGapBundle from "../partials/install/_airgap-bundle-view-contents.m This topic describes how to perform updates in existing cluster installations with Replicated KOTS. It includes information about how to update applications and the version of KOTS running in the cluster. +It also includes information about how the Admin Console determines version precendence. See [How the Admin Console Determines Version Precendence](/enterprise/updating-app-manager#how-the-admin-console-determines-version-precedence). + ## Update an Application You can perform an application update using the KOTS Admin Console or the KOTS CLI. You can also set up automatic updates. See [Configure Automatic Updates](/enterprise/updating-apps). @@ -141,4 +143,43 @@ To update KOTS in an existing air gap cluster: * `RO_PASSWORD` with the password associated with the username. * `NAMESPACE` with the namespace on your cluster where KOTS is installed. - For help information, run `kubectl kots admin-console upgrade -h`. \ No newline at end of file + For help information, run `kubectl kots admin-console upgrade -h`. + +## How the Admin Console Determines Version Precedence + +The Admin Console uses version precedence to determine which versions are available for upgrade. Version precedence also determines the order in which versions are displayed on the **Version history** page, as shown in the example below: + +![Admin console version history page](/images/new-version-available.png) +[View a larger version of this image](/images/new-version-available.png) + +The Admin Console uses the following logic to determine version precendence: + +* For channels _without_ semantic versioning (SemVer) enabled, the Admin Console sequences releases by their promotion dates and times. For example, if you promote a release with version label abc at 10:00am, and then promote a release with version label xyz at 10:15am, then version xyz has higher precedence (abc < xyz). + +* For channels _with_ SemVer enabled, the Admin Console sequences releases by their semantic version. For information about how precedence is determined in SemVer, see [11. +Precedence refers to how versions are compared to each other when ordered](https://semver.org/#spec-item-11) in the Semantic Versioning 2.0.0 documentation. + + The following shows an example of version precendence in SemVer when pre-release fields are used: + + - 2.13.0 + - 2.12.1 + - 2.12.0 + - 2.12.0-2 + - 2.12.0-1 + - 2.11.0 + + :::note + Build metadata in the semantic version string is ignored when determining version precedence. For example, the Admin Console interprets 2.12.0, 2.12.0+1, and 2.12.0+2 as the same version. Instead of using build metadata in your semantic version labels, Replicated recommends that you increment the patch version. Or, use pre-release identifiers. For example, 1.0.0-alpha or 1.0.0-1. + ::: + +* For channels with SemVer enabled where there are one or more releases that do _not_ use SemVer, the Admin Console determines precedence based on the semantic version when possible. The release(s) with non-semantic versions stay in the order of their promotion dates. + + For example, assume that you promote these releases in the following order to a channel without SemVer enabled: + + - 1.0.0 promoted at 10:00 AM + - abc promoted at 10:15 AM + - 0.1.0 promoted at 10:30 AM + - xyz promoted at 10:45 AM + - 2.0.0 promoted at 11:00 AM + + Then, you enable SemVer on that channel. The Admin Console assigns precedence as follows: 0.1.0 < 1.0.0 < abc < xyz < 2.0.0. \ No newline at end of file diff --git a/docs/vendor/releases-about.mdx b/docs/vendor/releases-about.mdx index f8754f580e..fc670724ba 100644 --- a/docs/vendor/releases-about.mdx +++ b/docs/vendor/releases-about.mdx @@ -96,7 +96,7 @@ As shown in the screenshot above, the release has the following properties: * **Version label**: The version label for the release. Version labels have the following requirements: - * If semantic versioning is enabled for the channel, you must use a valid semantic version. For more information, see [Semantic Versioning](#semantic-versioning). + * If semantic versioning is enabled for the channel, you must use a valid semantic version. For more information, see [About Using Semantic Versioning](#semantic-versioning). @@ -120,7 +120,7 @@ Using SemVer for your releases is recommended because it makes versioning more p You can enable and disable SemVer for releases on each channel in the channel settings. When you enable SemVer on a channel, the Vendor Portal checks all releases promoted to that channel to verify that the version label is valid SemVer. For more information about how to enable SemVer on a channel, see [Enable Semantic Versioning](/vendor/releases-creating-channels#enable-semantic-versioning) in _Create and Edit Channels_. -For information about the Admin Console determines precendence for releases that use SemVer, see [How the Admin Console Assigns Instance Sequence](#instance-sequence-how) below. +When SemVer is enabled, the Admin Console uses the version labels that you assign to releases to determine release precedence. This is important because precedence controls which versions are available to customers for upgrade. It also determines how versions are ordered on the Admin Console **Version history** page. For more information, see [How the Admin Console Determines Version Precedence](/enterprise/updating-app-manager#how-the-admin-console-determines-version-precedence) in _Performing Updates in Existing Clusters_. ## Release and Instance Sequencing @@ -150,7 +150,11 @@ The channel sequence is also used in certain URLs. For example, a release with a ### Admin Console Instance Sequence -When a new version is available for upgrade (including when KOTS checks for upstream updates, when the user syncs their license, or when the user makes a config change) the KOTS Admin Console assigns a unique instance sequence number to that version. +When a new version is available for upgrade (including when KOTS checks for upstream updates, when the user syncs their license, or when the user makes a config change) the KOTS Admin Console assigns a unique instance sequence number to that version. The instance sequence number starts at 0 and increments for each identifier that is returned when a new version is available. + +The purpose of the instance sequence number is to help the user track all new versions across upstream updates, config changes, and license syncs. Without the instance sequence number, this could be challegning as the version label does not change when the user makes config changes or syncs their license. + +The instance sequence number does _not_ reflect version precedence. The Admin Console determines version precedence based on either the release's version label (if semantic versioning is enabled) or based on the date and time the release was promoted (if semantic versioning is disabled). This is important because precedence controls which versions are available to customers for upgrade. It also determines how versions are ordered on the Admin Console **Version history** page. For more information, see [How the Admin Console Determines Version Precedence](/enterprise/updating-app-manager#how-the-admin-console-determines-version-precedence) in _Performing Updates in Existing Clusters_. The instance sequence in the Admin Console is unrelated to the release sequence in the Vendor Portal. Instance sequences are only tracked by KOTS instances, and the Vendor Portal has no knowledge of these numbers. It is also likely that the instance sequence number is different than the Vendor Portal release sequence. @@ -160,48 +164,6 @@ The following shows instance sequence numbers on the Admin Console dashboard: [View a larger version of this image](/images/instance-sequences.png) -#### How the Admin Console Assigns Instance Sequence {#instance-sequence-how} - -The instance sequence in the Admin Console starts at 0 and increments for each identifier that is returned when a new version is available. - -The Admin Console assigns instance sequence numbers using the following logic, depending on how semantic versioning is used: - -* For channels _without_ semantic versioning (SemVer) enabled, the Admin Console sequences releases by their promotion dates. - -* For channels _with_ SemVer enabled, the Admin Console sequences releases by their semantic version. For information about how precedence is determined in SemVer, see [11. -Precedence refers to how versions are compared to each other when ordered](https://semver.org/#spec-item-11) in the Semantic Versioning 2.0.0 documentation. - - The following shows an example of how the Admin Console sequences releases that use SemVer: - - - 2.13.0 - - 2.12.1 - - 2.12.0 - - 2.12.0-2 - - 2.12.0-1 - - 2.11.0 - - :::note - Build metadata in the semantic version string is ignored when determining version precedence. For example, the Admin Console interprets 2.12.0, 2.12.0+1, and 2.12.0+2 as the same version. Instead of using build metadata in your semantic version labels, Replicated recommends that you increment the patch version. Or, use pre-release identifiers. For example, 1.0.0-alpha or 1.0.0-1. - ::: - -* For channels with SemVer enabled where there is at least one release that does _not_ use SemVer, the Admin Console sequences the releases with semantic versioning by their version label. The release(s) with non-semantic versioning stay in the order of their promotion dates. - - For example, assume that you promote these releases in the following order to a channel: - - - 1.0.0 - - abc - - 0.1.0 - - xyz - - 2.0.0 - - Then, you enable SemVer on that channel. The Admin Console sequences the version history for the channel as follows: - - - 0.1.0 - - 1.0.0 - - abc - - xyz - - 2.0.0 - ## Vendor Portal Pages This section provides information about the channels and releases pages in the Vendor Portal.