You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by GitBox <gi...@apache.org> on 2022/12/27 11:58:33 UTC

[GitHub] [pulsar-client-python] BewareMyPower opened a new pull request, #68: Add the release process for Python client

BewareMyPower opened a new pull request, #68:
URL: https://github.com/apache/pulsar-client-python/pull/68

   Fixes https://github.com/apache/pulsar-client-python/issues/64
   
   It also adds a `upload-pypi.sh` that downloads the wheels from the Apache's SVN project and upload them to PyPI.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1057991716


##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`user@apache.org`):
+
+```
+default-key <key fingerprint>
+```
+
+Make sure `curl`, `jq`, `unzip`, `gpg`, `shasum` commands are available. Then you should run the following commands in an empty directory:
+
+```bash
+svn co https://dist.apache.org/repos/dist/dev/pulsar pulsar-dist-dev-keys --depth empty
+cd pulsar-dist-dev-keys
+svn mkdir pulsar-client-python-X.Y.Z-candidate-N && cd pulsar-client-python-X.Y.Z-candidate-N
+# PROJECT_DIR is the directory of the pulsar-client-python repository 
+$PROJECT_DIR/build-support/stage-release.sh vX.Y.Z-candidate-N $WORKFLOW_ID
+svn add *
+svn ci -m "Staging artifacts and signature for Python client X.Y.Z-candidate-N"
+```
+
+## Start the vote for the candidate
+
+Send an email to dev@pulsar.apache.org to start the vote for the candidate:
+
+```
+To: dev@pulsar.apache.org
+Subject: [VOTE] Pulsar Client Python Release X.Y.Z Candidate N
+
+This is the third release candidate for Apache Pulsar Client Python,
+version X.Y.Z.
+
+It fixes the following issues:
+https://github.com/apache/pulsar-client-python/milestone/<milestone-id>?closed=1
+
+*** Please download, test and vote on this release. This vote will
+stay open for at least 72 hours ***
+
+Python wheels:
+https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N/
+
+The supported python versions are 3.7, 3.8, 3.9 and 3.10. The
+supported platforms and architectures are:
+- Windows x86_64 (windows/)
+- glibc-based Linux x86_64 (linux-glibc-x86_64/)
+- glibc-based Linux arm64 (linux-glibc-arm64/)
+- musl-based Linux x86_64 (linux-musl-x86_64/)
+- musl-based Linux arm64 (linux-musl-arm64/)
+- macOS universal 2 (macos/)
+
+The tag to be voted upon: vX.Y.Z-candidate-N
+(<commit-id>)
+https://github.com/apache/pulsar-client-python/releases/tag/vX.Y.Z-candidate-N
+
+Pulsar's KEYS file containing PGP keys you use to sign the release:
+https://dist.apache.org/repos/dist/dev/pulsar/KEYS
+
+Please download the Python wheels and follow the README to test.
+```
+
+Once there are at least 3 binding +1s, the vote will be ready to close and you can continue the following steps. If there is something wrong with the candidate, you need to fix it and repeat the steps from the **Cut the next candidate** section again.
+
+## Promote the release
+
+Go to the candidate directory (`pulsar-client-python-X.Y.Z-candidate-N`) in the SVN project, rename the source code and its signatures: 
+
+```bash
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz pulsar-client-python-X.Y.Z.tar.gz
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.asc pulsar-client-python-X.Y.Z.tar.gz.asc
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.sha512 pulsar-client-python-X.Y.Z.tar.gz.sha512
+sha512sum pulsar-client-python-X.Y.Z.tar.gz > pulsar-client-python-X.Y.Z.tar.gz.sha512
+svn add pulsar-client-python-X.Y.Z.tar.gz.sha512 --force
+svn ci -m "Remove the candidate-N suffix in Python client X.Y.Z"
+```
+
+Then ask a PMC member to promote the release:
+
+```bash
+svn move -m "Release Apache Pulsar Client Python X.Y.Z" \
+  https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N \
+  https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+## Upload the wheels to PyPI
+
+1. You need to create an account on PyPI: https://pypi.org/account/register/
+2. Ask anyone that has been a release manager before to add you as a maintainer for pulsar-docker on PyPI
+3. Once you have completed the following steps in this section, you can check if the wheels are uploaded successfully in Download files. Remember to switch to the correct version in Release history).
+
+Then, upload the wheels to PyPI:
+
+```bash
+sudo python3 -m pip install twine
+./build-support/upload-pypi.sh https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+To verify the wheels have been uploaded successfully, you can try installing the wheel:
+
+```bash
+python3 -m pip install pulsar-client==X.Y.Z
+```
+
+## Write release notes
+
+Push the official tag:
+
+```bash
+git checkout vX.Y.Z-candidate-N
+git tag vX.Y.Z
+git push origin vX.Y.Z
+```
+
+Then, [create a release](https://github.com/apache/pulsar-client-python/releases/new) and choose the `vX.Y.Z` tag. Here is an example release note: https://github.com/apache/pulsar-client-python/releases/tag/v3.0.0
+
+You can run the following command to generate the **What's Changed** section:
+
+```bash
+gh pr list -L 200 --search "is:pr milestone:3.0.0 is:merged" --json title,url,author \
+ | jq '.[] | "* \(.title) by @\(.author.login) in \(.url)"' \
+ | sed 's/^"\(.*\)"$/\1/'
+```
+
+Then, create a PR in [`pulsar-site`](https://github.com/apache/pulsar-site) repo to update the website. Here is an example: https://github.com/apache/pulsar-site/pull/343
+
+## Generate the API documents
+
+For minor releases, skip this section. For major releases, you should generate the HTML files into the [`pulsar-site`](https://github.com/apache/pulsar-site) repo:
+
+```bash

Review Comment:
   I agree. I will add the commands.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1058046701


##########
RELEASE.md:
##########
@@ -201,13 +195,22 @@ Then, create a PR in [`pulsar-site`](https://github.com/apache/pulsar-site) repo
 For minor releases, skip this section. For major releases, you should generate the HTML files into the [`pulsar-site`](https://github.com/apache/pulsar-site) repo:
 
 ```bash
+git clone git@github.com:apache/pulsar-client-python.git
+cd pulsar-client-python
 git checkout vX.Y.0
+# It's better to replace this URL with the URL of your own fork
+git clone git@github.com:apache/pulsar-site.git
 pydoctor --make-html \

Review Comment:
   I'd rather keep the current method though it took more steps. The `bin/py-apidoc-generator.py` is not user-friendly because it requires Python 3.10+.
   
   ```bash
   $ poetry run bin/py-apidoc-generator.py 3.0.0
   The currently activated Python version 3.8.10 is not supported by the project (^3.10).
   Trying to find and use a compatible version.
   
   Poetry was unable to find a compatible version. If you have one, you can explicitly use it via the "env use" command.
   ```
   
   I used Ubuntu 20.04 to release the Python client, the default Python version is 3.8 whose EOL is 14 Oct 2024. The Pulsar Python client supports Python 3.7+. IMO, such a tool that requires Python 3.10+ is not better than `pydoctor`.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] RobertIndie commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
RobertIndie commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1058843148


##########
RELEASE.md:
##########
@@ -0,0 +1,251 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **Note**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+>
+> This guide use `X.Y.Z` or `X.Y` to represent the actual versions like `3.0.0` or `3.0`.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping other committers to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id, which will be passed as an argument of `stage-release.sh` in the following step. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`<your-name>@apache.org`):
+
+```
+default-key <key fingerprint>
+```
+
+Make sure `curl`, `jq`, `unzip`, `gpg`, `shasum` commands are available. Then you should run the following commands in an empty directory:
+
+```bash
+svn co https://dist.apache.org/repos/dist/dev/pulsar pulsar-dist-dev-keys --depth empty
+cd pulsar-dist-dev-keys
+svn mkdir pulsar-client-python-X.Y.Z-candidate-N && cd pulsar-client-python-X.Y.Z-candidate-N
+# PROJECT_DIR is the directory of the pulsar-client-python repository 
+$PROJECT_DIR/build-support/stage-release.sh vX.Y.Z-candidate-N $WORKFLOW_ID
+svn add *
+svn ci -m "Staging artifacts and signature for Python client X.Y.Z-candidate-N"
+```
+
+## Start the vote for the candidate
+
+Send an email to dev@pulsar.apache.org to start the vote for the candidate:
+
+```
+To: dev@pulsar.apache.org
+Subject: [VOTE] Pulsar Client Python Release X.Y.Z Candidate N
+
+This is the third release candidate for Apache Pulsar Client Python,
+version X.Y.Z.
+
+It fixes the following issues:
+https://github.com/apache/pulsar-client-python/milestone/<milestone-id>?closed=1
+
+*** Please download, test and vote on this release. This vote will
+stay open for at least 72 hours ***
+
+Python wheels:
+https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N/
+
+The supported python versions are 3.7, 3.8, 3.9 and 3.10. The
+supported platforms and architectures are:
+- Windows x86_64 (windows/)
+- glibc-based Linux x86_64 (linux-glibc-x86_64/)
+- glibc-based Linux arm64 (linux-glibc-arm64/)
+- musl-based Linux x86_64 (linux-musl-x86_64/)
+- musl-based Linux arm64 (linux-musl-arm64/)
+- macOS universal 2 (macos/)
+
+The tag to be voted upon: vX.Y.Z-candidate-N
+(<commit-id>)
+https://github.com/apache/pulsar-client-python/releases/tag/vX.Y.Z-candidate-N
+
+Pulsar's KEYS file containing PGP keys you use to sign the release:
+https://dist.apache.org/repos/dist/dev/pulsar/KEYS
+
+Please download the Python wheels and follow the README to test.
+```
+
+Once there are at least 3 binding +1s, the vote will be ready to close and you can continue the following steps. If there is something wrong with the candidate, you need to fix it and repeat the steps from the **Cut the next candidate** section again.
+
+## Promote the release
+
+Go to the candidate directory (`pulsar-client-python-X.Y.Z-candidate-N`) in the SVN project, rename the source code and its signatures: 
+
+```bash
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz pulsar-client-python-X.Y.Z.tar.gz

Review Comment:
   Why don't we generate the source tar file without `-candidate-N` suffix?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1057995718


##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`user@apache.org`):
+
+```
+default-key <key fingerprint>
+```
+
+Make sure `curl`, `jq`, `unzip`, `gpg`, `shasum` commands are available. Then you should run the following commands in an empty directory:
+
+```bash
+svn co https://dist.apache.org/repos/dist/dev/pulsar pulsar-dist-dev-keys --depth empty
+cd pulsar-dist-dev-keys
+svn mkdir pulsar-client-python-X.Y.Z-candidate-N && cd pulsar-client-python-X.Y.Z-candidate-N
+# PROJECT_DIR is the directory of the pulsar-client-python repository 
+$PROJECT_DIR/build-support/stage-release.sh vX.Y.Z-candidate-N $WORKFLOW_ID
+svn add *
+svn ci -m "Staging artifacts and signature for Python client X.Y.Z-candidate-N"
+```
+
+## Start the vote for the candidate
+
+Send an email to dev@pulsar.apache.org to start the vote for the candidate:
+
+```
+To: dev@pulsar.apache.org
+Subject: [VOTE] Pulsar Client Python Release X.Y.Z Candidate N
+
+This is the third release candidate for Apache Pulsar Client Python,
+version X.Y.Z.
+
+It fixes the following issues:
+https://github.com/apache/pulsar-client-python/milestone/<milestone-id>?closed=1
+
+*** Please download, test and vote on this release. This vote will
+stay open for at least 72 hours ***
+
+Python wheels:
+https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N/
+
+The supported python versions are 3.7, 3.8, 3.9 and 3.10. The
+supported platforms and architectures are:
+- Windows x86_64 (windows/)
+- glibc-based Linux x86_64 (linux-glibc-x86_64/)
+- glibc-based Linux arm64 (linux-glibc-arm64/)
+- musl-based Linux x86_64 (linux-musl-x86_64/)
+- musl-based Linux arm64 (linux-musl-arm64/)
+- macOS universal 2 (macos/)
+
+The tag to be voted upon: vX.Y.Z-candidate-N
+(<commit-id>)
+https://github.com/apache/pulsar-client-python/releases/tag/vX.Y.Z-candidate-N
+
+Pulsar's KEYS file containing PGP keys you use to sign the release:
+https://dist.apache.org/repos/dist/dev/pulsar/KEYS
+
+Please download the Python wheels and follow the README to test.
+```
+
+Once there are at least 3 binding +1s, the vote will be ready to close and you can continue the following steps. If there is something wrong with the candidate, you need to fix it and repeat the steps from the **Cut the next candidate** section again.
+
+## Promote the release
+
+Go to the candidate directory (`pulsar-client-python-X.Y.Z-candidate-N`) in the SVN project, rename the source code and its signatures: 
+
+```bash
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz pulsar-client-python-X.Y.Z.tar.gz
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.asc pulsar-client-python-X.Y.Z.tar.gz.asc
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.sha512 pulsar-client-python-X.Y.Z.tar.gz.sha512
+sha512sum pulsar-client-python-X.Y.Z.tar.gz > pulsar-client-python-X.Y.Z.tar.gz.sha512
+svn add pulsar-client-python-X.Y.Z.tar.gz.sha512 --force
+svn ci -m "Remove the candidate-N suffix in Python client X.Y.Z"
+```
+
+Then ask a PMC member to promote the release:
+
+```bash
+svn move -m "Release Apache Pulsar Client Python X.Y.Z" \
+  https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N \
+  https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+## Upload the wheels to PyPI
+
+1. You need to create an account on PyPI: https://pypi.org/account/register/
+2. Ask anyone that has been a release manager before to add you as a maintainer for pulsar-docker on PyPI
+3. Once you have completed the following steps in this section, you can check if the wheels are uploaded successfully in Download files. Remember to switch to the correct version in Release history).
+
+Then, upload the wheels to PyPI:
+
+```bash
+sudo python3 -m pip install twine
+./build-support/upload-pypi.sh https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+To verify the wheels have been uploaded successfully, you can try installing the wheel:
+
+```bash
+python3 -m pip install pulsar-client==X.Y.Z
+```
+
+## Write release notes
+
+Push the official tag:
+
+```bash
+git checkout vX.Y.Z-candidate-N
+git tag vX.Y.Z
+git push origin vX.Y.Z
+```
+
+Then, [create a release](https://github.com/apache/pulsar-client-python/releases/new) and choose the `vX.Y.Z` tag. Here is an example release note: https://github.com/apache/pulsar-client-python/releases/tag/v3.0.0
+
+You can run the following command to generate the **What's Changed** section:
+
+```bash
+gh pr list -L 200 --search "is:pr milestone:3.0.0 is:merged" --json title,url,author \
+ | jq '.[] | "* \(.title) by @\(.author.login) in \(.url)"' \
+ | sed 's/^"\(.*\)"$/\1/'
+```
+
+Then, create a PR in [`pulsar-site`](https://github.com/apache/pulsar-site) repo to update the website. Here is an example: https://github.com/apache/pulsar-site/pull/343
+
+## Generate the API documents
+
+For minor releases, skip this section. For major releases, you should generate the HTML files into the [`pulsar-site`](https://github.com/apache/pulsar-site) repo:
+
+```bash
+git checkout vX.Y.0
+pydoctor --make-html \
+  --html-viewsource-base=https://github.com/apache/pulsar-client-python/tree/vX.Y.0 \
+  --docformat=numpy --theme=readthedocs \
+  --intersphinx=https://docs.python.org/3/objects.inv \
+  --html-output=/path/to/pulsar-site/site2/website-next/static/api/python/X.Y.x \
+  pulsar
+```
+
+Then open a PR like: https://github.com/apache/pulsar-site/pull/342

Review Comment:
   See the **Write release notes** section.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] tisonkun commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
tisonkun commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1058006343


##########
RELEASE.md:
##########
@@ -201,13 +195,22 @@ Then, create a PR in [`pulsar-site`](https://github.com/apache/pulsar-site) repo
 For minor releases, skip this section. For major releases, you should generate the HTML files into the [`pulsar-site`](https://github.com/apache/pulsar-site) repo:
 
 ```bash
