Releasing a new version

Releasing a new version of tutorial.todoapp involves the following steps:

  1. Create a git tag for the release.
  2. Push the git tag upstream to GitHub.
  3. Generate a distribution file for the package.
  4. Upload the generated package to Python Package Index (PyPI).


Before every release make sure that:

  1. You have documented your changes in the HISTORY.rst file.
  2. You have modified the version identifier in to reflect the new release.
  3. You have confirmed that the package description (generated from README.rst and others) renders correctly by running bin/longtest.
  4. You have committed all changes to the git repository and pushed them upstream.
  5. You have the working directory checked out at the revision you wish to release.


For help with releasing we use jarn.mkreleaser. It's listed as a dependency in and should already be installed in your local bin:

$ bin/mkrelease -d pypi -pq ./


In order to push packages to PyPI you need to have the appropriate access rights to the package on PyPI and you need to configure your PyPI credentials in the ~/.pypirc file, e.g.:

index-servers =

username = fred
password = secret


In the following example we are releasing version 0.1 of tutorial.todoapp. The package has been prepared so that contains the version 0.1, this change has been committed to git and all changes have been pushed upstream to GitHub:

# Check that package description is rendered correctly
$ bin/longtest

# Make a release and upload it to PyPI
$ bin/mkrelease -d pypi -pq ./
Releasing tutorial.todoapp 0.1
Tagging tutorial.todoapp 0.1
* [new tag]         0.1 -> 0.1
running egg_info
running sdist
warning: sdist: standard file not found: should have one of README, README.txt
running register
Server response (200): OK
running upload
warning: sdist: standard file not found: should have one of README, README.txt
Server response (200): OK


Please ignore the sdist warning about README file above. PyPI does not depend on it and it's just a bug in setupools (reported and waiting to be fixed).