版本发布管理指南#

此页面提供了有关执行版本发布步骤的详细信息。它既可以作为学习 Apache Arrow 版本发布流程的指南,也可以作为版本发布经理在执行版本发布时使用的综合检查清单。

原则#

Apache Arrow 版本发布遵循Apache 软件基金会版本发布策略中定义的指南。

准备发布#

在创建源代码版本之前,版本发布经理必须确保任何已解决的 JIRA 问题都设置了正确的修复版本,以便正确生成变更日志。

需求

发布的某些步骤需要成为提交者或 PMC 成员。

  • 安装Archery实用程序,这是发布所需的。

  • 除了 CC 或 CXX(如果您想使用 GCC 以外的编译器构建,例如 clang)之外,您不得定义任何 arrow-cpp 或 parquet-cpp 环境变量。

  • Apache Web of Trust 中的 GPG 密钥用于签署工件。这将需要由其他 Apache 提交者/PMC 成员交叉签名。如果您有多个 GPG 密钥,则必须在~/.gnupg/gpg.conf中设置正确的 GPG 密钥 ID,方法是添加

default-key ${YOUR_GPG_KEY_ID}
# You might need to export GPG_TTY=$(tty) to properly prompt for a passphrase
mvn clean install -Papache-release
  • 安装 cpp 和 c_glib 的构建要求。

  • CROSSBOW_GITHUB_TOKEN环境变量设置为自动创建验证发布拉取请求。

  • 安装en_US.UTF-8区域设置。您可以通过locale -a确认可用的区域设置。

  • 安装 Python 3 作为 python

  • 从 dev/release/.env.example 创建 dev/release/.env。请参阅 dev/release/.env.example 中的注释,了解如何设置每个变量。

  • 根据定义设置Crossbow

  • 安装 Docker 和 docker-compose。

在创建候选版本之前#

确保已删除本地标签、已设置 gpg-agent 且 JIRA 票证已正确分配。

# Delete the local tag for RC1 or later
git tag -d apache-arrow-<version>

# Setup gpg agent for signing artifacts
source dev/release/setup-gpg-agent.sh

# Curate the release
# The end of the generated report shows the JIRA tickets with wrong version number assigned.
archery release curate <version>

确保在 GitHub 上为后续版本创建主要版本里程碑。当创建维护分支时,我们的合并脚本将自动将此用作已关闭问题的版本。

修补程序版本#

我们通常在发现主要问题后创建修补程序版本。被识别为主要问题的错误可能是安全修复、特定构建的损坏包等。

任何开发人员都可以请求生成修补程序版本,方法是向Arrow 开发邮件列表发送电子邮件,说明为什么需要新版本。如果达成共识,并且有版本发布经理愿意承担创建版本的工作,则可以创建修补程序版本。

提交者可以使用backport-candidate标签标记应包含在下一个修补程序版本中的问题。作者或提交者有责任将标签添加到问题中,以帮助版本发布经理识别应回传的问题。

如果识别出特定问题是创建修补程序版本的原因,则版本发布经理应验证至少此问题是否已正确标记并包含在修补程序版本中。

请务必完成以下检查清单

  1. 创建里程碑

  2. 创建维护分支

  3. 包含请求为需要新修补程序版本的问题

  4. 将新里程碑添加到带有backport-candidate标签的问题中

  5. 将问题 cherry-pick 到维护分支中

创建候选版本#

这些是在创建候选版本时需要执行的不同步骤。

对于主要版本的初始候选版本,我们将从主分支创建维护分支。

后续的候选版本将通过 cherry-pick 特定提交来更新维护分支。

对于次要版本或修补程序版本的初始候选版本,我们将从先前对应的版本创建维护分支。例如,对于 15.0.1 修补程序,我们将从 maint-15.0.0 创建 maint-15.0.1 分支,对于 maint-15.0.2,我们将从 maint-15.0.1 创建它。创建维护分支后,我们将通过 cherry-pick 特定提交来更新已创建的维护分支。

我们在候选版本之间实施了功能冻结策略。这意味着,通常情况下,我们应该只在候选版本之间添加错误修复。在极少数情况下,如果社区达成共识,可以在候选版本之间添加关键功能。

创建或更新相应的维护分支#

