Release Management Guide#

This page provides detailed information on the steps followed to performa release. It can be used both as a guide to learn the Apache Arrow releaseprocess and as a comprehensive checklist for the Release Manager whenperforming a release. The person acting as Release Manager must at least havecommitter status in order to perform the tasks below. If the Release Manager isa committer but not a member of the PMC, some tasks will need to be delegatedto a PMC member and these are marked below accordingly.

Principles#

The Apache Arrow Release follows the guidelines defined at theApache Software Foundation Release Policy.

Preparing for the release#

In advance to the Release date the Release Manager communicates with the communityusually via Zulip, Mailing List or the bi-weekly community call about theupcoming release and proposes a feature freeze date.

The feature freeze date is the date the maintenance branch is created andfrom that point no new features are allowed to be added to the release, unless thereis community consensus to allow it, and only bug fixes will be accepted.

Once the feature freeze is in place issues labelled asblocker must be resolved beforethe first release candidate can be created.

Before creating a release candidate, the Release Manager must ensure that anyresolved GitHub issues have the appropriate milestone set so that the changelogis generated properly.

Note that pull requests without a corresponding GitHub issue won’t be detectedby the cherry-pick script and must be cherry-picked manually by the releasemanager onto the maintenance branch. Examples include MINOR and Dependabot pullrequests. For this reason, it’s encouraged to avoid the need for manualcherry-picking by creating issues for any pull requests that are merged to thedefault branch after the release maintenance branch has been created.

Requirements

Some steps of the release require being a committer or a PMC member.

  • Install theArchery utility which is required for the release.

  • You must not have any arrow-cpp or parquet-cpp environment variables defined except CC or CXX if you want to build with something other than GCC by default (e.g. clang).

  • A GPG key in the Apache Web of Trust to sign binary artifacts. This will have to be cross signed by other Apache committers/PMC members. If you have multiple GPG keys, you must set the correct GPG key ID in~/.gnupg/gpg.conf by adding:

default-key ${YOUR_GPG_KEY_ID}
  • The GPG key needs to be added to thisSVN repo andthis one.

  • Have the build requirements for cpp and c_glib installed.

  • Installen_US.UTF-8 locale. You can confirm available locales bylocale-a.

  • Install Python 3 as python

  • Create dev/release/.env from dev/release/.env.example. See the comments in dev/release/.env.example how to set each variable.

  • SetupCrossbow as defined.

  • Have Docker and Docker Compose installed.

  • Have GitHub CLI installed.

Before creating a Release Candidate#

Ensure local tags are removed, gpg-agent is set and GitHub issues are correctlyassigned.

# Delete the local tag for RC1 or latergittag-dapache-arrow-<version># Setup gpg agent for signing binary artifactssourcedev/release/setup-gpg-agent.sh# Curate the release# The end of the generated report shows any GitHub issues with the wrong# version number assigned.archeryreleasecurate<version>

Ensure a major version milestone for a follow up release is created on GitHub. This willautomatically be used by our merge script as the new version for issues closed whenthe maintenance branch is created.

Patch Releases#

We usually create patch releases once a major breaking issue has been identified.Issues that are identified as major breaking issues can be security fixes, broken packagesfor specific builds and others.

Any developer can ask for a patch release to be generated sending an email to theArrow development mailing-list with the reasonof why a new release is necessary.If there is consensus and there is a Release Manager willing to make the effort to createthe release a patch release can be created.

Committers can tag issues that should be included on the next patch release using thebackport-candidate label. Is the responsibility of the author or the committer to add thelabel to the issue to help the Release Manager identify the issues that should be backported.

If a specific issue is identified as the reason to create a patch release the Release Managershould validate that, at least, this issue is correctly tagged and included in the patch release.

Be sure to go through on the following checklist:

  1. Create milestone

  2. Create maintenance branch

  3. Include issue that was requested as requiring new patch release

  4. Add new milestone to issues withbackport-candidate label

  5. cherry-pick issues into maintenance branch

Creating a Release Candidate#

These are the different steps that are required to create a Release Candidate.

For the initial Release Candidate on a major release, we will create a maintenancebranch from main. This is done on the feature freeze date.

Follow up Release Candidates will update the maintenance branch by cherry-pickingspecific commits.

