These instructions cover steps needed to create new releases of the rellu
tool. Many individual steps are automated, but we don't want to automate
the whole procedure because it would be hard to react if something goes
terribly wrong. When applicable, the steps are listed as commands that can
be copied and executed on the command line.
- Preconditions
- Preparation
- Release notes
- Set version
- Tagging
- Creating distributions
- Post actions
- Announcements
Generating releases has only been tested on Linux, but it ought to work the same way also on OSX and other unixes. Generating releases on Windows may work but is not tested, supported, or recommended.
Creating releases is only supported with Python 3.10 or newer. If you are using Ubuntu or one of its derivatives and don't have Python 3.10 in the official package repository, you may consider using the Dead Snakes PPA.
The pip and invoke commands below are also expected to run on Python
3.10+. Alternatively, it's possible to use the python3.10 -m pip approach
to run these commands.
Many steps are automated using Invoke and also
other tools/modules such as twine
are needed. A pre-condition is installing all these tools, and that's easiest
done using pip and the requirements-build.txt
file:
pip install -r requirements-build.txtInvoke tasks are defined in tasks.py file and they are executed from
the command line like:
inv[oke] task [options]Run invoke without arguments for help. All tasks can be listed using
invoke --list and each task's usage with invoke --help task.
Git commands used below always expect that origin is the project main
repository. If that's not the case, and instead origin is your personal
fork, you probably still want to push to the main repository. In that case
you need to add upstream or similar to git push commands before
running them.
-
Check that you are on the master branch and have nothing left to commit, pull, or push:
git branch git status git pull --rebase git push
-
Clean up:
invoke clean
-
Set version information to a shell variable to ease copy-pasting further commands. Add
aN,bNorrcNpostfix if creating a pre-release:VERSION=<version>
For example,
VERSION=3.0.1orVERSION=3.1a2.
-
Generate a template for the release notes. Either first create shell variables with GitHub login info or just replace them in the command to actually generate the notes:
GITHUB_USERNAME=<username> GITHUB_PASSWORD=<password> invoke release-notes -w -v $VERSION -u $GITHUB_USERNAME -p $GITHUB_PASSWORD
The
-v $VERSIONoption can be omitted if version is already set. Omit the-woption if you just want to get release notes printed to the console, not written to a file.When generating release notes for a preview release like
3.0.2rc1, the list of issues is only going to contain issues with that label (e.g.rc1) or with a label of an earlier preview release (e.g.alpha1,beta2). -
Fill the missing details in the generated release notes template.
-
Make sure that issues have correct information:
- All issues should have type (bug, enhancement or task) and priority set. Notice that issues with the task type are automatically excluded from the release notes.
- Issue priorities should be consistent.
- Issue titles should be informative. Consistency is good here too, but no need to overdo it.
If information needs to be added or edited, its better to edit it in the issue tracker than in the generated release notes. This allows re-generating the list of issues later if more issues are added.
-
Add, commit and push:
git add doc/rellu-$VERSION.md git commit -m "Release notes for $VERSION" doc/rellu-$VERSION.md git push
-
Update later if necessary. Writing release notes is typically the biggest task when generating releases, and getting everything done in one go is often impossible.
-
Set version information in
rellu/__init__.py:invoke set-version $VERSION -
Commit and push changes:
git commit -m "Updated version to $VERSION" rellu/__init__.py git push
-
Create an annotated tag and push it:
git tag -a v$VERSION -m "Release $VERSION" git push --tags
-
Add short release notes to GitHub's releases page with a link to the full release notes.
-
Checkout the earlier created tag if necessary:
git checkout v$VERSION -
Cleanup. This removes temporary files as well as
buildanddistdirectories:invoke clean
-
Create source distribution and wheel:
python3 -m build ls -l dist
Distributions can be tested locally if needed.
-
Upload to PyPI:
twine upload dist/* -
Verify that project page at PyPI looks good.
-
Test installation (add
--prewith pre-releases):pip install rellu --upgrade
-
Set dev version based on the previous version:
invoke set-version dev git commit -m "Back to dev version" rellu/__init__.py git pushFor example,
1.2.3is changed to1.2.4.dev1and2.0.1a1to2.0.1a2.dev1. -
Close the issue tracker milestone.
-
Create new milestone for the next release unless one exists already.
Probably no public announcements needed for this project.