# Execute the following from an up to date main branch.
# This will create a branch locally called maint-X.Y.Z.
# X.Y.Z corresponds with the Major, Minor and Patch version number
# of the release respectively. As an example 9.0.0
archery release --jira-cache /tmp/jiracache cherry-pick X.Y.Z --execute
# Push the maintenance branch to the remote repository
git push -u apache maint-X.Y.Z
# First run in dry-mode to see which commits will be cherry-picked.
# If there are commits that we don't want to get applied ensure the version on
# JIRA is set to the following release.
archery release --jira-cache /tmp/jiracache cherry-pick X.Y.Z --continue
# Update the maintenance branch with the previous commits
archery release --jira-cache /tmp/jiracache cherry-pick X.Y.Z --continue --execute
# Push the updated maintenance branch to the remote repository
git push -u apache maint-X.Y.Z

从更新的维护分支创建候选版本分支#

# Start from the updated maintenance branch.
git checkout maint-X.Y.Z

# The following script will create a branch for the Release Candidate,
# place the necessary commits updating the version number and then create a git tag
# on OSX use gnu-sed with homebrew: brew install gnu-sed (and export to $PATH)
#
# <rc-number> starts at 0 and increments every time the Release Candidate is burned
# so for the first RC this would be: dev/release/01-prepare.sh 4.0.0 5.0.0 0
dev/release/01-prepare.sh <version> <next-version> <rc-number>

# Push the release candidate tag
git push -u apache apache-arrow-<version>rc<rc-number>
# Push the release candidate branch in order to trigger verification jobs later
git push -u apache release-<version>-rc<rc-number>

构建源代码和二进制文件并提交它们#

# Build the source release tarball and create Pull Request with verification tasks
#
# NOTE: You need to have GitHub CLI installed to run this script.
dev/release/02-source.sh <version> <rc-number>

# Submit binary tasks using crossbow, the command will output the crossbow build id
dev/release/03-binary-submit.sh <version> <rc-number>

# Wait for the crossbow jobs to finish
archery crossbow status <crossbow-build-id>

# Download the produced binaries
# This will download packages to a directory called packages/release-<version>-rc<rc-number>
dev/release/04-binary-download.sh <version> <rc-number>

# Sign and upload the binaries
#
# On macOS the only way I could get this to work was running "echo "UPDATESTARTUPTTY" | gpg-connect-agent" before running this comment
# otherwise I got errors referencing "ioctl" errors.
dev/release/05-binary-upload.sh <version> <rc-number>

# Sign and upload the Java artifacts
#
# Note that you need to press the "Close" button manually by Web interface
# after you complete the script:
#   https://repository.apache.org/#stagingRepositories
dev/release/06-java-upload.sh <version> <rc-number>

# Sign and upload MATLAB artifacts to the GitHub Releases area.
#
# Note that you need to have GitHub CLI installed to run this script.
dev/release/07-matlab-upload.sh <version> <rc-number>

# Start verifications for binaries and wheels
dev/release/08-binary-verify.sh <version> <rc-number>

验证版本#

# Once the automatic verification has passed start the vote thread
# on [email protected]. To regenerate the email template use
SOURCE_DEFAULT=0 SOURCE_VOTE=1 dev/release/02-source.sh <version> <rc-number>

有关详细信息,请参阅版本发布验证流程

投票和批准#

dev@arrow.apache.org上启动投票线程,并提供验证版本完整性的说明。批准需要 PMC 成员的 3 个 +1 票的净票数。版本发布不能被否决。

发布后任务#

在版本发布投票后,我们必须执行许多任务来更新源代码工件、二进制构建和 Arrow 网站。

请务必完成以下检查清单

  1. 更新已发布里程碑的日期,并在 GitHub 上设置为“已关闭”

  2. 将 CPP PARQUET 相关版本在 JIRA 上标记为“已发布”

  3. 在 JIRA 上为相关的 CPP PARQUET 版本开始新版本

  4. 将发布分支上的更改合并到修补程序版本的维护分支中

  5. 将新版本添加到 Apache Reporter 系统

  6. 推送发布标签

  7. 上传源代码

  8. 上传二进制文件

  9. 更新网站

  10. 更新 GitHub 版本说明

  11. 更新 Homebrew 软件包

  12. 更新 MSYS2 软件包

  13. 上传 RubyGems

  14. 上传 JavaScript 软件包

  15. 上传 C# 软件包

  16. 更新 conda 配方

  17. 将轮子/sdist 上传到 pypi

  18. 发布 Maven 工件

  19. 更新 R 软件包

  20. 更新 vcpkg 端口

  21. 更新 Conan 配方

  22. 更新版本号

  23. 更新 Go 模块的标签

  24. 更新文档

  25. 更新 Apache Arrow 食谱中的版本号

  26. 宣布新版本

  27. 发布版本博文

  28. 在 Twitter 上宣布版本发布

  29. 删除旧工件