For the initial Release Candidate for a minor or a patch release we will createa maintenance branch from the previous corresponding release. For example,for a 15.0.1 patch we will create a maint-15.0.1 branch from maint-15.0.0 and fora maint-15.0.2 we will create it from maint-15.0.1. Once the maintenance branch iscreated we will update the created maintenance branch by cherry-picking specificcommits.

Create or update the corresponding maintenance branch#

# 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.0archeryreleasecherry-pickX.Y.Z--execute# Push the maintenance branch to the remote repositorygitpush-uupstreammaint-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.archeryreleasecherry-pickX.Y.Z--continue# Update the maintenance branch with the previous commitsarcheryreleasecherry-pickX.Y.Z--continue--execute# Push the updated maintenance branch to the remote repositorygitpush-uupstreammaint-X.Y.Z

Optional: Test Before Creating a Release Candidate#

Some release managers prefer to perform testing before creating the firstrelease candidate to avoid the need to create multiple release candidates withina given release.

To test before creating a release candidate:

  • Create a pull request from the up-to-date maint-X.Y.Z branch onto main

  • Title the pull request “WIP: Dummy PR to check maint-X.Y.Z status”

  • Comment on the pull request to trigger the relevant Crossbow jobs:

    • @github-actionscrossbowsubmit--groupverify-rc-source

    • @github-actionscrossbowsubmit--grouppackaging

Create the Release Candidate branch from the updated maintenance branch#

# Start from the updated maintenance branch.gitcheckoutmaint-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 0dev/release/01-prepare.sh<version><next-version><rc-number># Push the release candidate taggitpush-uupstreamapache-arrow-<version>-rc<rc-number># Push the release candidate branch in order to trigger verification jobs latergitpush-uupstreamrelease-<version>-rc<rc-number>

Once the tag is created the GitHub Actions workflow onverify-rc.yml will be triggered to verifythe release candidate.

Therelease_candidate.yml workflow will also be triggered which will sign the source codefor the release and will create a GitHub pre-release with the corresponding source and signatures.

Build source and binaries and submit them#

# 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 iddev/release/03-binary-submit.sh<version><rc-number># Wait for the crossbow jobs to finisharcherycrossbowstatus<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 wheelsdev/release/07-binary-verify.sh<version><rc-number>

Verify the Release#

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

SeeRelease Verification Process for details.

Voting and approval#

Start the vote thread ondev@arrow.apache.org and supply instructions for verifying the integrity of the release.Approval requires a net of 3 +1 votes from PMC members. A release cannot be vetoed.

Post-release tasks#

After the release vote, we must undertake many tasks to update source artifacts, binary builds, and the Arrow website.

Be sure to go through on the following checklist:

  1. Update the released milestone Date and set to “Closed” on GitHub

  2. Merge changes on release branch to maintenance branch for patch releases

  3. Add the new release to the Apache Reporter System

  4. Push release tag

  5. Upload source

  6. Upload binaries

  7. Update website

  8. Update GitHub Release Notes

  9. Update Homebrew packages

  10. Update MSYS2 package

  11. Upload RubyGems

  12. Update conda recipes

  13. Upload wheels/sdist to pypi

  14. Update R packages

  15. Update vcpkg port

  16. Update Conan recipe

  17. Bump versions

  18. Update docs

  19. Update version in Apache Arrow Cookbook

  20. Announce the new release

  21. Publish release blog posts

  22. Announce the release on BlueSky

  23. Remove old artifacts

Merge changes on release branch to maintenance branch for patch releases

Mergerelease-X.Y.Z-rcN tomaint-X.Y.Z:

# git checkout maint-10.0.0gitcheckoutmaint-X.Y.Z# git merge release-10.0.0-rc0gitmergerelease-X.Y.Z-rcN# git push -u upstream maint-10.0.0gitpush-uupstreammaint-X.Y.Z
Add the new release to the Apache Reporter System

Add relevant release data for Arrow toApache reporter.

Push release tag and create GitHub Release

A committer must push the release tag to GitHub:

# dev/release/post-01-tag.sh 0.1.0 0dev/release/post-01-tag.sh<version><rc>
Upload source release artifacts to Subversion

A PMC member must commit the source release artifacts to Subversion:

