发布管理指南#

本页面详细介绍了执行发布的步骤。它既可以作为学习 Apache Arrow 发布流程的指南,也可以作为发布经理执行发布时的全面清单。担任发布经理的人员至少必须具有 committer 身份才能执行以下任务。如果发布经理是 committer 但不是 PMC 成员,则某些任务需要委托给 PMC 成员,这些任务在下面已相应标记。

原则#

Apache Arrow 发布遵循 Apache 软件基金会发布政策中定义的准则。

准备发布#

在发布日期之前,发布经理通常通过 Zulip、邮件列表或每两周一次的社区电话与社区沟通即将发布的版本,并提出一个功能冻结日期。

功能冻结日期是创建维护分支的日期,从那时起,除非社区达成共识,否则不允许向版本添加新功能,并且只接受错误修复。

一旦功能冻结到位,标记为 blocker 的问题必须在创建第一个候选版本之前解决。

在创建候选版本之前,发布经理必须确保任何已解决的 GitHub 问题都已设置适当的里程碑,以便正确生成更新日志。

请注意,没有相应 GitHub Issue 的拉取请求不会被 cherry-pick 脚本检测到,并且必须由发布经理手动 cherry-pick 到维护分支。示例包括 MINOR 和 Dependabot 拉取请求。因此,建议在创建发布维护分支后,为合并到默认分支的任何拉取请求创建 Issue,以避免手动 cherry-pick 的需要。

要求

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

  • 安装发布所需的 Archery 工具。

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

  • Apache 信任网络中的 GPG 密钥,用于签署二进制工件。这将需要由其他 Apache committer/PMC 成员交叉签名。如果您有多个 GPG 密钥,则必须通过添加以下内容在 ~/.gnupg/gpg.conf 中设置正确的 GPG 密钥 ID

default-key ${YOUR_GPG_KEY_ID}
  • GPG 密钥需要添加到这个 SVN 仓库这个仓库

  • 安装 cpp 和 c_glib 的构建要求。

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

  • 将 Python 3 安装为 python

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

  • 按照定义设置 Crossbow

  • 安装 Docker 和 Docker Compose。

  • 安装 GitHub CLI。

创建候选版本之前#

确保本地标签已删除,gpg-agent 已设置,并且 GitHub 问题已正确分配。

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

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

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

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

补丁版本#

我们通常在发现了一个重大破坏性问题后创建补丁版本。被认定为重大破坏性问题的问题可以是安全修复、特定构建的损坏包等。

任何开发人员都可以通过向 Arrow 开发邮件列表发送电子邮件,说明需要新版本的原因,来请求生成补丁版本。如果达成共识并且有发布经理愿意努力创建该版本,则可以创建补丁版本。

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

如果某个特定问题被认定为创建补丁版本的原因,发布经理应验证,至少,该问题已正确标记并包含在补丁版本中。

请务必仔细检查以下清单

  1. 创建里程碑

  2. 创建维护分支

  3. 包含作为需要新补丁版本而被请求的问题

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

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

创建候选版本#

这些是创建候选版本所需的各种步骤。

对于主要版本的初始候选版本,我们将从 main 创建一个维护分支。这在功能冻结日期完成。

后续的候选版本将通过 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 cherry-pick X.Y.Z --execute
# Push the maintenance branch to the remote repository
git push -u upstream 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
# milestone on GitHub is set to the following release.
archery release cherry-pick X.Y.Z --continue
# Update the maintenance branch with the previous commits
archery release cherry-pick X.Y.Z --continue --execute
# Push the updated maintenance branch to the remote repository
git push -u upstream maint-X.Y.Z

可选:在创建候选版本之前进行测试#

一些发布经理更喜欢在创建第一个候选版本之前执行测试,以避免在给定发布中创建多个候选版本。

在创建候选版本之前进行测试

  • 从最新的 maint-X.Y.Z 分支向 main 创建拉取请求

  • 将拉取请求标题命名为“WIP: Dummy PR to check maint-X.Y.Z status”

  • 在拉取请求上评论以触发相关的 Crossbow 作业

    • @github-actions crossbow submit --group verify-rc-source

    • @github-actions crossbow submit --group packaging

从更新的维护分支创建候选发布分支#

# 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 created
# 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 upstream apache-arrow-<version>-rc<rc-number>
# Push the release candidate branch in order to trigger verification jobs later
git push -u upstream release-<version>-rc<rc-number>

一旦创建了标签,verify-rc.yml 上的 GitHub Actions 工作流将被触发以验证候选版本。

release_candidate.yml 工作流也将被触发,它将签署发布源代码并创建一个带有相应源代码和签名的 GitHub 预发布版本。

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

# Waits for previous workflows to finish and uploads source and signatures to SVN.
#
# NOTE: This must be run by a PMC member
# 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
#
# NOTE: This must be run by a PMC member
#
# 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 MATLAB artifacts to the GitHub Releases area.
#
# NOTE: This must be run by a PMC member
# NOTE: You need to have GitHub CLI installed to run this script.
dev/release/06-matlab-upload.sh <version> <rc-number>

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

验证发布#

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

有关详细信息,请参阅发布验证过程

投票和批准#

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

发布后任务#

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