+git clone git@github.com:apache/pulsar-client-python.git
+cd pulsar-client-python
 git checkout vX.Y.0
+# It's better to replace this URL with the URL of your own fork
+git clone git@github.com:apache/pulsar-site.git
 pydoctor --make-html \

Review Comment:
   Actually, this API docs generation step is after the release and I already write a script to achieve it with one command: https://github.com/apache/pulsar-site/tree/main/tools/pytools#py-apidoc-generator
   
   ```bash
   poetry run bin/py-apidoc-generator.py 3.1.0
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower commented on pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower commented on PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#issuecomment-1366296523

   I've updated the release process, PTAL again, @tisonkun 


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1057991541


##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`user@apache.org`):
+
+```
+default-key <key fingerprint>
+```
+
+Make sure `curl`, `jq`, `unzip`, `gpg`, `shasum` commands are available. Then you should run the following commands in an empty directory:
+
+```bash
+svn co https://dist.apache.org/repos/dist/dev/pulsar pulsar-dist-dev-keys --depth empty
+cd pulsar-dist-dev-keys
+svn mkdir pulsar-client-python-X.Y.Z-candidate-N && cd pulsar-client-python-X.Y.Z-candidate-N
+# PROJECT_DIR is the directory of the pulsar-client-python repository 
+$PROJECT_DIR/build-support/stage-release.sh vX.Y.Z-candidate-N $WORKFLOW_ID
+svn add *
+svn ci -m "Staging artifacts and signature for Python client X.Y.Z-candidate-N"
+```
+
+## Start the vote for the candidate
+
+Send an email to dev@pulsar.apache.org to start the vote for the candidate:
+
+```
+To: dev@pulsar.apache.org
+Subject: [VOTE] Pulsar Client Python Release X.Y.Z Candidate N
+
+This is the third release candidate for Apache Pulsar Client Python,
+version X.Y.Z.
+
+It fixes the following issues:
+https://github.com/apache/pulsar-client-python/milestone/<milestone-id>?closed=1
+
+*** Please download, test and vote on this release. This vote will
+stay open for at least 72 hours ***
+
+Python wheels:
+https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N/
+
+The supported python versions are 3.7, 3.8, 3.9 and 3.10. The
+supported platforms and architectures are:
+- Windows x86_64 (windows/)
+- glibc-based Linux x86_64 (linux-glibc-x86_64/)
+- glibc-based Linux arm64 (linux-glibc-arm64/)
+- musl-based Linux x86_64 (linux-musl-x86_64/)
+- musl-based Linux arm64 (linux-musl-arm64/)
+- macOS universal 2 (macos/)
+
+The tag to be voted upon: vX.Y.Z-candidate-N
+(<commit-id>)
+https://github.com/apache/pulsar-client-python/releases/tag/vX.Y.Z-candidate-N
+
+Pulsar's KEYS file containing PGP keys you use to sign the release:
+https://dist.apache.org/repos/dist/dev/pulsar/KEYS
+
+Please download the Python wheels and follow the README to test.
+```
+
+Once there are at least 3 binding +1s, the vote will be ready to close and you can continue the following steps. If there is something wrong with the candidate, you need to fix it and repeat the steps from the **Cut the next candidate** section again.
+
+## Promote the release
+
+Go to the candidate directory (`pulsar-client-python-X.Y.Z-candidate-N`) in the SVN project, rename the source code and its signatures: 
+
+```bash
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz pulsar-client-python-X.Y.Z.tar.gz
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.asc pulsar-client-python-X.Y.Z.tar.gz.asc
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.sha512 pulsar-client-python-X.Y.Z.tar.gz.sha512
+sha512sum pulsar-client-python-X.Y.Z.tar.gz > pulsar-client-python-X.Y.Z.tar.gz.sha512
+svn add pulsar-client-python-X.Y.Z.tar.gz.sha512 --force
+svn ci -m "Remove the candidate-N suffix in Python client X.Y.Z"
+```
+
+Then ask a PMC member to promote the release:
+
+```bash
+svn move -m "Release Apache Pulsar Client Python X.Y.Z" \
+  https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N \
+  https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+## Upload the wheels to PyPI
+
+1. You need to create an account on PyPI: https://pypi.org/account/register/
+2. Ask anyone that has been a release manager before to add you as a maintainer for pulsar-docker on PyPI