在 JIRA 上将已发布版本标记为“已发布”
在 JIRA 上开始新版本
将发布分支上的更改合并到修补程序版本的维护分支中

release-X.Y.Z-rcN合并到maint-X.Y.Z

# git checkout maint-10.0.0
git checkout maint-X.Y.Z
# git merge release-10.0.0-rc0
git merge release-X.Y.Z-rcN
# git push -u apache maint-10.0.0
git push -u apache maint-X.Y.Z
将新版本添加到 Apache Reporter 系统

将 Arrow 的相关版本发布数据添加到Apache reporter

推送发布标签并创建 GitHub 版本

提交者必须将发布标签推送到 GitHub

# dev/release/post-01-tag.sh 0.1.0 0
dev/release/post-01-tag.sh <version> <rc>
将源代码版本工件上传到 Subversion

PMC 成员必须将源代码版本工件提交到 Subversion

# dev/release/post-02-upload.sh 0.1.0 0
dev/release/post-02-upload.sh <version> <rc>
将二进制版本工件上传到 Artifactory

提交者必须将二进制版本工件上传到 Artifactory 并创建 GitHub 版本

# dev/release/post-03-binary.sh 0.1.0 0
dev/release/post-03-binary.sh <version> <rc number>
更新网站

在我们的网站上添加新版本的版本说明,并更新最新的版本信息

## Prepare your fork of https://github.com/apache/arrow-site .
## You need to do this only once.
# git clone [email protected]:kou/arrow-site.git ../
git clone [email protected]:<YOUR_GITHUB_ID>/arrow-site.git ../
cd ../arrow-site
## Add [email protected]:apache/arrow-site.git as "apache" remote.
git remote add apache [email protected]:apache/arrow-site.git
cd -

## Generate a release note for the new version, update the
## latest release information automatically.
# dev/release/post-04-website.sh 9.0.0 10.0.0
dev/release/post-04-website.sh OLD_X.OLD_Y.OLD_Z X.Y.Z

此脚本将release-note-X.Y.Z分支推送到您的apache/arrow-sitefork。您需要在 Web 浏览器中从release-note-X.Y.Z分支打开拉取请求。

更新 apache/arrow GitHub 版本中的版本说明

提交者必须运行以下脚本。这必须在更新网站脚本的拉取请求合并后完成

# dev/release/post-05-update-gh-release-notes.sh 17.0.0
dev/release/post-05-update-gh-release-notes.sh <version>
更新 Homebrew 软件包

向 Homebrew 打开拉取请求

## You need to run this on macOS or Linux that Homebrew is installed.

## Fork https://github.com/Homebrew/homebrew-core on GitHub.
## You need to do this only once.
##
## Prepare your fork of https://github.com/Homebrew/homebrew-core .
## You need to do this only once.
cd "$(brew --repository homebrew/core)"
# git remote add kou [email protected]:kou/homebrew-core.git
git remote add <YOUR_GITHUB_ID> [email protected]:<YOUR_GITHUB_ID>/homebrew-core.git
cd -

# dev/release/post-14-homebrew.sh 10.0.0 kou
dev/release/post-14-homebrew.sh X.Y.Z <YOUR_GITHUB_ID>

此脚本将 apache-arrow-X.Y.Z 分支推送到您的 Homebrew/homebrew-core fork。您需要在 Web 浏览器上从 apache-arrow-X.Y.Z 分支创建一个标题为 apache-arrow, apache-arrow-glib: X.Y.Z 的拉取请求。

更新 MSYS2 包

向 MSYS2 发起拉取请求

## Fork https://github.com/msys2/MINGW-packages on GitHub.
## You need to do this only once.
##
## Prepare your fork of https://github.com/msys2/MINGW-packages .
## You need to do this only once.
# git clone [email protected]:kou/MINGW-packages.git ../
git clone [email protected]:<YOUR_GITHUB_ID>/MINGW-packages.git ../
cd ../MINGW-packages
## Add https://github.com/msys2/MINGW-packages.git as "upstream" remote.
git remote add upstream https://github.com/msys2/MINGW-packages.git
cd -

