Release process
How to release a new version of pantsbuild.pants
and its plugins.
Prerequisites
1. Create a PGP signing key
If you already have one, you can reuse it.
You likely want to use the gpg implementation of pgp. On macOS, you can brew install gpg
. Once gpg is installed, generate a new key: https://docs.github.com/en/github/authenticating-to-github/generating-a-new-gpg-key.
Please use a password for your key!
2. Add your PGP key to GitHub.
3. Configure Git to use your PGP key.
See https://docs.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-key.
Note: the last step is required on macOS.
4. Create a PyPI account
5. Get added to pantsbuild.pants PyPI
You can ask any of the current Owners to add you as a maintainer.
6. Configure ~/.pypirc
Fill in with your PyPI credentials by running:
$ cat << EOF > ~/.pypirc && chmod 600 ~/.pypirc
[pypi]
username: <fill me in>
password: <fill me in>
[server-login]
username: <fill me in>
password: <fill me in>
EOF
Step 1: Prepare the release
The release is automated, outside of these steps:
- Removing any completed deprecations
- Changelog preparation
- CONTRIBUTOR.md updates
- Version bumping
The first three steps always happen in the main
branch, whereas the version bump happens in the relevant release branch.
For dev and rc0
releases, the release branch is main
. For all other release candidates and stable releases, the release branch is that respective version's branch, e.g. 1.28.x
or 1.29.x
.
0a. dev0
- set up the release series
- Create a new file in
src/python/pants/notes
, e.g. createsrc/python/pants/notes/2.2.x.md
.- Copy the title and template over from the prior release, e.g.
2.1.x.md
.
- Copy the title and template over from the prior release, e.g.
- Add the new file to
pants.toml
in therelease_notes
section.
0b. dev
- Check for any deprecations
Your release will fail if there are any deprecated things that should now be removed. Usually, the person who deprecated the feature should have already removed the stale code, but they may have forgotten.
To check for this, search for the version you are releasing. For example, with ripgrep, run rg -C3 1.28.0.dev0
.
If there are things that must be removed, you can either:
- Ping the person who made the deprecation to ask them to remove it.
- Remove it yourself, either in the release prep or as a precursor PR.
- Bump the removal date back by one dev release.
0c. Release candidates - cherry-pick relevant changes
Cherry-pick all changes labeled needs-cherrypick
with the relevant milestone for the stable branch, e.g. the milestone 1.28.x
.
These pull requests must have been merged into main first, so they will already be closed.
To cherry-pick, for example, from 1.28.x:
git fetch https://github.com/pantsbuild/pants 1.28.x
git checkout -b <new-branch-name> FETCH_HEAD
- Find the commit SHA by running
git log main
or looking in GitHub: https://github.com/pantsbuild/pants/commits/main. git cherry-pick <sha>
, using the SHA from the previous step.- Open a pull request to merge into the release branch, e.g.
1.28.x
.
Do not push directly to the release branch. All changes should be added through a pull request.
After a commit has been cherry-picked, remove the needs-cherrypick
label and remove it from the release milestone.
1. Prepare the changelog
Update the release page in src/python/pants/notes
for this release series, e.g. update src/python/pants/notes/2.2.x.md
.
Run build-support/bin/changelog.py --prior 2.2.0.dev0 --new 2.2.0.dev1
with the relevant versions. This will generate the headers to copy into the release notes, along with a list of all commits since the last release.
Use your best judgment when classifying commits. If you are uncertain, you can either message the author on Slack or, in your PR, add a comment for the entry to ask for input from others.
Each entry should have exactly one blank line between it. You are encouraged to fix typos and tweak PR titles for clarity to users.
main
branchEven if you are preparing notes for a release candidate, always prepare the notes in a branch based on main
and, later, target your PR to merge with main
.
Sometimes, committers accidentally use the wrong title when squashing and merging because GitHub pulls the title from the commit title when there is only one commit.
If you see a vague or strange title like "fix bug", open the original PR to see if the PR title is more descriptive. If it is, please use the more descriptive title instead.
2. Update CONTRIBUTORS.md
Run ./build-support/bin/contributors.sh
.
Take note of any new contributors so that you can give a shoutout in the announcement email.
3. dev
and rc0
- bump the VERSION
Change src/python/pants/VERSION
to the new release, e.g. 1.28.0.dev0.
4. Post the prep to GitHub
Open a pull request on GitHub to merge into main
. Post the PR to the #announce channel in Slack.
Merge once approved and green.
From the time you put up your release prep until you hit "merge", be careful that no one merges any commits into main.
If they do—and you're doing a dev or rc0
release—you should merge main
into your PR and update the changelog with their changes. It's okay if the changes were internal only, but any public changes must be added to the changelog.
Once you click "merge", it is safe for people to merge changes again.
5a. rc0
- create a new Git branch
For example, if you're releasing 1.28.0rc0
, create the branch 1.28.x
by running the below. Make sure you are on your release commit before doing this.
$ git checkout -b 1.28.x
$ git push upstream 1.28.x
5b. release candidates - cherry-pick and bump the VERSION
- Checkout from
main
into the release branch, e.g.1.28.x
. - Cherry-pick the release prep using
git cherry-pick <sha>
. - Bump the
VERSION
insrc/python/pants/VERSION
, e.g. to1.28.0rc1
. Push this as a new commit directly to the release branch - you do not need to open a pull request.
Step 2: Update this docs site
dev0
- set up the new page
Create a new version of the docs. Go to dash.readme.io/project/pants. In the top left dropdown, where it says the current version, click "Manage versions". Click "Add new version" and use a "v" with the minor release number, e.g. "v1.28". Fork from the prior release.
Then, create a new page in the "Release notes" section titled with the release series, e.g. "1.28.x".
You can copy the prior release's page to get started. Update the bottom to point to the new changelog.
Update the URL slug to be release-notes-1-28-x
, for example. Press the drop-down on the blue "Save" button, then "Change page slug".
Finally, reorder the page in the "Release notes" section so that it shows up as the most recent.
Summarize important changes
In a list of bullet points, briefly describe any important changes from your release.
This is a bit subjective, but some things you may want to highlight:
- New features.
- Major bug fixes.
- Substantial API changes.
- You do not need to highlight small changes like "Upgrade from ansiolors 2.10 to ansicolors 2.12". This is what the changelog is for.
If there are any docs explaining the new features, link to those by using readme.io's markdown variant of [Page title](doc:new-page)
.
You do not need to link to the original PRs in the summary, unless the PR has important documentation for users. The summary is only meant to give a highlight, whereas the changelog has the nitty-gritty details.
Update the version in Installing Pants
Update Installing Pants to use the version you're releasing in the pants.toml
snippet.
stable
releases - Update the default docsite
The first stable release of a branch should update the "default" version of the docsite. For example: when releasing the stable 2.2.0
, the docsite would be changed to pointing from v2.1
to pointing to v2.2
by default.
Ping someone in the #maintainers Slack channel to be added. Alternatively, you can "Suggest edits" in the top right corner.
Step 3: Wait for CI to build the wheels
Once you have merged the VERSION
bump—which will be on main
for dev
and rc0
releases and the release branch for release candidates—CI will start building the wheels you need to finish the release.
Head to https://github.com/pantsbuild/pants/actions and find your relevant build. You need the "Build wheels and fs_util" jobs to pass.
Step 4: Run release.sh
First, ensure that you are on your release branch at your version bump commit.
You can reset to your release commit by running git rest --hard <sha>
.
Then, run:
$ ./build-support/bin/release.sh
This will first download the pre-built wheels built in CI and will publish them to PyPI. About 2-3 minutes in, the script will prompt you for your PGP password.
We also release Pants a Pex via GitHub releases. Run this:
$ PANTS_PEX_RELEASE=stable ./build-support/bin/release.sh
Then go to https://github.com/pantsbuild/pants/tags, find your release's tag, click Edit tag
, and upload the PEX located at dist/pants.<stable-version>.pex
.
Step 5: Test the release
Run this script as a basic smoke test:
$ ./build-support/bin/release.sh -t
You should also check PyPI to ensure everything looks good. Click "Release history" to find the version you released, then click it and confirm the changelog is correct on the "Project description" page and that the macOS
and manylinux
wheels show up in the "Download files" page.