This is an automated email from the ASF dual-hosted git repository.

lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git

commit 1ace1ab7b0d4e467d65fd66db7f78576263f9305
Author: Lari Hotari <[email protected]>
AuthorDate: Thu Jun 11 23:53:04 2026 +0300

    Replace preview releases with milestone releases in release docs
    
    Milestone releases (5.0.0-M1, 5.0.0-M2, ...) are official Apache
    releases made before an upcoming LTS release to gather user feedback
    early, following the same release process as other releases including
    release candidates, voting, and promotion. Each milestone release is
    made from its own temporary release branch (branch-5.0-M1,
    branch-5.0-M2, ...) cut from the master branch, which allows fixing
    release related issues in the branch without a PR going into master
    directly; cherry-picking shouldn't be needed unless an important fix
    lands in master after the branch has been cut. Since milestone
    releases aren't maintained, the branch is dropped after the next
    milestone release or the final LTS release has been published.
    
    Milestone releases are not meant for production use cases, since
    breaking changes can be introduced between the milestone releases and
    the final LTS release. The release announcement template conditionally
    includes a disclaimer about this for milestone versions. In the voting
    email, the included changes for a milestone release link the merged
    PRs of the release's GitHub milestone — there is no previous release
    that would make sense for a comparison link — and -M2 onwards
    additionally link the changes since the previous milestone release.
    
    Update the release policy accordingly and modernize the version
    examples in both documents to 4.0.0 onwards, using 5.0.0-M1 /
    branch-5.0-M1 as the release example in the process document.
---
 contribute/release-policy.md  |  34 +++++-----
 contribute/release-process.md | 149 +++++++++++++++++-------------------------
 2 files changed, 77 insertions(+), 106 deletions(-)

diff --git a/contribute/release-policy.md b/contribute/release-policy.md
index 32b37a4bcba..fe38e35fc8d 100644
--- a/contribute/release-policy.md
+++ b/contribute/release-policy.md
@@ -23,15 +23,13 @@ Concretely, existing releases can expect patches for bugs 
and security vulnerabi
 
 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.
+* 4.0.0 is an LTS release;
+* 4.0.1 is a patch release of the LTS release;
+* 4.1.0 is a feature release;
+* 4.2.0 is a feature release;
+* 4.2.1 is a patch release;
+* 5.0.0-M1 and 5.0.0-M2 are milestone releases made before the next LTS 
release;
+* 5.0.0 is the next LTS release.
 
 ## Compatibility between releases
 
@@ -71,20 +69,20 @@ As part of the release discussion thread, a timeline is 
decided upon for the rel
 
 For feature releases and LTS releases, the last three weeks of the release 
cycle will be marked as a releasing period to finish the pending changes and 
decide on what features (PIP implementations) go into the release version.
 
-As part of this period for an LTS or feature release, there could be multiple 
preview releases and multiple release candidates. A preview release is one that 
is not intended to be released. The purpose of the preview release is to allow 
users to start testing the new release functionality by making the release 
binaries available. The preview release will contain a suffix `-pre.1`, 
`-pre.2`. Preview releases don't apply to patch releases.
+Before an LTS release, there could be multiple milestone releases, and as part 
of the releasing period, multiple release candidates. Milestone releases are 
official ASF releases with a `-M1`, `-M2`, … suffix (for example `5.0.0-M1`), 
and they go through the normal [release process](release-process.md) including 
release candidates and voting. Each milestone release is made from its own 
temporary release branch (for example `branch-5.0-M1`) cut from the master 
branch; since milestone relea [...]
 
-Here's an example of the 4.0.0 LTS release timeline:
+Here's an example of a 5.0.0 LTS release timeline:
 
-* 2024-09-26 - Target publishing date for 4.0 preview 1 (4.0.0-pre.1)
-* 2024-10-03 - Target publishing date for 4.0 preview 2 (4.0.0-pre.2)
-* 2024-10-07 - Code freeze for 4.0 by branching branch-4.0 from the master 
branch
-* 2024-10-10 - Target publishing date for 4.0 release candidate 1
-* 2024-10-15 - Reserved for 4.0 release candidate 2 if needed
-* 2024-10-17 - Announcement date for 4.0.0
+* Target publishing date for the 5.0.0-M1 milestone release
+* Target publishing date for the 5.0.0-M2 milestone release
+* Code freeze for 5.0 by branching branch-5.0 from the master branch
+* Target publishing date for 5.0 release candidate 1
+* Reserved for 5.0 release candidate 2 if needed
+* Announcement date for 5.0.0
 
 The LTS or feature release timeline will also note the target date for 