# dev/release/post-13-msys2.sh 10.0.0 ../MINGW-packages
dev/release/post-13-msys2.sh X.Y.Z <YOUR_MINGW_PACKAGES_FORK>

此脚本将 arrow-X.Y.Z 分支推送到您的 msys2/MINGW-packages fork。您需要在 Web 浏览器上从 arrow-X.Y.Z 分支创建一个标题为 arrow: Update to X.Y.Z 的拉取请求。

更新 RubyGems

您需要在 https://rubygems.org.cn/ 上拥有一个账户才能发布 Ruby 包。

如果您在 https://rubygems.org.cn/ 上有账户,则需要加入我们 gem 的所有者。

现有所有者可以通过以下命令行将新账户添加到其所有者中

# dev/release/account-ruby.sh raulcd
dev/release/account-ruby.sh NEW_ACCOUNT

在 Homebrew 包和 MSYS2 包更新后更新 RubyGems

# dev/release/post-06-ruby.sh 10.0.0
dev/release/post-06-ruby.sh X.Y.Z
更新 JavaScript 包

为了将二进制构建发布到 npm,您需要通过联系 https://npmjs.net.cn/package/apache-arrow 包中列出的当前合作者之一来获取项目的访问权限。

包上传需要安装 npm 和 yarn,并在您的账户上配置 2FA。

获得访问权限后,您可以通过运行以下脚本将版本发布到 npm

# Login to npmjs.com (You need to do this only for the first time)
npm login --registry=https://registry.yarnpkg.com/

# dev/release/post-07-js.sh 10.0.0
dev/release/post-07-js.sh X.Y.Z
更新 C# 包

您需要在 https://nuget.net.cn/ 上拥有一个账户。您需要加入 Apache.Arrow 包的所有者。现有所有者可以邀请您加入 https://nuget.net.cn/packages/Apache.Arrow/Manage 的所有者。

您需要在 https://nuget.net.cn/account/apikeys 上创建一个 API 密钥,以便从命令行上传。

https://dotnet.microsoft.com/download 安装最新的 .NET Core SDK。

# NUGET_API_KEY=YOUR_NUGET_API_KEY dev/release/post-08-csharp.sh 10.0.0
NUGET_API_KEY=<your NuGet API key> dev/release/post-08-csharp.sh X.Y.Z
将轮子/sdist 上传到 PyPI

pip 二进制包(称为“轮子”)和源包(称为“sdist”)使用我们在发布候选版本创建过程中使用的 crossbow 工具构建,然后上传到 PyPI(Python 包索引)的 pyarrow 包下。

我们使用 twine 工具将轮子上传到 PyPI

# dev/release/post-11-python.sh 10.0.0
dev/release/post-11-python.sh <version>
发布 Maven 包
更新 R 包

要在 CRAN 上发布 R 包,我们需要先执行几个步骤,以确保 Windows 和 macOS 的二进制文件可供 CRAN 使用。Jeroen Ooms <jeroenooms@gmail.com>维护着几个项目,这些项目为 macOS 和 Windows 上的 R 包构建 C++ 依赖项。我们在 CI 中测试了这些相同构建脚本的副本,在发布时,我们需要发送我们所做的任何更改并更新上游的版本/哈希值。

创建发布候选版本后,使用 rc 向每个存储库发出草稿拉取请求,更新版本和 SHA,以及来自 apache/arrow 中相应文件的任何 cmake 构建更改。Jeroen 可能会在发布投票通过之前合并这些 PR,构建二进制工件,并在正确的位置发布它们,以便我们进行预提交检查(见下文)。在发布候选版本投票通过后,更新这些 PR 以指向官方(非 rc)URL 并将其标记为准备审查。Jeroen 将合并、构建二进制工件并在正确的位置发布它们。请参阅 打包清单。以获取必须在提交到 CRAN 之前发出的拉取请求的精确列表。

一旦满足了这些二进制先决条件,我们就可以提交到 CRAN。鉴于该过程的反复无常,最好由项目的 R 开发人员在提交之前验证包的 CRAN 合格性。我们的 CI 系统为 CRAN 检查的内容提供了一些覆盖范围,但我们还应该进行一些最终测试,以确认发布的二进制文件是否有效以及所有内容是否在与 CRAN 相同的基础设施上运行,这很难/不可能使用 Docker 完全模拟。有关检查的精确列表,请参阅 打包清单