Review Comment:
   Oh yes.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1057991028


##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels into `branch-X.Y`. After these PRs are cherry-picked, you should add the `cherry-picked/branch-X.Y` labels.

Review Comment:
   Currently not because there are no PRs recently. But we did this for the C++ client. Though there is no minor release of C++ client yet.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower merged pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower merged PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1065334525


##########
RELEASE.md:
##########
@@ -0,0 +1,251 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **Note**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+>
+> This guide use `X.Y.Z` or `X.Y` to represent the actual versions like `3.0.0` or `3.0`.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping other committers to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id, which will be passed as an argument of `stage-release.sh` in the following step. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`<your-name>@apache.org`):
+
+```
+default-key <key fingerprint>
+```
+
+Make sure `curl`, `jq`, `unzip`, `gpg`, `shasum` commands are available. Then you should run the following commands in an empty directory:
+
+```bash
+svn co https://dist.apache.org/repos/dist/dev/pulsar pulsar-dist-dev-keys --depth empty
+cd pulsar-dist-dev-keys
+svn mkdir pulsar-client-python-X.Y.Z-candidate-N && cd pulsar-client-python-X.Y.Z-candidate-N
+# PROJECT_DIR is the directory of the pulsar-client-python repository 
+$PROJECT_DIR/build-support/stage-release.sh vX.Y.Z-candidate-N $WORKFLOW_ID
+svn add *
+svn ci -m "Staging artifacts and signature for Python client X.Y.Z-candidate-N"
+```
+
+## Start the vote for the candidate
+
+Send an email to dev@pulsar.apache.org to start the vote for the candidate:
+
+```
+To: dev@pulsar.apache.org
+Subject: [VOTE] Pulsar Client Python Release X.Y.Z Candidate N
+
+This is the third release candidate for Apache Pulsar Client Python,
+version X.Y.Z.
+
+It fixes the following issues:
+https://github.com/apache/pulsar-client-python/milestone/<milestone-id>?closed=1
+
+*** Please download, test and vote on this release. This vote will
+stay open for at least 72 hours ***
+
+Python wheels:
+https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N/
+
+The supported python versions are 3.7, 3.8, 3.9 and 3.10. The
+supported platforms and architectures are:
+- Windows x86_64 (windows/)
+- glibc-based Linux x86_64 (linux-glibc-x86_64/)
+- glibc-based Linux arm64 (linux-glibc-arm64/)
+- musl-based Linux x86_64 (linux-musl-x86_64/)
+- musl-based Linux arm64 (linux-musl-arm64/)
+- macOS universal 2 (macos/)
+
+The tag to be voted upon: vX.Y.Z-candidate-N
+(<commit-id>)
+https://github.com/apache/pulsar-client-python/releases/tag/vX.Y.Z-candidate-N
+
+Pulsar's KEYS file containing PGP keys you use to sign the release:
+https://dist.apache.org/repos/dist/dev/pulsar/KEYS
+
+Please download the Python wheels and follow the README to test.
+```
+
+Once there are at least 3 binding +1s, the vote will be ready to close and you can continue the following steps. If there is something wrong with the candidate, you need to fix it and repeat the steps from the **Cut the next candidate** section again.
+
+## Promote the release
+
+Go to the candidate directory (`pulsar-client-python-X.Y.Z-candidate-N`) in the SVN project, rename the source code and its signatures: 
+
+```bash
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz pulsar-client-python-X.Y.Z.tar.gz

Review Comment:
   ping @RobertIndie 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1058046701


##########
RELEASE.md:
##########
@@ -201,13 +195,22 @@ Then, create a PR in [`pulsar-site`](https://github.com/apache/pulsar-site) repo
 For minor releases, skip this section. For major releases, you should generate the HTML files into the [`pulsar-site`](https://github.com/apache/pulsar-site) repo:
 
 ```bash
