PyCape and Serdio are versioned and released in lock-step. The procedure is almost entirely automated via a combination of the project Makefile and its Github Actions workflows.
PyCape follows SemVer, so the released versions follow the pattern MAJOR.MINOR.PATCH
. All commits between released versions are considered release candidates and follow the pattern MAJOR.MINOR.PATCH-rc
. Only released versions are guaranteed to respect semantic versioning.
Serdio is lock-stepped with a corresponding PyCape version, so while its versions may seem to respect SemVer, there is no guarantee that they will.
You will need to be an admin of the repo in order to follow this release process. If you're not, request admin permissions or ask an admin to do it for you.
You will also need to have GPG-signing configured locally and linked to a verified Github email address. This is necessary for Github to consider the release commits signed by a verified GPG key.
IMPORTANT. Make sure that you are currently on the main
branch of the repo. Following the release process on another branch will fail to trigger the correct Github Action workflows.
IMPORTANT. Make sure your local main
branch is up-to-date with the latest commits from the origin
remote. Forgetting to include recent commits will prevent you from pushing the released commits to Github later.
NEVER PUBLISH A RELEASE FROM A COMMIT THAT HAS FAILED ANY OF ITS STATUS CHECKS.
The SemVer requirements for deciding the bump level are reproduced below:
- A
major
bump signifies an incompatible or breaking change. - A
minor
bump signifies new functionality that is backwards-compatible. - A
patch
bump signifies backwards-compatible bugfixes
Note that these only apply to the public PyCape API. For example, breaking changes to downstream Cape projects might introduce backwards-incompatible changes that are purely internal to PyCape. These types of internal changes do not constitute a breaking change for PyCape.
From the project root, run the corresponding cmake target for the version bump. The options are listed below:
make bump-patch
make bump-minor
make bump-major
This will actually trigger two separate release bumps: one from the current release candidate to tagged release, and then another from tagged release to the next release candidate. Using make bump-minor
as an example,
- Commit #1 bumps
1.0.0-rc
to1.1.0
. The commit ref is tagged with the version number, i.e.git tag 1.1.0
. - Commit #2 bumps
1.1.0
to1.1.1-rc
. This commit starts the next release candidate, so it won't be tagged.
NOTE that if you have to start over at any point after this step, you will have to delete the tag that was created here with something like git tag -d 1.1.0
.
The above changes are automatically committed, so you'll want to be sure that the commits happened the way you expected them to. You can do this by checking the version numbers in the pyproject.toml
of both Serdio and PyCape, as well as checking your git log
to make sure the right commit has been tagged. The git log
should look something like this:
commit <OMITTED> (HEAD -> main)
Author: <OMITTED> <<OMITTED>@capeprivacy.com>
Date: <OMITTED>
bump version 1.1.0 -> 1.1.1-rc
commit <OMITTED> (tag: 1.1.0)
Author: <OMITTED> <<OMITTED>@capeprivacy.com>
Date: <OMITTED>
bump version 1.0.0-rc -> 1.1.0
You can verify that the commits have been propely signed with git log --show-signature
.
If you don't have automatic GPG-signing set up, you should use your GPG key to sign these commits retroactively with:
git rebase origin/main -x 'git commit -n -S --no-edit --amend'
BEFORE you follow the next step, it's worth fetching from origin
and checking your git log
to make sure that your current HEAD is only two commits ahead of the latest commit on main. If more commits have been added, you will have to hard reset your local version of main
to the origin's and start over.
Finally, push the last two commits to main with:
git push origin main
Now, WAIT for the latest commit on main to pass its CI workflow. If for some reason the CI status check fails, you will need to investigate why and resolve it. If resolution requires any new commits, you will have to wait for the relevant PRs to be merged into main
, and then restart this release process from the newer version of main
.
Finally, once you've verified that CI is passing for the release commits, you will push the git tag to Github.
Seriously, this is your last chance to avoid disaster. NEVER PUSH A TAG IF ITS COMMITS HAVEN'T PASSED THE CI WORKFLOWS IN GITHUB ACTIONS.
$ git push origin 1.1.0
This will trigger the PyCape and Serdio release workflows in the repo's Github Actions. These workflows will build wheels for PyCape and Serdio, test the wheels, upload them to the latest draft Github Release, and finally push them to PyPI for public consumption.
If something went wrong, you will have to diagnose and fix it here. This might require you to start over. Sorry.
NEVER PUBLISH A GITHUB RELEASE FROM A TAG THAT HAS FAILED ITS RELEASE WORKFLOWS
Our Netlify pydocs site (https://pydocs.capeprivacy.com) is set to publish from the staging/docs
branch on Github. Since we want this site to host documentation for the latest released version of PyCape, you will need to merge the latest tag into this branch. You can do so with the following:
$ git checkout staging/docs
$ git merge --ff 1.1.0
$ git push origin staging/docs
Once the Netlify deploy succeeds, you can check https://pydocs.capeprivacy.com to ensure it has the latest release changes.
Finally, navigate to the Releases
section of the repo (you can find it on the right sidebar of the repo's homepage). The latest one should be a "draft" release. Open the draft release, and update it to match the version bump you just went through. This includes:
- Make sure the tag (drop-down menu in top-left) is set to
1.1.0
. - Modify the release title to match your semantic version bump. By default it's the next patch version, so you'll probably only have to change it if you are doing a minor or major bump.
- If you'd like, you have a chance to clean up the version history in the Release body before publishing. You can also add comments here to emphasize or describe higher-level changes to the library. This could include pointing out or explaining breaking changes that required a major version bump.
- Finally, press "Publish".
Congratulations, you have successfully cut and published a release of PyCape and Serdio.