# dev/release/post-02-upload.sh 0.1.0 0dev/release/post-02-upload.sh<version><rc>
Upload binary release artifacts to Artifactory

A committer must upload the binary release artifacts to Artifactory and create the GitHub Release:

# dev/release/post-03-binary.sh 0.1.0 0dev/release/post-03-binary.sh<version><rcnumber>
Update website

Add a release note for the new version to our website and update the latest release information:

## 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 ../gitclonegit@github.com:<YOUR_GITHUB_ID>/arrow-site.git../cd../arrow-site## Add git@github.com:apache/arrow-site.git as "upstream" remote.gitremoteaddupstreamgit@github.com:apache/arrow-site.gitcd-## 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.0dev/release/post-04-website.shOLD_X.OLD_Y.OLD_ZX.Y.Z

This script pushes arelease-note-X.Y.Z branch to yourapache/arrow-site fork. You need to open a pull request from therelease-note-X.Y.Z branch on your Web browser.

Update Release Notes in apache/arrow GitHub Release

A committer must run the following script. This has to be done once thePull Request from the Update Website script has been merged:

# dev/release/post-05-update-gh-release-notes.sh 17.0.0dev/release/post-05-update-gh-release-notes.sh<version>
Update Homebrew packages

Open a pull request to 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--repositoryhomebrew/core)"# git remote add kou git@github.com:kou/homebrew-core.gitgitremoteadd<YOUR_GITHUB_ID>git@github.com:<YOUR_GITHUB_ID>/homebrew-core.gitcd-# dev/release/post-12-homebrew.sh 10.0.0 koudev/release/post-12-homebrew.shX.Y.Z<YOUR_GITHUB_ID>

This script pushes aapache-arrow-X.Y.Z branch to yourHomebrew/homebrew-core fork. You need to create a pull request from theapache-arrow-X.Y.Z branch withapache-arrow,apache-arrow-glib:X.Y.Z title on your Web browser.

Update MSYS2 packages

Open a pull request to 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 ../gitclonegit@github.com:<YOUR_GITHUB_ID>/MINGW-packages.git../cd../MINGW-packages## Add https://github.com/msys2/MINGW-packages.git as "upstream" remote.gitremoteaddupstreamhttps://github.com/msys2/MINGW-packages.gitcd-# dev/release/post-11-msys2.sh 10.0.0 ../MINGW-packagesdev/release/post-11-msys2.shX.Y.Z<YOUR_MINGW_PACKAGES_FORK>

This script pushes aarrow-X.Y.Z branch to yourmsys2/MINGW-packages fork. You need to create a pull request from thearrow-X.Y.Z branch witharrow:UpdatetoX.Y.Z title on your Web browser.

Update RubyGems

You need an account onhttps://rubygems.org/ to release Ruby packages.

If you have an account onhttps://rubygems.org/ , you need to join owners of our gems.

Existing owners can add a new account to the owners of them by the following command line:

# dev/release/account-ruby.sh raulcddev/release/account-ruby.shNEW_ACCOUNT

Update RubyGems after Homebrew packages and MSYS2 packages are updated:

# dev/release/post-06-ruby.sh 10.0.0dev/release/post-06-ruby.shX.Y.Z
Upload wheels/sdist to PyPI

pip binary packages (called “wheels”) and source package (called “sdist”) are built using the crossbow tool that we used above during the release candidate creation process and then uploaded to PyPI (Python Package Index) under the pyarrow package.

We use the twine tool to upload wheels to PyPI:

# dev/release/post-09-python.sh 10.0.0dev/release/post-09-python.sh<version>
Update R packages

To publish the R package on CRAN, there are a few steps we need to do firstin order to ensure that binaries for Windows and macOS are available to CRAN.Jeroen Ooms <jeroenooms@gmail.com> maintains several projects that build C++dependencies for R packages for macOS and Windows. We test copies of thesesame build scripts in our CI, and at release time, we need to send anychanges we have and update the versions/hashes upstream.

When the release candidate is made, make draft pull requests to eachrepository using the rc, updating the version and SHA, as well as any cmakebuild changes from the corresponding files in apache/arrow. Jeroen maymerge these PRs before the release vote passes, build the binary artifacts,and publish them in the right places so that we can do pre-submission checks(see below). After the release candidate vote passes, update these PRsto point to the official (non-rc) URL and mark them as ready for review.Jeroen will merge, build the binary artifacts, and publish them in theright places. See thepackaging checklist.for a precise list of pull requests that must be made prior to submissionto CRAN.