+git clone git@github.com:apache/pulsar-client-python.git
+cd pulsar-client-python
 git checkout vX.Y.0
+# It's better to replace this URL with the URL of your own fork
+git clone git@github.com:apache/pulsar-site.git
 pydoctor --make-html \

Review Comment:
   I'd rather keep the current method though it takes more steps. The `bin/py-apidoc-generator.py` is not user-friendly because it requires Python 3.10+.
   
   ```bash
   $ poetry run bin/py-apidoc-generator.py 3.0.0
   The currently activated Python version 3.8.10 is not supported by the project (^3.10).
   Trying to find and use a compatible version.
   
   Poetry was unable to find a compatible version. If you have one, you can explicitly use it via the "env use" command.
   ```
   
   I used Ubuntu 20.04 to release the Python client, the default Python version is 3.8 whose EOL is 14 Oct 2024. The Pulsar Python client supports Python 3.7+. IMO, such a tool that requires Python 3.10+ is not better than `pydoctor`.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] tisonkun commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
tisonkun commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1058049105


##########
RELEASE.md:
##########
@@ -201,13 +195,22 @@ Then, create a PR in [`pulsar-site`](https://github.com/apache/pulsar-site) repo
 For minor releases, skip this section. For major releases, you should generate the HTML files into the [`pulsar-site`](https://github.com/apache/pulsar-site) repo:
 
 ```bash
+git clone git@github.com:apache/pulsar-client-python.git
+cd pulsar-client-python
 git checkout vX.Y.0
+# It's better to replace this URL with the URL of your own fork
+git clone git@github.com:apache/pulsar-site.git
 pydoctor --make-html \

Review Comment:
   FYI downgrading at https://github.com/apache/pulsar-site/pull/346



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1059312319


##########
RELEASE.md:
##########
@@ -0,0 +1,251 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **Note**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+>
+> This guide use `X.Y.Z` or `X.Y` to represent the actual versions like `3.0.0` or `3.0`.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping other committers to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id, which will be passed as an argument of `stage-release.sh` in the following step. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`<your-name>@apache.org`):
+
+```
+default-key <key fingerprint>
+```
+
+Make sure `curl`, `jq`, `unzip`, `gpg`, `shasum` commands are available. Then you should run the following commands in an empty directory:
+
+```bash
+svn co https://dist.apache.org/repos/dist/dev/pulsar pulsar-dist-dev-keys --depth empty
+cd pulsar-dist-dev-keys
+svn mkdir pulsar-client-python-X.Y.Z-candidate-N && cd pulsar-client-python-X.Y.Z-candidate-N
+# PROJECT_DIR is the directory of the pulsar-client-python repository 
+$PROJECT_DIR/build-support/stage-release.sh vX.Y.Z-candidate-N $WORKFLOW_ID
+svn add *
+svn ci -m "Staging artifacts and signature for Python client X.Y.Z-candidate-N"
+```
+
+## Start the vote for the candidate
+
+Send an email to dev@pulsar.apache.org to start the vote for the candidate:
+
+```
+To: dev@pulsar.apache.org
+Subject: [VOTE] Pulsar Client Python Release X.Y.Z Candidate N
+
+This is the third release candidate for Apache Pulsar Client Python,
+version X.Y.Z.
+
+It fixes the following issues:
+https://github.com/apache/pulsar-client-python/milestone/<milestone-id>?closed=1
+
+*** Please download, test and vote on this release. This vote will
+stay open for at least 72 hours ***
+
+Python wheels:
+https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N/
+
+The supported python versions are 3.7, 3.8, 3.9 and 3.10. The
+supported platforms and architectures are:
+- Windows x86_64 (windows/)
+- glibc-based Linux x86_64 (linux-glibc-x86_64/)
+- glibc-based Linux arm64 (linux-glibc-arm64/)
+- musl-based Linux x86_64 (linux-musl-x86_64/)
+- musl-based Linux arm64 (linux-musl-arm64/)
+- macOS universal 2 (macos/)
+
+The tag to be voted upon: vX.Y.Z-candidate-N
+(<commit-id>)
+https://github.com/apache/pulsar-client-python/releases/tag/vX.Y.Z-candidate-N
+
+Pulsar's KEYS file containing PGP keys you use to sign the release:
+https://dist.apache.org/repos/dist/dev/pulsar/KEYS
+
+Please download the Python wheels and follow the README to test.
+```
+
+Once there are at least 3 binding +1s, the vote will be ready to close and you can continue the following steps. If there is something wrong with the candidate, you need to fix it and repeat the steps from the **Cut the next candidate** section again.
+
+## Promote the release
+
+Go to the candidate directory (`pulsar-client-python-X.Y.Z-candidate-N`) in the SVN project, rename the source code and its signatures: 
+
+```bash
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz pulsar-client-python-X.Y.Z.tar.gz

Review Comment:
   Good suggestion. I fixed the stage-release.sh so that the `-candidate-N` suffix is removed now. PTAL again.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1057991498


##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`user@apache.org`):

Review Comment:
   It's necessary. Otherwise a wrong signature might be used to sign the artifacts (because we might have imported the KEYS before)



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] tisonkun commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
tisonkun commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1057748371


##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**

Review Comment:
   ```suggestion
   > **Note**
   ```
   
   Leverage GitHub rendering.



##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.

Review Comment:
   ```suggestion
   For PRs that are still open, you can choose to delay them to the next release or ping other committers to review so that they can be merged.
   ```



##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels into `branch-X.Y`. After these PRs are cherry-picked, you should add the `cherry-picked/branch-X.Y` labels.

Review Comment:
   > you should add the `cherry-picked/branch-X.Y` labels.
   
   Do we?
   
   Also, do we have such labels in this repo and apply it in the development flow now?



##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).

Review Comment:
   OK. I see it below. Resolved.



##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`user@apache.org`):
+
+```
+default-key <key fingerprint>
+```
+
+Make sure `curl`, `jq`, `unzip`, `gpg`, `shasum` commands are available. Then you should run the following commands in an empty directory:
+
+```bash
+svn co https://dist.apache.org/repos/dist/dev/pulsar pulsar-dist-dev-keys --depth empty
+cd pulsar-dist-dev-keys
+svn mkdir pulsar-client-python-X.Y.Z-candidate-N && cd pulsar-client-python-X.Y.Z-candidate-N
+# PROJECT_DIR is the directory of the pulsar-client-python repository 
+$PROJECT_DIR/build-support/stage-release.sh vX.Y.Z-candidate-N $WORKFLOW_ID
+svn add *
+svn ci -m "Staging artifacts and signature for Python client X.Y.Z-candidate-N"
+```
+
+## Start the vote for the candidate
+
+Send an email to dev@pulsar.apache.org to start the vote for the candidate:
+
+```
+To: dev@pulsar.apache.org
+Subject: [VOTE] Pulsar Client Python Release X.Y.Z Candidate N
+
+This is the third release candidate for Apache Pulsar Client Python,
+version X.Y.Z.
+
+It fixes the following issues:
+https://github.com/apache/pulsar-client-python/milestone/<milestone-id>?closed=1
+
+*** Please download, test and vote on this release. This vote will
+stay open for at least 72 hours ***
+
+Python wheels:
+https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N/
+
+The supported python versions are 3.7, 3.8, 3.9 and 3.10. The
+supported platforms and architectures are:
+- Windows x86_64 (windows/)
+- glibc-based Linux x86_64 (linux-glibc-x86_64/)
+- glibc-based Linux arm64 (linux-glibc-arm64/)
+- musl-based Linux x86_64 (linux-musl-x86_64/)
+- musl-based Linux arm64 (linux-musl-arm64/)
+- macOS universal 2 (macos/)
+
+The tag to be voted upon: vX.Y.Z-candidate-N
+(<commit-id>)
+https://github.com/apache/pulsar-client-python/releases/tag/vX.Y.Z-candidate-N
+
+Pulsar's KEYS file containing PGP keys you use to sign the release:
+https://dist.apache.org/repos/dist/dev/pulsar/KEYS
+
+Please download the Python wheels and follow the README to test.
+```
+
+Once there are at least 3 binding +1s, the vote will be ready to close and you can continue the following steps. If there is something wrong with the candidate, you need to fix it and repeat the steps from the **Cut the next candidate** section again.
+
+## Promote the release
+
+Go to the candidate directory (`pulsar-client-python-X.Y.Z-candidate-N`) in the SVN project, rename the source code and its signatures: 
+
+```bash
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz pulsar-client-python-X.Y.Z.tar.gz
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.asc pulsar-client-python-X.Y.Z.tar.gz.asc
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.sha512 pulsar-client-python-X.Y.Z.tar.gz.sha512
+sha512sum pulsar-client-python-X.Y.Z.tar.gz > pulsar-client-python-X.Y.Z.tar.gz.sha512
+svn add pulsar-client-python-X.Y.Z.tar.gz.sha512 --force
+svn ci -m "Remove the candidate-N suffix in Python client X.Y.Z"
+```
+
+Then ask a PMC member to promote the release:
+
+```bash
+svn move -m "Release Apache Pulsar Client Python X.Y.Z" \
+  https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N \
+  https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+## Upload the wheels to PyPI
+
+1. You need to create an account on PyPI: https://pypi.org/account/register/
+2. Ask anyone that has been a release manager before to add you as a maintainer for pulsar-docker on PyPI
+3. Once you have completed the following steps in this section, you can check if the wheels are uploaded successfully in Download files. Remember to switch to the correct version in Release history).
+
+Then, upload the wheels to PyPI:
+
+```bash
+sudo python3 -m pip install twine
+./build-support/upload-pypi.sh https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+To verify the wheels have been uploaded successfully, you can try installing the wheel:
+
+```bash
+python3 -m pip install pulsar-client==X.Y.Z
+```
+
+## Write release notes
+
+Push the official tag:
+
+```bash
+git checkout vX.Y.Z-candidate-N
+git tag vX.Y.Z
+git push origin vX.Y.Z
+```
+
+Then, [create a release](https://github.com/apache/pulsar-client-python/releases/new) and choose the `vX.Y.Z` tag. Here is an example release note: https://github.com/apache/pulsar-client-python/releases/tag/v3.0.0
+
+You can run the following command to generate the **What's Changed** section:
+
+```bash
+gh pr list -L 200 --search "is:pr milestone:3.0.0 is:merged" --json title,url,author \
+ | jq '.[] | "* \(.title) by @\(.author.login) in \(.url)"' \
+ | sed 's/^"\(.*\)"$/\1/'
+```
+
+Then, create a PR in [`pulsar-site`](https://github.com/apache/pulsar-site) repo to update the website. Here is an example: https://github.com/apache/pulsar-site/pull/343
+
+## Generate the API documents
+
+For minor releases, skip this section. For major releases, you should generate the HTML files into the [`pulsar-site`](https://github.com/apache/pulsar-site) repo:
+
+```bash

Review Comment:
   Many developers read commands only :)



##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.

Review Comment:
   I'm afraid the runs will be deleted after a few days (one month?). Maybe you take several screenshots to describe the significant topics.



##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).

Review Comment:
   Maybe link to https://github.com/apache/pulsar-client-python/pull/62 as an example. It reads not quite straightforward for me in the first place.



##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`user@apache.org`):
+
+```
+default-key <key fingerprint>
+```
+
+Make sure `curl`, `jq`, `unzip`, `gpg`, `shasum` commands are available. Then you should run the following commands in an empty directory:
+
+```bash
+svn co https://dist.apache.org/repos/dist/dev/pulsar pulsar-dist-dev-keys --depth empty
+cd pulsar-dist-dev-keys
+svn mkdir pulsar-client-python-X.Y.Z-candidate-N && cd pulsar-client-python-X.Y.Z-candidate-N
+# PROJECT_DIR is the directory of the pulsar-client-python repository 
+$PROJECT_DIR/build-support/stage-release.sh vX.Y.Z-candidate-N $WORKFLOW_ID
+svn add *
+svn ci -m "Staging artifacts and signature for Python client X.Y.Z-candidate-N"
+```
+
+## Start the vote for the candidate
+
+Send an email to dev@pulsar.apache.org to start the vote for the candidate:
+
+```
+To: dev@pulsar.apache.org
+Subject: [VOTE] Pulsar Client Python Release X.Y.Z Candidate N
+
+This is the third release candidate for Apache Pulsar Client Python,
+version X.Y.Z.
+
+It fixes the following issues:
+https://github.com/apache/pulsar-client-python/milestone/<milestone-id>?closed=1
+
+*** Please download, test and vote on this release. This vote will
+stay open for at least 72 hours ***
+
+Python wheels:
+https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N/
+
+The supported python versions are 3.7, 3.8, 3.9 and 3.10. The
+supported platforms and architectures are:
+- Windows x86_64 (windows/)
+- glibc-based Linux x86_64 (linux-glibc-x86_64/)
+- glibc-based Linux arm64 (linux-glibc-arm64/)
+- musl-based Linux x86_64 (linux-musl-x86_64/)
+- musl-based Linux arm64 (linux-musl-arm64/)
+- macOS universal 2 (macos/)
+
+The tag to be voted upon: vX.Y.Z-candidate-N
+(<commit-id>)
+https://github.com/apache/pulsar-client-python/releases/tag/vX.Y.Z-candidate-N
+
+Pulsar's KEYS file containing PGP keys you use to sign the release:
+https://dist.apache.org/repos/dist/dev/pulsar/KEYS
+
+Please download the Python wheels and follow the README to test.
+```
+
+Once there are at least 3 binding +1s, the vote will be ready to close and you can continue the following steps. If there is something wrong with the candidate, you need to fix it and repeat the steps from the **Cut the next candidate** section again.
+
+## Promote the release
+
+Go to the candidate directory (`pulsar-client-python-X.Y.Z-candidate-N`) in the SVN project, rename the source code and its signatures: 
+
+```bash
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz pulsar-client-python-X.Y.Z.tar.gz
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.asc pulsar-client-python-X.Y.Z.tar.gz.asc
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.sha512 pulsar-client-python-X.Y.Z.tar.gz.sha512
+sha512sum pulsar-client-python-X.Y.Z.tar.gz > pulsar-client-python-X.Y.Z.tar.gz.sha512
+svn add pulsar-client-python-X.Y.Z.tar.gz.sha512 --force
+svn ci -m "Remove the candidate-N suffix in Python client X.Y.Z"
+```
+
+Then ask a PMC member to promote the release:
+
+```bash
+svn move -m "Release Apache Pulsar Client Python X.Y.Z" \
+  https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N \
+  https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+## Upload the wheels to PyPI
+
+1. You need to create an account on PyPI: https://pypi.org/account/register/
+2. Ask anyone that has been a release manager before to add you as a maintainer for pulsar-docker on PyPI
+3. Once you have completed the following steps in this section, you can check if the wheels are uploaded successfully in Download files. Remember to switch to the correct version in Release history).
+
+Then, upload the wheels to PyPI:
+
+```bash
+sudo python3 -m pip install twine
+./build-support/upload-pypi.sh https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+To verify the wheels have been uploaded successfully, you can try installing the wheel:
+
+```bash
+python3 -m pip install pulsar-client==X.Y.Z
+```
+
+## Write release notes
+
+Push the official tag:
+
+```bash
+git checkout vX.Y.Z-candidate-N
+git tag vX.Y.Z
+git push origin vX.Y.Z
+```
+
+Then, [create a release](https://github.com/apache/pulsar-client-python/releases/new) and choose the `vX.Y.Z` tag. Here is an example release note: https://github.com/apache/pulsar-client-python/releases/tag/v3.0.0
+
+You can run the following command to generate the **What's Changed** section:
+
+```bash
+gh pr list -L 200 --search "is:pr milestone:3.0.0 is:merged" --json title,url,author \
+ | jq '.[] | "* \(.title) by @\(.author.login) in \(.url)"' \
+ | sed 's/^"\(.*\)"$/\1/'
+```
+
+Then, create a PR in [`pulsar-site`](https://github.com/apache/pulsar-site) repo to update the website. Here is an example: https://github.com/apache/pulsar-site/pull/343
+
+## Generate the API documents
+
+For minor releases, skip this section. For major releases, you should generate the HTML files into the [`pulsar-site`](https://github.com/apache/pulsar-site) repo:
+
+```bash

Review Comment:
   Perhaps insert a command `git clone ...<pulsar-site>` so that the release manager is clear about the context has been switched.



##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`user@apache.org`):

Review Comment:
   ```suggestion
   Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`<your-name>@apache.org`):
   ```



##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`user@apache.org`):
+
+```
+default-key <key fingerprint>
+```
+
+Make sure `curl`, `jq`, `unzip`, `gpg`, `shasum` commands are available. Then you should run the following commands in an empty directory:
+
+```bash
+svn co https://dist.apache.org/repos/dist/dev/pulsar pulsar-dist-dev-keys --depth empty
+cd pulsar-dist-dev-keys
+svn mkdir pulsar-client-python-X.Y.Z-candidate-N && cd pulsar-client-python-X.Y.Z-candidate-N
+# PROJECT_DIR is the directory of the pulsar-client-python repository 
+$PROJECT_DIR/build-support/stage-release.sh vX.Y.Z-candidate-N $WORKFLOW_ID
+svn add *
+svn ci -m "Staging artifacts and signature for Python client X.Y.Z-candidate-N"
+```
+
+## Start the vote for the candidate
+
+Send an email to dev@pulsar.apache.org to start the vote for the candidate:
+
+```
+To: dev@pulsar.apache.org
+Subject: [VOTE] Pulsar Client Python Release X.Y.Z Candidate N
+
+This is the third release candidate for Apache Pulsar Client Python,
+version X.Y.Z.
+
+It fixes the following issues:
+https://github.com/apache/pulsar-client-python/milestone/<milestone-id>?closed=1
+
+*** Please download, test and vote on this release. This vote will
+stay open for at least 72 hours ***
+
+Python wheels:
+https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N/
+
+The supported python versions are 3.7, 3.8, 3.9 and 3.10. The
+supported platforms and architectures are:
+- Windows x86_64 (windows/)
+- glibc-based Linux x86_64 (linux-glibc-x86_64/)
+- glibc-based Linux arm64 (linux-glibc-arm64/)
+- musl-based Linux x86_64 (linux-musl-x86_64/)
+- musl-based Linux arm64 (linux-musl-arm64/)
+- macOS universal 2 (macos/)
+
+The tag to be voted upon: vX.Y.Z-candidate-N
+(<commit-id>)
+https://github.com/apache/pulsar-client-python/releases/tag/vX.Y.Z-candidate-N
+
+Pulsar's KEYS file containing PGP keys you use to sign the release:
+https://dist.apache.org/repos/dist/dev/pulsar/KEYS
+
+Please download the Python wheels and follow the README to test.
+```
+
+Once there are at least 3 binding +1s, the vote will be ready to close and you can continue the following steps. If there is something wrong with the candidate, you need to fix it and repeat the steps from the **Cut the next candidate** section again.
+
+## Promote the release
+
+Go to the candidate directory (`pulsar-client-python-X.Y.Z-candidate-N`) in the SVN project, rename the source code and its signatures: 
+
+```bash
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz pulsar-client-python-X.Y.Z.tar.gz
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.asc pulsar-client-python-X.Y.Z.tar.gz.asc
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.sha512 pulsar-client-python-X.Y.Z.tar.gz.sha512
+sha512sum pulsar-client-python-X.Y.Z.tar.gz > pulsar-client-python-X.Y.Z.tar.gz.sha512
+svn add pulsar-client-python-X.Y.Z.tar.gz.sha512 --force
+svn ci -m "Remove the candidate-N suffix in Python client X.Y.Z"
+```
+
+Then ask a PMC member to promote the release:
+
+```bash
+svn move -m "Release Apache Pulsar Client Python X.Y.Z" \
+  https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N \
+  https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+## Upload the wheels to PyPI
+
+1. You need to create an account on PyPI: https://pypi.org/account/register/
+2. Ask anyone that has been a release manager before to add you as a maintainer for pulsar-docker on PyPI
+3. Once you have completed the following steps in this section, you can check if the wheels are uploaded successfully in Download files. Remember to switch to the correct version in Release history).
+
+Then, upload the wheels to PyPI:
+
+```bash
+sudo python3 -m pip install twine
+./build-support/upload-pypi.sh https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+To verify the wheels have been uploaded successfully, you can try installing the wheel:
+
+```bash
+python3 -m pip install pulsar-client==X.Y.Z
+```
+
+## Write release notes
+
+Push the official tag:
+
+```bash
+git checkout vX.Y.Z-candidate-N
+git tag vX.Y.Z
+git push origin vX.Y.Z
+```
+
+Then, [create a release](https://github.com/apache/pulsar-client-python/releases/new) and choose the `vX.Y.Z` tag. Here is an example release note: https://github.com/apache/pulsar-client-python/releases/tag/v3.0.0
+
+You can run the following command to generate the **What's Changed** section:

Review Comment:
   Maybe this is the default manner of GitHub Release WebUI? I'm not sure.



##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`user@apache.org`):

Review Comment:
   This step is unnecessary. But we may improve later.



##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`user@apache.org`):
+
+```
+default-key <key fingerprint>
+```
+
+Make sure `curl`, `jq`, `unzip`, `gpg`, `shasum` commands are available. Then you should run the following commands in an empty directory:
+
+```bash
+svn co https://dist.apache.org/repos/dist/dev/pulsar pulsar-dist-dev-keys --depth empty
+cd pulsar-dist-dev-keys
+svn mkdir pulsar-client-python-X.Y.Z-candidate-N && cd pulsar-client-python-X.Y.Z-candidate-N
+# PROJECT_DIR is the directory of the pulsar-client-python repository 
+$PROJECT_DIR/build-support/stage-release.sh vX.Y.Z-candidate-N $WORKFLOW_ID
+svn add *
+svn ci -m "Staging artifacts and signature for Python client X.Y.Z-candidate-N"
+```
+
+## Start the vote for the candidate
+
+Send an email to dev@pulsar.apache.org to start the vote for the candidate:
+
+```
+To: dev@pulsar.apache.org
+Subject: [VOTE] Pulsar Client Python Release X.Y.Z Candidate N
+
+This is the third release candidate for Apache Pulsar Client Python,
+version X.Y.Z.
+
+It fixes the following issues:
+https://github.com/apache/pulsar-client-python/milestone/<milestone-id>?closed=1
+
+*** Please download, test and vote on this release. This vote will
+stay open for at least 72 hours ***
+
+Python wheels:
+https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N/
+
+The supported python versions are 3.7, 3.8, 3.9 and 3.10. The
+supported platforms and architectures are:
+- Windows x86_64 (windows/)
+- glibc-based Linux x86_64 (linux-glibc-x86_64/)
+- glibc-based Linux arm64 (linux-glibc-arm64/)
+- musl-based Linux x86_64 (linux-musl-x86_64/)
+- musl-based Linux arm64 (linux-musl-arm64/)
+- macOS universal 2 (macos/)
+
+The tag to be voted upon: vX.Y.Z-candidate-N
+(<commit-id>)
+https://github.com/apache/pulsar-client-python/releases/tag/vX.Y.Z-candidate-N
+
+Pulsar's KEYS file containing PGP keys you use to sign the release:
+https://dist.apache.org/repos/dist/dev/pulsar/KEYS
+
+Please download the Python wheels and follow the README to test.
+```
+
+Once there are at least 3 binding +1s, the vote will be ready to close and you can continue the following steps. If there is something wrong with the candidate, you need to fix it and repeat the steps from the **Cut the next candidate** section again.
+
+## Promote the release
+
+Go to the candidate directory (`pulsar-client-python-X.Y.Z-candidate-N`) in the SVN project, rename the source code and its signatures: 
+
+```bash
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz pulsar-client-python-X.Y.Z.tar.gz
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.asc pulsar-client-python-X.Y.Z.tar.gz.asc
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.sha512 pulsar-client-python-X.Y.Z.tar.gz.sha512
+sha512sum pulsar-client-python-X.Y.Z.tar.gz > pulsar-client-python-X.Y.Z.tar.gz.sha512
+svn add pulsar-client-python-X.Y.Z.tar.gz.sha512 --force
+svn ci -m "Remove the candidate-N suffix in Python client X.Y.Z"
+```
+
+Then ask a PMC member to promote the release:
+
+```bash
+svn move -m "Release Apache Pulsar Client Python X.Y.Z" \
+  https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N \
+  https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+## Upload the wheels to PyPI
+
+1. You need to create an account on PyPI: https://pypi.org/account/register/
+2. Ask anyone that has been a release manager before to add you as a maintainer for pulsar-docker on PyPI

Review Comment:
   pulsar-docker is a typo?



##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`user@apache.org`):
+
+```
+default-key <key fingerprint>
+```
+
+Make sure `curl`, `jq`, `unzip`, `gpg`, `shasum` commands are available. Then you should run the following commands in an empty directory:
+
+```bash
+svn co https://dist.apache.org/repos/dist/dev/pulsar pulsar-dist-dev-keys --depth empty
+cd pulsar-dist-dev-keys
+svn mkdir pulsar-client-python-X.Y.Z-candidate-N && cd pulsar-client-python-X.Y.Z-candidate-N
+# PROJECT_DIR is the directory of the pulsar-client-python repository 
+$PROJECT_DIR/build-support/stage-release.sh vX.Y.Z-candidate-N $WORKFLOW_ID
+svn add *
+svn ci -m "Staging artifacts and signature for Python client X.Y.Z-candidate-N"
+```
+
+## Start the vote for the candidate
+
+Send an email to dev@pulsar.apache.org to start the vote for the candidate:
+
+```
+To: dev@pulsar.apache.org
+Subject: [VOTE] Pulsar Client Python Release X.Y.Z Candidate N
+
+This is the third release candidate for Apache Pulsar Client Python,
+version X.Y.Z.
+
+It fixes the following issues:
+https://github.com/apache/pulsar-client-python/milestone/<milestone-id>?closed=1
+
+*** Please download, test and vote on this release. This vote will
+stay open for at least 72 hours ***
+
+Python wheels:
+https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N/
+
+The supported python versions are 3.7, 3.8, 3.9 and 3.10. The
+supported platforms and architectures are:
+- Windows x86_64 (windows/)
+- glibc-based Linux x86_64 (linux-glibc-x86_64/)
+- glibc-based Linux arm64 (linux-glibc-arm64/)
+- musl-based Linux x86_64 (linux-musl-x86_64/)
+- musl-based Linux arm64 (linux-musl-arm64/)
+- macOS universal 2 (macos/)
+
+The tag to be voted upon: vX.Y.Z-candidate-N
+(<commit-id>)
+https://github.com/apache/pulsar-client-python/releases/tag/vX.Y.Z-candidate-N
+
+Pulsar's KEYS file containing PGP keys you use to sign the release:
+https://dist.apache.org/repos/dist/dev/pulsar/KEYS
+
+Please download the Python wheels and follow the README to test.
+```
+
+Once there are at least 3 binding +1s, the vote will be ready to close and you can continue the following steps. If there is something wrong with the candidate, you need to fix it and repeat the steps from the **Cut the next candidate** section again.
+
+## Promote the release
+
+Go to the candidate directory (`pulsar-client-python-X.Y.Z-candidate-N`) in the SVN project, rename the source code and its signatures: 
+
+```bash
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz pulsar-client-python-X.Y.Z.tar.gz
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.asc pulsar-client-python-X.Y.Z.tar.gz.asc
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.sha512 pulsar-client-python-X.Y.Z.tar.gz.sha512
+sha512sum pulsar-client-python-X.Y.Z.tar.gz > pulsar-client-python-X.Y.Z.tar.gz.sha512
+svn add pulsar-client-python-X.Y.Z.tar.gz.sha512 --force
+svn ci -m "Remove the candidate-N suffix in Python client X.Y.Z"
+```
+
+Then ask a PMC member to promote the release:
+
+```bash
+svn move -m "Release Apache Pulsar Client Python X.Y.Z" \
+  https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N \
+  https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+## Upload the wheels to PyPI
+
+1. You need to create an account on PyPI: https://pypi.org/account/register/
+2. Ask anyone that has been a release manager before to add you as a maintainer for pulsar-docker on PyPI
+3. Once you have completed the following steps in this section, you can check if the wheels are uploaded successfully in Download files. Remember to switch to the correct version in Release history).
+
+Then, upload the wheels to PyPI:
+
+```bash
+sudo python3 -m pip install twine
+./build-support/upload-pypi.sh https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+To verify the wheels have been uploaded successfully, you can try installing the wheel:
+
+```bash
+python3 -m pip install pulsar-client==X.Y.Z
+```
+
+## Write release notes
+
+Push the official tag:
+
+```bash
+git checkout vX.Y.Z-candidate-N
+git tag vX.Y.Z
+git push origin vX.Y.Z
+```
+
+Then, [create a release](https://github.com/apache/pulsar-client-python/releases/new) and choose the `vX.Y.Z` tag. Here is an example release note: https://github.com/apache/pulsar-client-python/releases/tag/v3.0.0
+
+You can run the following command to generate the **What's Changed** section:
+
+```bash
+gh pr list -L 200 --search "is:pr milestone:3.0.0 is:merged" --json title,url,author \
+ | jq '.[] | "* \(.title) by @\(.author.login) in \(.url)"' \
+ | sed 's/^"\(.*\)"$/\1/'
+```
+
+Then, create a PR in [`pulsar-site`](https://github.com/apache/pulsar-site) repo to update the website. Here is an example: https://github.com/apache/pulsar-site/pull/343
+
+## Generate the API documents
+
+For minor releases, skip this section. For major releases, you should generate the HTML files into the [`pulsar-site`](https://github.com/apache/pulsar-site) repo:
+
+```bash
+git checkout vX.Y.0
+pydoctor --make-html \
+  --html-viewsource-base=https://github.com/apache/pulsar-client-python/tree/vX.Y.0 \
+  --docformat=numpy --theme=readthedocs \
+  --intersphinx=https://docs.python.org/3/objects.inv \
+  --html-output=/path/to/pulsar-site/site2/website-next/static/api/python/X.Y.x \
+  pulsar
+```
+
+Then open a PR like: https://github.com/apache/pulsar-site/pull/342

Review Comment:
   Missing the release note step?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] tisonkun commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
tisonkun commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1058046975


##########
RELEASE.md:
##########
@@ -201,13 +195,22 @@ Then, create a PR in [`pulsar-site`](https://github.com/apache/pulsar-site) repo
 For minor releases, skip this section. For major releases, you should generate the HTML files into the [`pulsar-site`](https://github.com/apache/pulsar-site) repo:
 
 ```bash
+git clone git@github.com:apache/pulsar-client-python.git
+cd pulsar-client-python
 git checkout vX.Y.0
+# It's better to replace this URL with the URL of your own fork
+git clone git@github.com:apache/pulsar-site.git
 pydoctor --make-html \

Review Comment:
   I can downgrade the required python version to 3.8 :)
   
   It's actually delegate the work to `pydoctor` internally.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1057999298


##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.
+
+Generate a GitHub token by following the guide [here](https://github.com/settings/tokens). The `repo` and `workflow` checkboxes must be selected. Then export the token as the environment variable:
+
+```bash
+export GITHUB_TOKEN=<your-token>
+```
+
+Edit `~/.gnupg/gpg.conf` to ensure the default GPG key is from your Apache mail (`user@apache.org`):
+
+```
+default-key <key fingerprint>
+```
+
+Make sure `curl`, `jq`, `unzip`, `gpg`, `shasum` commands are available. Then you should run the following commands in an empty directory:
+
+```bash
+svn co https://dist.apache.org/repos/dist/dev/pulsar pulsar-dist-dev-keys --depth empty
+cd pulsar-dist-dev-keys
+svn mkdir pulsar-client-python-X.Y.Z-candidate-N && cd pulsar-client-python-X.Y.Z-candidate-N
+# PROJECT_DIR is the directory of the pulsar-client-python repository 
+$PROJECT_DIR/build-support/stage-release.sh vX.Y.Z-candidate-N $WORKFLOW_ID
+svn add *
+svn ci -m "Staging artifacts and signature for Python client X.Y.Z-candidate-N"
+```
+
+## Start the vote for the candidate
+
+Send an email to dev@pulsar.apache.org to start the vote for the candidate:
+
+```
+To: dev@pulsar.apache.org
+Subject: [VOTE] Pulsar Client Python Release X.Y.Z Candidate N
+
+This is the third release candidate for Apache Pulsar Client Python,
+version X.Y.Z.
+
+It fixes the following issues:
+https://github.com/apache/pulsar-client-python/milestone/<milestone-id>?closed=1
+
+*** Please download, test and vote on this release. This vote will
+stay open for at least 72 hours ***
+
+Python wheels:
+https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N/
+
+The supported python versions are 3.7, 3.8, 3.9 and 3.10. The
+supported platforms and architectures are:
+- Windows x86_64 (windows/)
+- glibc-based Linux x86_64 (linux-glibc-x86_64/)
+- glibc-based Linux arm64 (linux-glibc-arm64/)
+- musl-based Linux x86_64 (linux-musl-x86_64/)
+- musl-based Linux arm64 (linux-musl-arm64/)
+- macOS universal 2 (macos/)
+
+The tag to be voted upon: vX.Y.Z-candidate-N
+(<commit-id>)
+https://github.com/apache/pulsar-client-python/releases/tag/vX.Y.Z-candidate-N
+
+Pulsar's KEYS file containing PGP keys you use to sign the release:
+https://dist.apache.org/repos/dist/dev/pulsar/KEYS
+
+Please download the Python wheels and follow the README to test.
+```
+
+Once there are at least 3 binding +1s, the vote will be ready to close and you can continue the following steps. If there is something wrong with the candidate, you need to fix it and repeat the steps from the **Cut the next candidate** section again.
+
+## Promote the release
+
+Go to the candidate directory (`pulsar-client-python-X.Y.Z-candidate-N`) in the SVN project, rename the source code and its signatures: 
+
+```bash
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz pulsar-client-python-X.Y.Z.tar.gz
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.asc pulsar-client-python-X.Y.Z.tar.gz.asc
+svn mv pulsar-client-python-X.Y.Z-candidate-N.tar.gz.sha512 pulsar-client-python-X.Y.Z.tar.gz.sha512
+sha512sum pulsar-client-python-X.Y.Z.tar.gz > pulsar-client-python-X.Y.Z.tar.gz.sha512
+svn add pulsar-client-python-X.Y.Z.tar.gz.sha512 --force
+svn ci -m "Remove the candidate-N suffix in Python client X.Y.Z"
+```
+
+Then ask a PMC member to promote the release:
+
+```bash
+svn move -m "Release Apache Pulsar Client Python X.Y.Z" \
+  https://dist.apache.org/repos/dist/dev/pulsar/pulsar-client-python-X.Y.Z-candidate-N \
+  https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+## Upload the wheels to PyPI
+
+1. You need to create an account on PyPI: https://pypi.org/account/register/
+2. Ask anyone that has been a release manager before to add you as a maintainer for pulsar-docker on PyPI
+3. Once you have completed the following steps in this section, you can check if the wheels are uploaded successfully in Download files. Remember to switch to the correct version in Release history).
+
+Then, upload the wheels to PyPI:
+
+```bash
+sudo python3 -m pip install twine
+./build-support/upload-pypi.sh https://dist.apache.org/repos/dist/release/pulsar/pulsar-client-python-X.Y.Z
+```
+
+To verify the wheels have been uploaded successfully, you can try installing the wheel:
+
+```bash
+python3 -m pip install pulsar-client==X.Y.Z
+```
+
+## Write release notes
+
+Push the official tag:
+
+```bash
+git checkout vX.Y.Z-candidate-N
+git tag vX.Y.Z
+git push origin vX.Y.Z
+```
+
+Then, [create a release](https://github.com/apache/pulsar-client-python/releases/new) and choose the `vX.Y.Z` tag. Here is an example release note: https://github.com/apache/pulsar-client-python/releases/tag/v3.0.0
+
+You can run the following command to generate the **What's Changed** section:

Review Comment:
   Yeah it's right. 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [pulsar-client-python] BewareMyPower commented on a diff in pull request #68: Add the release process for Python client

Posted by GitBox <gi...@apache.org>.
BewareMyPower commented on code in PR #68:
URL: https://github.com/apache/pulsar-client-python/pull/68#discussion_r1057992760


##########
RELEASE.md:
##########
@@ -0,0 +1,247 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Release Process
+
+This page contains instructions for Pulsar committers on how to perform a release for the Pulsar Python client.
+
+## Preparation
+
+> **NOTE**
+>
+> The term `major/minor releases` used throughout this document is defined as follows:
+> - Major releases refer to feature releases, such as 3.0.0, 3.1.0, and so on.
+> - Minor releases refer to bug-fix releases, such as 3.0.1, 3.0.2, and so on.
+
+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 minor releases, if there are no disagreements, you should cherry-pick all merged PRs with the `release/X.Y.Z` labels 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.
+
+For PRs that are still open, you can choose to delay them to the next release or ping others to review so that they can be merged.
+
+## Requirements
+
+If you haven't already done it, [create and publish the GPG key](https://pulsar.apache.org/contribute/create-gpg-keys/) to sign the release artifacts.
+
+## Upgrade the C++ client dependency
+
+During the development, the C++ client dependency might be downloaded from an unofficial release. But when releasing the Python client, the dependency must be downloaded from an official release. You should modify the base url in [dep-url.sh](./build-support/dep-url.sh).
+
+Example: https://github.com/apache/pulsar-client-python/pull/62 
+
+## Cut the candidate release
+
+After all necessary PRs are cherry-picked to `branch-X.Y`, you should cut the release by pushing a tag.
+
+```bash
+git checkout branch-X.Y
+git push origin branch-X.Y
+# N starts with 1
+git tag vX.Y.Y-candidate-N
+git push origin vX.Y.Y-candidate-N
+```
+
+Then, [create a new milestone](https://github.com/apache/pulsar-client-python/milestones/new) for the next major release.
+
+## Sign and stage the candidate release
+
+After a tag is pushed, a workflow will be triggered to build the Python wheels in GitHub Actions. You can find it in https://github.com/apache/pulsar-client-python/actions/workflows/ci-build-release-wheels.yaml
+
+For example, https://github.com/apache/pulsar-client-python/actions/runs/3709463737 is the workflow of `v3.0.0-candidate-3`, the workflow id is 3709463737. Remember the workflow id for the following steps. Once the workflow is completed, the wheels will be available for downloading.

Review Comment:
   It does not affect. I added the example link just to show what's the workflow id, which will be used in the following step (`stage-release.sh`).



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org