一旦所有检查都干净,我们就提交到 CRAN,CRAN 有一个用于上传包的 Web 表单。发布过程需要当前 R 包维护者 Neal Richardson 的电子邮件确认。

更新 vcpkg 端口

向 vcpkg 发起拉取请求

## Fork https://github.com/microsoft/vcpkg on GitHub.
## You need to do this only once.
##
## Prepare your fork of https://github.com/microsoft/vcpkg .
## You need to do this only once.
# git clone [email protected]:kou/vcpkg.git ../
git clone [email protected]:<YOUR_GITHUB_ID>/vcpkg.git ../
cd ../vcpkg
./bootstrap-vcpkg.sh
## Add https://github.com/microsoft/vcpkg.git as "upstream" remote.
git remote add upstream https://github.com/microsoft/vcpkg.git
cd -

# dev/release/post-15-vcpkg.sh 10.0.0 ../vcpkg
dev/release/post-15-vcpkg.sh X.Y.Z <YOUR_VCPKG_FORK>

此脚本将 arrow-X.Y.Z 分支推送到您的 microsoft/vcpkg fork。您需要在 Web 浏览器上从 arrow-X.Y.Z 分支创建一个标题为 [arrow] Update to X.Y.Z 的拉取请求。

更新 Conan 端口

向 vcpkg 发起拉取请求

## Fork https://github.com/conan-io/conan-center-index on GitHub.
## You need to do this only once.
##
## Prepare your fork of https://github.com/conan-io/conan-center-index .
## You need to do this only once.
# git clone [email protected]:kou/conan-center-index.git ../
git clone [email protected]:<YOUR_GITHUB_ID>/conan-center-index.git ../
cd ../conan-center-index
## Add https://github.com/conan-io/conan-center-index.git as "upstream" remote.
git remote add upstream https://github.com/conan-io/conan-center-index.git
cd -

# dev/release/post-17-conan.sh 10.0.1 ../conan-center-index
dev/release/post-17-conan.sh X.Y.Z <YOUR_CONAN_CENTER_INDEX_FORK>

此脚本将 arrow-X.Y.Z 分支推送到您的 conan-io/conan-center-index fork。您需要在 Web 浏览器上从 arrow-X.Y.Z 分支创建一个拉取请求。

更新版本
# You can run the script with BUMP_TAG=0 and BUMP_PUSH=0
# this will avoid default pushing to main and pushing the tag
# but you will require to push manually after reviewing the commits.
# dev/release/post-12-bump-versions.sh 10.0.0 11.0.0
dev/release/post-12-bump-versions.sh X.Y.Z NEXT_X.NEXT_Y.NEXT_Z
更新文档

文档在发布过程中生成。我们只需要上传生成的文档即可。

## Prepare your fork of https://github.com/apache/arrow-site .
## You need to do this only once.
# git clone [email protected]:kou/arrow-site.git ../
git clone [email protected]:<YOUR_GITHUB_ID>/arrow-site.git ../
cd ../arrow-site
## Add [email protected]:apache/arrow-site.git as "apache" remote.
git remote add apache [email protected]:apache/arrow-site.git
cd -

# dev/release/post-10-docs.sh 10.0.0 9.0.0
dev/release/post-10-docs.sh X.Y.Z PREVIOUS_X.PREVIOUS_Y.PREVIOUS_Z

此脚本将 release-docs-X.Y.Z 分支推送到您的 arrow-site fork。您需要创建一个拉取请求,并使用 asf-site 分支作为其基础。

更新 Apache Arrow 食谱中的版本

待办事项

宣布新版本

编写发布公告(请参阅 示例)并发送到 announce@apache.orgdev@arrow.apache.org

发送到 announce@apache.org 的公告必须从您的 apache.org 电子邮件地址发送,才能被接受。

发布版本博文

待办事项

在 Twitter 上宣布发布

@ApacheArrow 句柄在 Twitter 上发布版本博文。

PMC 成员可以访问或请求访问,之后他们可以通过 TweetDeck 发布。

删除旧工件

删除 https://dist.apache.org/repos/dist/dev/arrow/ 上的 RC 工件和 https://dist.apache.org/repos/dist/release/arrow 上的旧发布工件,以遵循 ASF 策略

dev/release/post-09-remove-old-artifacts.sh