branching the release branch off the master branch. After that point in time, 
the release manager will coordinate the changes that will be included in the 
release branch. The intention is to minimize the risk of delaying the release 
and only include bug fixes involving a regression of behavior compared to a 
previous release or critical improvements to the new features (PIP 
implementations) that are part of the release.
 
-For patch releases, the process is similar, but there is no branching off the 
master branch since the release branch already exists. The patch release 
doesn't contain preview releases.
+For patch releases, the process is similar, but there is no branching off the 
master branch since the release branch already exists. The patch release 
doesn't contain milestone releases.
 
 The preparation of releases is handled according to the [release 
process](release-process.md). The release manager is responsible for updating 
the process documentation when there's a need to adapt the process. There's 
also a guide for [release validation](validate-release-candidate.md) which is 
used by Pulsar contributors before voting on releases. Before releases are 
announced, the release will be voted upon on the [Pulsar dev mailing 
list](https://lists.apache.org/list.html?dev@pulsar [...]
 
diff --git a/contribute/release-process.md b/contribute/release-process.md
index 538b92ea65d..164fc7e1d41 100644
--- a/contribute/release-process.md
+++ b/contribute/release-process.md
@@ -7,9 +7,9 @@ This page contains instructions for Pulsar committers on how to 
perform a releas
 
 The term feature/patch releases used throughout this document is defined as 
follows:
 
-* 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.
-* Preview release refer to LTS release preview releases that happen in the 
releasing of a LTS version. 
+* Feature releases contain 4.1.0, 4.2.0, 5.0.0, and so on.
+* Patch releases refer to bug-fix releases, such as 4.2.1, 4.2.2, and so on.
+* Milestone releases, such as 5.0.0-M1, 5.0.0-M2, and so on, are made before 
an upcoming LTS release from a temporary release branch (such as 
`branch-5.0-M1`) that is cut from the master branch.
 
 :::note
 
@@ -29,7 +29,9 @@ Open a discussion on [email protected] to notify others 
that you volunteer t
 
 For LTS and 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 preview releases of a LTS release, a branch `branch-X.0-preview` is 
created. This branch will is used to hold the commit to change the version to 
the preview version. Preview releases will be tagged in this branch.
+For milestone releases of an upcoming LTS release, each milestone release uses 
its own release branch `branch-X.Y-MN` (for example `branch-5.0-M1`, 
`branch-5.0-M2`, …) cut from the master branch. The branch holds the commit 
that changes the version to the milestone version, and the milestone release is 
tagged in this branch. Using a release branch allows fixing possible release 
related issues in the branch without a PR going into the master branch 
directly. There shouldn't be a need to p [...]
+
+The milestone release branches should be considered temporary: since milestone 
releases aren't maintained, the branch is dropped after the next milestone 
release or the final LTS release has been published.
 
 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.
 
@@ -60,10 +62,12 @@ To verify the release branch is not broken, you should 
trigger a Pulsar CI build
 ## Set environment variables to be used across the commands {#env-vars}
 
 ```shell
-export VERSION_RC=4.0.7-candidate-1
+export VERSION_RC=5.0.0-M1-candidate-1
 export VERSION_WITHOUT_RC=${VERSION_RC%-candidate-*}
-export NEXT_VERSION_WITHOUT_RC=4.0.8
-export VERSION_BRANCH=branch-4.0
+export NEXT_VERSION_WITHOUT_RC=5.0.0-M2
+export VERSION_BRANCH=branch-5.0-M1
+# for milestone releases, set the upcoming LTS release version (used in the 
release announcement)
+export LTS_RELEASE=5.0
 export UPSTREAM_REMOTE=origin
 export SDKMAN_JAVA_VERSION=21
 # set the pulsar.includeBuildInfo project property for all Gradle invocations 
in this shell session
@@ -73,16 +77,6 @@ export 
GRADLE_OPTS="-Dorg.gradle.project.pulsar.includeBuildInfo=true"
 
 Release builds must include the real git commit / build metadata in the 
binaries, which is enabled with the `pulsar.includeBuildInfo=true` project 
property (the default is `false` so that local development and CI builds don't 
regenerate the metadata on every change). The `GRADLE_OPTS` export above sets 
the property for every Gradle invocation in the shell session. The property 
must be set consistently for every Gradle invocation of the release process — 
if it changes between invocations, [...]
 
-Example for preview releases:
-
-```shell
-export VERSION_RC=4.0.0-preview.1
-export VERSION_WITHOUT_RC=${VERSION_RC%-candidate-*}
-export VERSION_BRANCH=branch-4.0-preview
-export UPSTREAM_REMOTE=origin
-export SDKMAN_JAVA_VERSION=21
-```
-
 Set your ASF user id
 
 ```shell
@@ -114,9 +108,9 @@ alias pbcopy="xsel --clipboard --input"
 
 We are going to create a release branch 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 feature releases, and not for patch 
releases like `3.3.2`. For patch releases, go to the next step.
+The branch needs only to be created for feature releases, and not for patch 
releases like `4.2.2`. For patch releases, go to the next step.
 
-For example, when working on `3.3.0` release, the branch `branch-3.3` will be 
created; but for `3.3.1`, the existing `branch-3.3` will be used.
+For example, when working on `4.2.0` release, the branch `branch-4.2` will be 
created; but for `4.2.1`, the existing `branch-4.2` will be used.
 
 It is recommended to create a fresh clone of the repository to avoid any local 
files interfering in the process:
 
@@ -272,8 +266,8 @@ cd pulsar-$VERSION_RC
 # stage the release artifacts
 $PULSAR_PATH/src/stage-release.sh .
 
-# Please check the size of the files in the `pulsar-3.X.Y-candidate-1`.
-# If you build the artifacts without a clean workspace, the 
`apache-pulsar-3.X.Y-src.tar.gz` files
+# Please check the size of the files in the `pulsar-X.Y.Z-candidate-1`.
+# If you build the artifacts without a clean workspace, the 
`apache-pulsar-X.Y.Z-src.tar.gz` files
 # may be too large to be unable to upload.
 ls -ltra
 du -ms *
@@ -341,7 +335,7 @@ Log in to the ASF Nexus repository at 
https://repository.apache.org
 
 Click on "Staging Repositories" on the left sidebar and then select the 
current Pulsar staging repo. This should be called something like 
`orgapachepulsar-XYZ`.
 
-Add a version string such as "Apache Pulsar 3.0.4-candidate-1" to the 
clipboard with this command:
+Add a version string such as "Apache Pulsar 5.0.0-M1-candidate-1" to the 
clipboard with this command:
 
 ```shell
 printf "Apache Pulsar $VERSION_RC" |pbcopy
@@ -406,7 +400,33 @@ Set these shell variables
 DOCKER_USER=<your-dockerhub-username>
 STAGING_REPO="<enter staging repo from 
https://repository.apache.org/#stagingRepositories>"
 MY_NAME="Firstname Lastname"
-PREVIOUS_VERSION_WITHOUT_RC="4.0.6"
+```
+
+Set the `INCLUDED_CHANGES` variable that lists the included changes in the 
voting email.
+
+For a regular release, link the changes since the previous release:
+
+```shell
+PREVIOUS_VERSION_WITHOUT_RC="4.2.2"
+INCLUDED_CHANGES="Included changes since the previous release:
+https://github.com/apache/pulsar/compare/v$PREVIOUS_VERSION_WITHOUT_RC...v$VERSION_RC";
+```
+
+For a milestone release, there is no previous release that would make sense 
for the comparison. Instead, link the merged PRs of the release's GitHub 
milestone:
+
+```shell
+INCLUDED_CHANGES="Included changes, the merged PRs of the $VERSION_WITHOUT_RC 
milestone:
+https://github.com/apache/pulsar/pulls?q=is%3Apr+is%3Amerged+milestone%3A$VERSION_WITHOUT_RC";
+```
+
+For the second and later milestone releases (`-M2` onwards), additionally link 
the changes since the previous milestone release:
+
+```shell
+PREVIOUS_MILESTONE="5.0.0-M1"
+INCLUDED_CHANGES="$INCLUDED_CHANGES
+
+Changes since the previous milestone release:
+https://github.com/apache/pulsar/compare/v$PREVIOUS_MILESTONE...v$VERSION_RC";
 ```
 
 ```shell
@@ -448,8 +468,7 @@ Hello Apache Pulsar Community,
 
 This is a call for the vote to release the Apache Pulsar version 
$VERSION_WITHOUT_RC based on $VERSION_RC.
 
-Included changes since the previous release:
-https://github.com/apache/pulsar/compare/v$PREVIOUS_VERSION_WITHOUT_RC...v$VERSION_RC
+$INCLUDED_CHANGES
 
 *** Please download, test and vote on this release. This vote will stay open
 for at least $VOTE_DURATION hours ***
@@ -499,67 +518,11 @@ The vote should be open for at least 72 hours (3 days). 
Votes from Pulsar PMC me
 
 If the release is approved here with 3 +1 binding votes, you can then proceed 
to the next step. Otherwise, you should repeat the previous steps and prepare 
another release candidate to vote.
 
-## LTS Preview release steps (this only applies to preview releases such as 
4.0.0-preview.1)
-
-For preview releases there is no release voting. The preview release is 
directly announced on Pulsar user and dev mailing lists to get release feedback 
before the official LTS release.
-
-A preview release is not an official Apache release and it's comparable to a 
nightly build of a project.
-The preview release artifacts will be made available on Maven central and 
Docker Hub so that users can practically use the artifacts in their existing 
build pipelines and provide feedback to the project. Binaries are complementary 
in Apache projects and don't state an official ASF release.
+## Milestone release steps (this only applies to milestone releases such as 
5.0.0-M1)
 
-Before continuing, perform a local [release 
validation](validate-release-candidate.md) for the artifacts.
-After this, follow the steps "Release Maven modules" and "Release Docker 
images" to publish the preview release in Maven central and DockerHub. The 
preview release isn't an official release and therefore the sources should NOT 
be released on SVN.
+Milestone releases (5.0.0-M1, 5.0.0-M2, …) are official Apache releases made 
before an upcoming LTS release to gather user feedback early. They follow the 
same release process as other releases, including the release candidates, 
voting, and promoting the release. Each milestone release is made from its own 
temporary release branch (`branch-5.0-M1`, `branch-5.0-M2`, …) cut from the 
master branch, which is dropped after the next milestone release or the final 
LTS release has been published [...]
 
-Set the environment variables:
-
-```shell
-PULSAR_IMAGE_NAME=apachepulsar/pulsar:$VERSION_WITHOUT_RC
-PULSAR_ALL_IMAGE_NAME=apachepulsar/pulsar-all:$VERSION_WITHOUT_RC
-LTS_RELEASE=4.0
-```
-
-To announce a LTS preview release, you can use this template:
-
-```shell
-tee >(pbcopy) <<EOF
-To: [email protected], [email protected]
-Subject: Apache Pulsar $VERSION_WITHOUT_RC available for testing - Feedback 
requested
-
-Dear Apache Pulsar Community,
-
-We're excited to announce the availability of Apache Pulsar 
$VERSION_WITHOUT_RC, a preview release aimed at gathering user feedback for the 
upcoming Pulsar $LTS_RELEASE LTS release. This preview is not an official 
Apache release but provides an early look at the new features and changes.
-
-Preview artifacts are now available on Maven Central and Docker Hub, enabling 
users to integrate and test them in their build pipelines and environments. You 
can find downloadable artifacts at 
https://dist.apache.org/repos/dist/dev/pulsar/pulsar-$VERSION_RC/.
-
-Repository tag: v$VERSION_RC (commit $(git rev-parse v$VERSION_RC^{commit}))
-https://github.com/apache/pulsar/releases/tag/v$VERSION_RC
-
-Changes since $PREVIOUS_VERSION_WITHOUT_RC:
-https://github.com/apache/pulsar/compare/v$PREVIOUS_VERSION_WITHOUT_RC...v$VERSION_RC
-
-Docker images: $PULSAR_IMAGE_NAME and $PULSAR_ALL_IMAGE_NAME.
-Docker image tag is "$VERSION_WITHOUT_RC".
-
-For Java client testing, we recommend using the Pulsar BOM in Maven or Gradle 
builds with version "$VERSION_WITHOUT_RC".
-Pulsar BOM usage is explained at 
https://pulsar.apache.org/docs/next/client-libraries-java-setup/#pulsar-bom.
-
-We urge you to test this preview in your environments and provide feedback. 
Please report any issues on our GitHub issue tracker at 
https://github.com/apache/pulsar/issues, checking for existing reports first.
-Known blockers are tracked with the "release/blocker" label at 
https://github.com/apache/pulsar/labels/release%2Fblocker.
-
-Pulsar $LTS_RELEASE timeline:
-$(date -I): $LTS_RELEASE preview 1
-$(date --date="10 days" -I): Target for $LTS_RELEASE preview 2
-$(date --date="10 days" -I): Code freeze for $LTS_RELEASE by branching 
branch-$LTS_RELEASE from the master branch
-$(date --date="13 days" -I): Target for $LTS_RELEASE release candidate 1
-$(date --date="18 days" -I): Reserved for $LTS_RELEASE release candidate 2 if 
needed
-$(date --date="20 days" -I): Planned $LTS_RELEASE.0 announcement (if release 
candidate 1 passes)
-
-Your participation is crucial in shaping the quality of Pulsar $LTS_RELEASE. 
We appreciate your support and feedback.
-
-Best regards,
-
-$MY_NAME
-EOF
-```
+Milestone releases are not meant for production use cases, since breaking 
changes can be introduced between the milestone releases and the final LTS 
release. The main difference in the process is the [release 
announcement](#announce-the-release), which includes a disclaimer about this. 
Make sure the `LTS_RELEASE` environment variable is set as described in the 
[environment variables step](#env-vars) so that the announcement template 
renders the disclaimer.
 
 ## Summarize the voting for the release
 
@@ -621,7 +584,7 @@ echo "[""Cherry-picked 
changes](https://github.com/apache/pulsar/pulls?q=is%3Apr
 2. Find "Previous tag: auto" in the UI above the text box and choose the 
previous release there.
 3. Click "Generate release notes".
 4. Review the generated release notes.
-5. Since changes are cherry-picked, you will have to include a link such as 
[Cherry-picked 
changes](https://github.com/apache/pulsar/pulls?q=is%3Apr+is%3Amerged+label%3Arelease%2F2.11.4+label%3Acherry-picked%2Fbranch-2.11+sort%3Acreated-asc).
 There's a [separate guide for generating automated release 
notes](release-note-guide.md).
+5. Since changes are cherry-picked, you will have to include a link such as 
[Cherry-picked 
changes](https://github.com/apache/pulsar/pulls?q=is%3Apr+is%3Amerged+label%3Arelease%2F4.2.2+label%3Acherry-picked%2Fbranch-4.2+sort%3Acreated-asc).
 There's a [separate guide for generating automated release 
notes](release-note-guide.md).
 6. Unselect "Set as the latest release" (that should be only selected for the 
actual latest release of Pulsar)
 7. Click "Publish release".
 
@@ -840,7 +803,7 @@ This step is for feature releases only, unless you're sure 
that significant refe
 You can generate references of config and command-line tool by running the 
following script from the main branch of apache/pulsar-site repo:
 
 ```shell
-# build Pulsar distributions under /path/to/pulsar-3.X.Y
+# build Pulsar distributions under /path/to/pulsar-X.Y.Z
 cd tools/pytools
 poetry install
 # ensure that defaults using Runtime.getRuntime().availableProcessors() will 
be based on 1 as the number of CPUs
@@ -896,12 +859,22 @@ Otherwise, you should update the dropdown version list in 
this file: `src/theme/
 Once the release artifacts are available in the Apache Mirrors and the website 
is updated, you need to announce the release. You should email to 
[email protected], [email protected], and [email protected]. Here 
is a sample content:
 
 ```shell
+# for milestone releases (version contains -M), a disclaimer is included in 
the announcement
+MILESTONE_NOTICE=""
+if [[ "$VERSION_WITHOUT_RC" == *-M* ]]; then
+  MILESTONE_NOTICE="
+$VERSION_WITHOUT_RC is a milestone release for the upcoming Pulsar $LTS_RELEASE
+LTS release, made to gather user feedback early. It is not meant for production
+use cases, since breaking changes can be introduced between the milestone
+releases and the final Pulsar $LTS_RELEASE LTS release.
+"
+fi
 tee >(pbcopy) <<EOF
 To: [email protected], [email protected], [email protected]
 Subject: [ANNOUNCE] Apache Pulsar $VERSION_WITHOUT_RC released
 
 The Apache Pulsar team is proud to announce Apache Pulsar version 
$VERSION_WITHOUT_RC.
-
+$MILESTONE_NOTICE
 Pulsar is a highly scalable, low latency messaging platform running on
 commodity hardware. It provides simple pub-sub semantics over topics,
 guaranteed at-least-once delivery of messages, automatic cursor management for
@@ -941,7 +914,7 @@ Remove the old releases (if any). You only need the latest 
release there, and ol
 svn ls https://dist.apache.org/repos/dist/release/pulsar
 
 # Delete each release (except for the last one)
-svn rm https://dist.apache.org/repos/dist/release/pulsar/pulsar-3.X.X
+svn rm https://dist.apache.org/repos/dist/release/pulsar/pulsar-X.Y.Z
 ```
 
 ## Move to the next snapshot version

Reply via email to