请务必仔细检查以下清单

  1. 更新已发布的里程碑日期并将其设置为 GitHub 上的“Closed”

  2. 将发布分支上的更改合并到补丁版本的维护分支

  3. 将新版本添加到 Apache Reporter System

  4. 推送发布标签

  5. 上传源代码

  6. 上传二进制文件

  7. 更新网站

  8. 更新 GitHub 发布说明

  9. 更新 Homebrew 包

  10. 更新 MSYS2 包

  11. 上传 RubyGems

  12. 更新 conda 配方

  13. 上传 wheels/sdist 到 pypi

  14. 更新 R 包

  15. 更新 vcpkg 端口

  16. 更新 Conan recipe

  17. 提升版本

  18. 更新文档

  19. 更新 Apache Arrow Cookbook 中的版本

  20. 宣布新发布

  21. 发布发布博客文章

  22. 在 BlueSky 上宣布发布

  23. 删除旧工件

将发布分支上的更改合并到补丁版本的维护分支

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 upstream maint-10.0.0
git push -u upstream maint-X.Y.Z
将新版本添加到 Apache Reporter System

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

推送发布标签并创建 GitHub Release

提交者必须将发布标签推送到 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 Release

# 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 git@github.com:kou/arrow-site.git ../
git clone git@github.com:<YOUR_GITHUB_ID>/arrow-site.git ../
cd ../arrow-site
## Add git@github.com:apache/arrow-site.git as "upstream" remote.
git remote add upstream git@github.com: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-site fork。您需要从您的 Web 浏览器上打开 release-note-X.Y.Z 分支的拉取请求。

更新 apache/arrow GitHub Release 中的发布说明

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

# 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 git@github.com:kou/homebrew-core.git
git remote add <YOUR_GITHUB_ID> git@github.com:<YOUR_GITHUB_ID>/homebrew-core.git
cd -

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

此脚本会将 apache-arrow-X.Y.Z 分支推送到您的 Homebrew/homebrew-core fork。您需要从 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 git@github.com:kou/MINGW-packages.git ../
git clone git@github.com:<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-11-msys2.sh 10.0.0 ../MINGW-packages
dev/release/post-11-msys2.sh X.Y.Z <YOUR_MINGW_PACKAGES_FORK>

此脚本会将 arrow-X.Y.Z 分支推送到您的 msys2/MINGW-packages fork。您需要从 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
上传 wheels/sdist 到 PyPI

pip 二进制包(称为“wheels”)和源代码包(称为“sdist”)是使用我们之前在候选版本创建过程中使用的 crossbow 工具构建的,然后上传到 PyPI (Python Package Index) 的 pyarrow 包下。

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

# dev/release/post-09-python.sh 10.0.0
dev/release/post-09-python.sh <version>
更新 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 有一个用于上传软件包的网页表单。发布过程需要 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 git@github.com:kou/vcpkg.git ../
git clone git@github.com:<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-13-vcpkg.sh 10.0.0 ../vcpkg
dev/release/post-13-vcpkg.sh X.Y.Z <YOUR_VCPKG_FORK>

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

更新 Conan 端口

向 Conan 开放拉取请求

## 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 git@github.com:kou/conan-center-index.git ../
git clone git@github.com:<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-14-conan.sh 10.0.1 ../conan-center-index
dev/release/post-14-conan.sh X.Y.Z <YOUR_CONAN_CENTER_INDEX_FORK>

此脚本会将 arrow-X.Y.Z 分支推送到您的 conan-io/conan-center-index fork。您需要在您的网络浏览器上从 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-10-bump-versions.sh 10.0.0 11.0.0
dev/release/post-10-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 git@github.com:kou/arrow-site.git ../
git clone git@github.com:<YOUR_GITHUB_ID>/arrow-site.git ../
cd ../arrow-site
## Add git@github.com:apache/arrow-site.git as "upstream" remote.
git remote add upstream git@github.com:apache/arrow-site.git
cd -

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

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

更新 Apache Arrow Cookbook 中的版本

请遵循 Apache Arrow Cookbook 仓库中的文档

宣布新发布

撰写发布公告(参见示例)并发送至 announce@apache.orgdev@arrow.apache.org

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

发布发布博客文章

博客发布过程并非自动化。我们通常采取的大致步骤是

  • 克隆 apache/arrow-site

  • 为我们正在创建的博客文章拉取请求,从 main 创建一个新分支。

  • 复制 _posts 子文件夹中最近的博客文章条目,并更新文件名和 YAML 元数据。

    • 将文件名和 YAML 元数据中的日期设置为发布候选投票线程关闭的日期(格林威治标准时间)。

  • 仅适用于次要版本,删除任何关于社区更新的部分(新提交者、PMC 成员等)。

  • 根据需要更新文本的其余部分

  • 创建拉取请求

  • 在拉取请求中,在每个部分中标记贡献者,请求帮助填写每个部分的详细信息。

在社交媒体上发布版本公告

在社交媒体上发布关于版本的信息并链接到博客文章。项目有两个官方账户

PMC 成员有权访问或可以请求访问这些账户进行发布。

删除旧工件

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

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

注意:此步骤必须由 PMC 成员完成。