This is an automated email from the ASF dual-hosted git repository.
mmerli pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
The following commit(s) were added to refs/heads/main by this push:
new 2cb5139b355 [improve][doc] Release policy and matrix (#433)
2cb5139b355 is described below
commit 2cb5139b3556bcf04d9fdabba7caa65c9b6a2c4d
Author: tison <[email protected]>
AuthorDate: Wed Mar 1 00:43:26 2023 +0800
[improve][doc] Release policy and matrix (#433)
* reorder sidebars
Signed-off-by: tison <[email protected]>
* version-policy -> release-policy
Signed-off-by: tison <[email protected]>
* Merge PIP-175 release policy
Signed-off-by: tison <[email protected]>
* Add 2.11
Signed-off-by: tison <[email protected]>
* fix whitespace
Signed-off-by: tison <[email protected]>
* data-driven SupportedVersionsTable
Signed-off-by: tison <[email protected]>
* add render
Signed-off-by: tison <[email protected]>
* better datetime render
Signed-off-by: tison <[email protected]>
* colored support
Signed-off-by: tison <[email protected]>
* drop manual table
Signed-off-by: tison <[email protected]>
* light color
Signed-off-by: tison <[email protected]>
* background to dot and color
Signed-off-by: tison <[email protected]>
* bold
Signed-off-by: tison <[email protected]>
* write release cycle in steps
Signed-off-by: tison <[email protected]>
* support version table is now data-driven
Signed-off-by: tison <[email protected]>
* Addres comments
Signed-off-by: tison <[email protected]>
* Update contribute/release-policy.md
Co-authored-by: Jun Ma <[email protected]>
* Update contribute/release-policy.md
---------
Signed-off-by: tison <[email protected]>
Co-authored-by: Jun Ma <[email protected]>
---
contribute/release-policy.md | 89 +++++++++++++++
contribute/release-process.md | 30 +++--
contribute/version-policy.md | 46 --------
package.json | 3 +
release-notes/pulsar.mdx | 2 +
sidebarsDevelopment.js | 2 +-
src/components/SupportedVersionsTable.tsx | 178 ++++++++++++++++++++++++++++++
static/.htaccess | 3 +-
8 files changed, 289 insertions(+), 64 deletions(-)
diff --git a/contribute/release-policy.md b/contribute/release-policy.md
new file mode 100644
index 00000000000..f33d2aa146c
--- /dev/null
+++ b/contribute/release-policy.md
@@ -0,0 +1,89 @@
+---
+id: release-policy
+title: Release policy
+---
+
+## Release semantics
+
+The Pulsar project follows a variant of Semantic Versioning (semver), which
replacing `major.minor.patch` with `LTS.feature.patch`.
+
+Concretely, existing releases can expect patches for bugs and security
vulnerabilities. New features will target to feature releases. A "major"
version bump will not carry any special meaning in terms of "big features"
included in the release or breaking API changes. Instead, it would simply
signal a new long-term support (LTS) release.
+
+For example,
+
+* 2.10.0 is a feature release;
+* 2.10.1 is a patch release;
+* 2.11.0 is a feature release;
+* 3.0.0 is the first LTS release;
+* 3.0.1 is a patch release of the LTS release;
+* 3.1.0 is a feature release;
+* 3.2.0 is a feature release;
+* 3.2.1 is a patch release;
+* 4.0.0 is an LTS release.
+
+## Compatibility between releases
+
+When upgrading an existing cluster, it is important to upgrade components
linearly.
+
+Before 3.0, upgrade should be done linearly through each feature version. For
example, when upgrading from 2.8 to 2.10, it is important to upgrade to 2.9
before going to 2.10.
+
+Starting from 3.0, additionally, live upgrade/downgrade between one LTS and
the next one is guaranteed. For example,
+
+* 3.0 -> 4.0 -> 3.0 is OK;
+* 3.2 -> 4.0 -> 3.2 is OK;
+* 3.2 -> 4.4 -> 3.2 is OK;
+* 3.2 -> 5.0 is _not_ OK.
+
+## Release frequency and support expectation
+
+| | Release frequency | Active Support | Security Support |
+|-----------------|-------------------|----------------|------------------|
+| LTS release | Every 18 months | 24 months | 36 months |
+| Feature release | Every 3 months | 6 months | 6 months |
+| Patch release | When it is ready | N/A | N/A |
+
+This can be translated into:
+
+* The last 2 LTS releases and the last 2 feature releases are supported.
+* Security patches are provided for the past 3 LTS releases and 2 feature
releases
+
+Therefore, users can choose between stay in an LTS release until they are
ready to jump into the next LTS, or try the latest releases which contains
required features.
+
+## Supported Versions
+
+````mdx-code-block
+import SupportedVersionsTable from
"@site/src/components/SupportedVersionsTable";
+
+<SupportedVersionsTable />
+````
+
+## Release cycles
+
+Generally, one committer shall volunteer as the release manager (RM) for a
specific release.
+
+For feature releases and LTS releases, the last 3 weeks of the release cycle
will be marked as a code-freeze period. The RM will branch off from master, and
the RM is also responsible for selecting the changes that will be cherry-picked
in the release branch.
+
+From the code-freeze point, to minimize the risk of delaying the release, only
bug fixes involving a regression of behavior compared to a previous release
should be allowed. Occasional exceptions will be possible after higher scrutiny
of the change.
+
+1. At the moment of the code freeze, the RM will start preparing a release
candidate (RC) following the [release process](release-process.md). Committers,
contributors, and users will [test this RC](validate-release-candidate.md) to
detect issues as early as possible. (A formal vote by the PMC will not be
required at this stage, though any disagreement should be sent out ASAP).
+2. After 1 week, if there are any changes, the RM will provide a new RC
release that the community will test again.
+3. After 1 more week, if there are any changes, a third RC will be prepared,
and this will be submitted to vote to the PMC. Otherwise, the vote will be held
on an earlier RC if no issues are found.
+4. The last 1 week will be used for the voting process and for updating Pulsar
website and the blog post announcing the release, which should (hopefully)
happen on the scheduled day.
+
+For patch releases, the process is the same while there is no code-freeze
period and strict timeline. Basically, patch release is out "when it is ready".
+
+:::note
+
+For example, the next release of Pulsar is 3.0.0, and it has the planned
timeline as:
+
+* 2023-04-11 - RC-1
+* 2023-04-18 - RC-2
+* 2023-04-25 - RC-3
+* 2023-05-02 - Announce 3.0 Release
+
+:::
+
+## Related PIPs
+
+* [PIP-47: A Time-Based Release
Plan](https://github.com/apache/pulsar/wiki/PIP-47%3A-Time-Based-Release-Plan)
+* [PIP-175: Extend time based release
process](https://github.com/apache/pulsar/issues/15966)
diff --git a/contribute/release-process.md b/contribute/release-process.md
index be1635add9b..7b576e64362 100644
--- a/contribute/release-process.md
+++ b/contribute/release-process.md
@@ -5,18 +5,18 @@ title: Release process
This page contains instructions for Pulsar committers on how to perform a
release.
-The term major/minor releases used throughout this document is defined as
follows:
+The term feature/patch releases used throughout this document is defined as
follows:
-* Major releases refer to feature releases, such as 2.10.0, 2.11.0, and so on.
-* Minor releases refer to bug-fix releases, such as 2.10.1, 2.10.2, and so on.
+* Feature releases contain 2.10.0, 2.11.0, 3.0.0, and so on.
+* Patch releases refer to bug-fix releases, such as 2.10.1, 2.10.2, and so on.
## Preparation
Open a discussion on [email protected] to notify others that you
volunteer to be the release manager of a specific release. If there are no
disagreements, you can start the release process.
-For major releases, you should create a new branch named `branch-X.Y` once all
PRs with the X.Y.0 milestone are merged. If some PRs with the X.Y.0 milestone
are still working in progress and might take much time to complete, you can
move them to the next milestone if they are not important. In this case, you'd
better notify the author in the PR.
+For feature releases, you should create a new branch named `branch-X.Y` once
all PRs with the X.Y.0 milestone are merged. If some PRs with the X.Y.0
milestone are still working in progress and might take much time to complete,
you can move them to the next milestone if they are not important. In this
case, you'd better notify the author in the PR.
-For minor releases, if there are no disagreements, you should cherry-pick all
merged PRs labeled with `release/X.Y.Z` into `branch-X.Y`. After these PRs are
cherry-picked, you should add the `cherry-picked/branch-X.Y` labels.
+For patch releases, if there are no disagreements, you should cherry-pick all
merged PRs labeled with `release/X.Y.Z` into `branch-X.Y`. After these PRs are
cherry-picked, you should add the `cherry-picked/branch-X.Y` labels.
Sometimes some PRs cannot be cherry-picked cleanly, you might need to create a
separate PR and move the `release/X.Y.Z` label from the original PR to it. In
this case, you can ask the author to help create the new PR.
@@ -46,7 +46,7 @@ Also, you need to **clean up the bookkeeper's local
compiled** to make sure the
We are going to create a branch from `master` to `branch-v2.X` where the tag
will be generated and where new fixes will be applied as part of the
maintenance for the release.
-The branch needs only to be created for major releases, and not for minor
releases like `2.3.1`. For minor releases, go to the next step.
+The branch needs only to be created for feature releases, and not for patch
releases like `2.3.1`. For patch releases, go to the next step.
For example, when you create the `v2.3.0` release, the branch `branch-2.3`
will be created; but for `v2.3.1`, we
keep using the old `branch-2.3`.
@@ -71,8 +71,6 @@ If you created a new branch, update the [CI - OWASP
Dependency Check](https://gi
Note that you should also stop the workflow for previous Pulsar versions that
are EOL.
-Also, if you created a new branch, please update the "Supported Versions"
table on the [version policy](version-policy.md) page. This table is for
support timelines based on when minor releases take place.
-
### Update project version and tag
During the release process, you are going to initially create "candidate"
tags, that after verification and approval will get promoted to the "real"
final tag.
@@ -103,7 +101,7 @@ git push origin branch-2.X
git push origin v2.X.0-candidate-1
```
-For minor releases, the tag is like `2.3.1`.
+For patch releases, the tag is like `2.3.1`.
### Build release artifacts
@@ -349,7 +347,7 @@ If you don't have the permission, you can ask someone with
access to apachepulsa
:::caution
-This step can be skipped if the major version number is not the latest.
+This step is for the latest release only.
:::
@@ -452,7 +450,7 @@ Read more on the manual of
[pytools](https://github.com/apache/pulsar-site/tree/
:::caution
-This step is for major releases only, unless you're sure that significant
Javadoc fixes are made against the minor release.
+This step is for feature releases only, unless you're sure that significant
Javadoc fixes are made against the patch release.
:::
@@ -476,7 +474,7 @@ Read more on the manual of
[pytools](https://github.com/apache/pulsar-site/tree/
:::caution
-This step is for major releases only, unless you're sure that significant
reference fixes are made against the minor release.
+This step is for feature releases only, unless you're sure that significant
reference fixes are made against the patch release.
:::
@@ -497,7 +495,7 @@ Read more on the manual of
[pytools](https://github.com/apache/pulsar-site/tree/
:::caution
-This step is for major releases only, unless you're sure that significant doc
fixes are made against the minor release.
+This step is for feature releases only, unless you're sure that significant
doc fixes are made against the patch release.
:::
@@ -517,7 +515,7 @@ Read more on the manual of
[pytools](https://github.com/apache/pulsar-site/tree/
:::caution
-This step is for major releases only, unless you're sure that significant doc
fixes are made against the minor release.
+This step is for feature releases only, unless you're sure that significant
doc fixes are made against the patch release.
:::
@@ -553,7 +551,7 @@ For every release, you should add a `<release-version>`
entry to the correspondi
:::caution
-The following steps are for major releases only.
+The following steps are for feature releases only.
:::
@@ -631,7 +629,7 @@ svn rm
https://dist.apache.org/repos/dist/release/pulsar/pulsar-2.Y.0
:::caution
-This step is for major releases only.
+This step is for feature releases only.
:::
diff --git a/contribute/version-policy.md b/contribute/version-policy.md
deleted file mode 100644
index 945ed500d8a..00000000000
--- a/contribute/version-policy.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-id: version-policy
-title: Version policy
----
-
-The Pulsar project adheres to [Semantic
Versioning](http://semver.org/spec/v2.0.0.html). Existing releases can expect
-patches for bugs and security vulnerabilities. New features will target minor
releases.
-
-When upgrading an existing cluster, it is important to upgrade components
linearly through each minor version. For
-example, when upgrading from 2.8.x to 2.10.x, it is important to upgrade to
2.9.x before going to 2.10.x.
-
-## Supported Versions
-
-Feature release branches will be maintained with security-fix and bug-fix
releases for at least 12 months after the
-initial release. For example, branch 2.5.x is no longer considered maintained
as of January 2021, 12 months after
-the release of 2.5.0 in January 2020. No more 2.5.x releases should be
expected at this point, even to fix security
-vulnerabilities.
-
-Note that a minor version can be maintained past its 12-month initial support
period. For example, version 2.7 is still
-actively maintained.
-
-Security fixes will be given priority when it comes to back porting fixes to
older versions that are within the
-supported time window. It is challenging to decide which bug fixes to back
port to old versions. As such, the latest
-versions will have the most bug fixes.
-
-When 3.0.0 is released, the community will decide how to continue supporting
2.x. The last minor release within 2.x may
-be maintained for longer as an "LTS" release, but it has not been officially
decided.
-
-The following table shows version support timelines and will be updated with
each release.
-
-| Version | Supported | Initial Release | At Least Until |
-|:-------:|:------------------:|:---------------:|:--------------:|
-| 2.10.x | :white_check_mark: | April 2022 | April 2023 |
-| 2.9.x | :white_check_mark: | November 2021 | November 2022 |
-| 2.8.x | :white_check_mark: | June 2021 | June 2022 |
-| 2.7.x | :white_check_mark: | November 2020 | November 2021 |
-| 2.6.x | :x: | June 2020 | June 2021 |
-| 2.5.x | :x: | January 2020 | January 2021 |
-| 2.4.x | :x: | July 2019 | July 2020 |
-| < 2.3.x | :x: | - | - |
-
-If there is ambiguity about which versions of Pulsar are actively supported,
please ask on the [[email protected]](mailto:[email protected])
mailing list.
-
-## Release Frequency
-
-With the acceptance of [PIP-47 - A Time-Based Release
Plan](https://github.com/apache/pulsar/wiki/PIP-47%3A-Time-Based-Release-Plan),
the Pulsar community aims to complete 4 minor releases each year. Patch
releases are completed based on demand as well as need, in the event of
security fixes.
diff --git a/package.json b/package.json
index b99f3ff956f..e8e94cb85cb 100644
--- a/package.json
+++ b/package.json
@@ -39,6 +39,7 @@
"lodash": "^4.17.21",
"md-2-json": "^2.0.0",
"mkdirp": "^1.0.4",
+ "moment": "^2.29.4",
"node-static": "^0.7.11",
"npm": "^8.1.3",
"prism-react-renderer": "^1.2.1",
@@ -49,6 +50,7 @@
"react-svg": "^14.1.13",
"remark-linkify-regex": "^1.0.0",
"replace-in-file": "^6.3.2",
+ "semver": "^7.3.8",
"sine-waves": "^0.3.0",
"url-loader": "^4.1.1"
},
@@ -69,6 +71,7 @@
"@docusaurus/types": "2.2.0",
"@tsconfig/docusaurus": "^1.0.6",
"@types/lodash": "^4.14.188",
+ "@types/semver": "^7.3.13",
"autoprefixer": "^10.4.0",
"highlight.js": "^9.7.0",
"marked": "^0.3.6",
diff --git a/release-notes/pulsar.mdx b/release-notes/pulsar.mdx
index 97c39e997b6..b75ccb26f94 100644
--- a/release-notes/pulsar.mdx
+++ b/release-notes/pulsar.mdx
@@ -10,6 +10,8 @@ import pulsar from "../data/release-pulsar"
## Release notes
+Read more about Pulsar's [release
policy](pathname:///contribute/release-policy).
+
<PulsarReleaseTable data={pulsar} />
## Previous versions
diff --git a/sidebarsDevelopment.js b/sidebarsDevelopment.js
index 99fb7f3d93f..2deef63ac30 100644
--- a/sidebarsDevelopment.js
+++ b/sidebarsDevelopment.js
@@ -48,6 +48,7 @@ const sidebars = {
type: "category",
label: "Releases",
items: [
+ 'release-policy',
{
type: "category",
label: 'Release process',
@@ -58,7 +59,6 @@ const sidebars = {
]
},
'validate-release-candidate',
- 'version-policy',
]
},
{
diff --git a/src/components/SupportedVersionsTable.tsx
b/src/components/SupportedVersionsTable.tsx
new file mode 100644
index 00000000000..8de09d136b0
--- /dev/null
+++ b/src/components/SupportedVersionsTable.tsx
@@ -0,0 +1,178 @@
+import lodash from 'lodash'
+import React from 'react'
+import semver from "semver/preload"
+import {Stack, Table, TableBody, TableCell, TableHead, TableRow} from
"@mui/material"
+
+import releases from '@site/data/release-pulsar'
+import Link from "@docusaurus/Link";
+import useBaseUrl from "@docusaurus/useBaseUrl";
+import moment from "moment";
+import {styled} from "@mui/system";
+
+type SimpleReleaseData = {
+ version: semver.SemVer,
+ released: moment.Moment,
+ releaseNoteLink: string,
+};
+
+type SupportedVersionData = {
+ version: semver.SemVer,
+ released: moment.Moment,
+ activeSupport: moment.Moment,
+ securitySupport: moment.Moment,
+ latest: semver.SemVer,
+ latestReleased: moment.Moment,
+ latestReleaseNoteLink: string,
+};
+
+function resolveActiveSupport(version: semver.SemVer, released:
moment.Moment): moment.Moment {
+ const support = moment(released)
+ if (version.compareMain('3.0.0') < 0) {
+ // before 3.0 - active support for 12 months
+ return support.add(12, 'months')
+ } else if (version.minor > 0) {
+ // regular release - active support for 6 months
+ return support.add(6, 'months')
+ } else {
+ // LTS release - active support for 24 months
+ return support.add(24, 'months')
+ }
+}
+
+function resolveSecuritySupport(version: semver.SemVer, released:
moment.Moment): moment.Moment {
+ const support = moment(released)
+ if (version.compareMain('3.0.0') < 0) {
+ // before 3.0 - security support for 12 months
+ return support.add(12, 'months')
+ } else if (version.minor > 0) {
+ // regular release - security support for 6 months
+ return support.add(6, 'months')
+ } else {
+ // LTS release - security support for 36 months
+ return support.add(36, 'months')
+ }
+}
+
+function isSameFeatureRelease(v1: semver.SemVer, v2: semver.SemVer): boolean {
+ return v1.major == v2.major && v1.minor == v2.minor
+}
+
+function renderVersionCell(version: semver.SemVer): JSX.Element {
+ if (version.compareMain('3.0.0') < 0) {
+ return <TableCell>{version.major}.{version.minor}</TableCell>
+ } else if (version.minor != 0) {
+ return <TableCell>{version.major}.{version.minor}</TableCell>
+ } else {
+ return <TableCell>{version.major}.{version.minor} (LTS)</TableCell>
+ }
+}
+
+function renderReleasedCell(released: moment.Moment): JSX.Element {
+ return <TableCell><>
+ {released.fromNow()}
+ <br/>
+ ({released.format('DD MMM YYYY')})
+ </>
+ </TableCell>
+}
+
+const Dot = styled('div')({
+ width: 15,
+ height: 15,
+ borderRadius: '50%',
+});
+
+function renderSupportCell(support: moment.Moment): JSX.Element {
+ const now = moment()
+ return <TableCell><>
+ <Stack direction="row" spacing={2}>
+ <div style={{marginTop: 10}}>
+ <Dot style={{background: support.isBefore(now) ? 'crimson' :
'mediumaquamarine'}}/>
+ </div>
+ <div style={{color: support.isBefore(now) ? 'crimson' : 'inherit'}}>
+ {support.isBefore(now) ? "Ended" : "End"} {support.fromNow()}
+ <br/>
+ ({support.format('DD MMM YYYY')})
+ </div>
+ </Stack>
+ </>
+ </TableCell>
+}
+
+function renderLatestVersionCell(d: SupportedVersionData): JSX.Element {
+ const now = moment()
+ if (d.activeSupport.isBefore(now) && d.securitySupport.isBefore(now)) {
+ // no longer supported
+ return <TableCell>
+ <del>{d.latest.version}</del>
+ </TableCell>
+ }
+
+ return <TableCell><>
+ <Link href={useBaseUrl(d.latestReleaseNoteLink)}>{d.latest.version}</Link>
+ <br/>
+ ({d.latestReleased.format('DD MMM YYYY')})
+ </>
+ </TableCell>
+}
+
+export default function SupportedVersionsTable(): JSX.Element {
+ let releaseList: SimpleReleaseData[] = releases.map(r => ({
+ version: semver.coerce(r.tagName),
+ released: moment(r.publishedAt),
+ releaseNoteLink: r.releaseNotes,
+ }))
+ releaseList.sort((o1, o2) => semver.rcompare(o1.version, o2.version))
+
+ let supportedVersionList: SupportedVersionData[] = []
+ for (const release of releaseList) {
+ const version = release.version
+ const released = release.released
+ const last = lodash.last(supportedVersionList)
+ if (last && isSameFeatureRelease(last.version, release.version)) {
+ // early patch release - the support period is counted from the first
patch release
+ last.released = release.released
+ last.activeSupport = resolveActiveSupport(last.version, last.released)
+ last.securitySupport = resolveSecuritySupport(last.version,
last.released)
+ continue
+ }
+ supportedVersionList.push({
+ version: version,
+ released: released,
+ activeSupport: resolveActiveSupport(version, released),
+ securitySupport: resolveSecuritySupport(version, released),
+ latest: version,
+ latestReleased: released,
+ latestReleaseNoteLink: release.releaseNoteLink,
+ })
+ }
+
+ const TableHeaderCell = styled(TableCell)({fontWeight: "bold"})
+
+ return <>
+ <Table>
+ <TableHead>
+ <TableRow>
+ <TableHeaderCell>Version</TableHeaderCell>
+ <TableHeaderCell>Released</TableHeaderCell>
+ <TableHeaderCell>Active Support</TableHeaderCell>
+ <TableHeaderCell>Security Support</TableHeaderCell>
+ <TableHeaderCell>Latest</TableHeaderCell>
+ </TableRow>
+ </TableHead>
+ <TableBody>
+ {
+ supportedVersionList.map(r => <>
+ <TableRow>
+ {renderVersionCell(r.version)}
+ {renderReleasedCell(r.released)}
+ {renderSupportCell(r.activeSupport)}
+ {renderSupportCell(r.securitySupport)}
+ {renderLatestVersionCell(r)}
+ </TableRow>
+ </>)
+ }
+ </TableBody>
+ </Table>
+ </>
+}
diff --git a/static/.htaccess b/static/.htaccess
index 065dce262fa..272ee541085 100755
--- a/static/.htaccess
+++ b/static/.htaccess
@@ -21,7 +21,8 @@ RewriteRule "^docs/(.*)$" "/docs/2.11.x/$1" [R=301,DPI,L]
RewriteRule "^docs/(.+/)?develop-binary-protocol/?$"
"/docs/$1developing-binary-protocol" [R=301,DPI,L]
RewriteRule "^docs/(.+/)?administration-dashboard/?$"
"/docs/$1administration-pulsar-manager" [R=301,DPI,L]
RewriteRule "^docs/(.+/)?security-tls-keystore/?$"
"/docs/$1security-tls-authentication" [R=301,DPI,L]
-RewriteRule "^docs/(.+/)?security-policy-and-supported-versions/?$"
"/contribute/version-policy" [R=301,DPI,L]
+RewriteRule "^docs/(.+/)?security-policy-and-supported-versions/?$"
"/contribute/release-policy" [R=301,DPI,L]
+RewriteRule "^contribute/version-policy/?$" "/contribute/release-policy"
[R=301,DPI,L]
RewriteRule "^coding-guide/?$" "/contribute/develop-coding-conventions"
[R=301,DPI,L]
RewriteRule "^contributing/?$" "/contribute" [R=301,DPI,L]