Once these binary prerequisites have been satisfied, we can submit to CRAN.Given the vagaries of the process, it is best if the R developers on theproject verify the CRAN-worthiness of the package before submitting.Our CI systems give us some coverage for the things that CRAN checks, butthere are a couple of final tests we should do to confirm that the releasebinaries will work and that everything runs on the same infrastructure thatCRAN has, which is difficult/impossible to emulate fully with Docker. For aprecise list of checks, see thepackaging checklist.

Once all checks are clean, we submit to CRAN, which has a web form foruploading packages. The release process requires email confirmationfrom the R package maintainer, currently Neal Richardson.

Update vcpkg port

Open a pull request to 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 ../gitclonegit@github.com:<YOUR_GITHUB_ID>/vcpkg.git../cd../vcpkg./bootstrap-vcpkg.sh## Add https://github.com/microsoft/vcpkg.git as "upstream" remote.gitremoteaddupstreamhttps://github.com/microsoft/vcpkg.gitcd-# dev/release/post-13-vcpkg.sh 10.0.0 ../vcpkgdev/release/post-13-vcpkg.shX.Y.Z<YOUR_VCPKG_FORK>

This script pushes aarrow-X.Y.Z branch to yourmicrosoft/vcpkg fork. You need to create a pull request from thearrow-X.Y.Z branch with[arrow]UpdatetoX.Y.Z title on your Web browser.

Update Conan port

Open a pull request to 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 ../gitclonegit@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.gitremoteaddupstreamhttps://github.com/conan-io/conan-center-index.gitcd-# dev/release/post-14-conan.sh 10.0.1 ../conan-center-indexdev/release/post-14-conan.shX.Y.Z<YOUR_CONAN_CENTER_INDEX_FORK>

This script pushes aarrow-X.Y.Z branch to yourconan-io/conan-center-index fork. You need to create a pull request from thearrow-X.Y.Z branch on your Web browser.

Bump versions
# 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.0dev/release/post-10-bump-versions.shX.Y.ZNEXT_X.NEXT_Y.NEXT_Z
Update docs

Documentation is generated as part of the release process. We just need toupload the generated documentation:

## 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 ../gitclonegit@github.com:<YOUR_GITHUB_ID>/arrow-site.git../cd../arrow-site## Add git@github.com:apache/arrow-site.git as "upstream" remote.gitremoteaddupstreamgit@github.com:apache/arrow-site.gitcd-# dev/release/post-08-docs.sh 10.0.0 9.0.0dev/release/post-08-docs.shX.Y.ZPREVIOUS_X.PREVIOUS_Y.PREVIOUS_Z

This script pushes arelease-docs-X.Y.Z branch to yourarrow-site fork. You need to create a Pull Request and use theasf-site branch as base for it.

Update version in Apache Arrow Cookbook

Followthe documentationin the Apache Arrow Cookbook repository

Announce the new release

Write a release announcement (seeexample) and send toannounce@apache.org anddev@arrow.apache.org.

The announcement toannounce@apache.org must be sent from your apache.org e-mail address to be accepted.

Publish release blog post

The blog post process isn’t automated. The rough set of steps we usually takeare:

  • Cloneapache/arrow-site.

  • Create a new branch offmain for the blog post pull request we’recreating.

  • Duplicate a recent blog post entry in the_posts subfolder and updatethe filename and YAML metadata.

    • Set the date in the filename and in the YAML metadata to the date that therelease candidate vote thread for the release closed (in GMT).

  • For minor releases only, remove any section about community updates (newcommitters, PMC members, etc).

  • Update the remainder of the text as needed

  • Create the pull request

  • In the pull request, ping contributors in each section requesting helpfilling in the details for each section.

Announce the release on social media

Post about the release and link to the blog post on social media. The projecthas two official accounts:

PMC members have access or can request access to post under these accounts.

Remove old artifacts

Remove RC artifacts onhttps://dist.apache.org/repos/dist/dev/arrow/ and old release artifacts onhttps://dist.apache.org/repos/dist/release/arrow to followthe ASF policy:

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

Note: This step must be done by a PMC member.