Making a release

A core developer should use the following steps to create a release X.Y.Z of slicer-package-manager and slicer-package-manager-client on PyPI.

Prerequisites

Documentation conventions

The commands reported below should be evaluated in the same terminal session.

Commands to evaluate starts with a dollar sign. For example:

$ echo "Hello"
Hello

means that echo "Hello" should be copied and evaluated in the terminal.

Setting up environment

  1. First, register for an account on PyPI.

  2. If not already the case, ask to be added as a Package Index Maintainer.

  3. Create a ~/.pypirc file with your login credentials:

    [distutils]
    index-servers =
      pypi
      pypitest
    
    [pypi]
    username=__token__
    password=<your-token>
    
    [pypitest]
    repository=https://test.pypi.org/legacy/
    username=__token__
    password=<your-token>
    
where <your-token> correspond to the API token associated with your PyPI account.

PyPI: Step-by-step

  1. Make sure that all CI tests are passing on CircleCI.
  2. Download the latest sources
$ cd /tmp && \
  git clone git@github.com:girder/slicer_package_manager && \
  cd slicer_package_manager
  1. List all tags sorted by version
$ git fetch --tags && \
  git tag -l | sort -V
  1. Choose the next release version number
$ release=X.Y.Z

Warning

To ensure the packages are uploaded on PyPI, tags must match this regular expression: ^[0-9]+(\.[0-9]+)*(\.post[0-9]+)?$.

  1. In CHANGES.rst replace Next Release section header with X.Y.Z, in python_client/slicer_package_manager_client/__init__.py update version with X.Y.Z and commit the changes.
$ git add CHANGES.rst && \
  git add python_client/slicer_package_manager_client/__init__.py && \
  git commit -m "slicer-package-manager[-client] ${release}"
  1. Tag the release
$ git tag --sign -m "slicer-package-manager[-client] ${release}" ${release} main

Warning

We recommend using a GPG signing key to sign the tag.

  1. Create the source distribution and wheel for slicer-package-manager
$ pipx run build

Note

pipx allows to directly run the build frontend without having to explicitly install it.

To install pipx:

$ python3 -m pip install --user pipx
  1. Create the source distribution and wheel for slicer-package-manager-client
$ pipx run build ./python_client
  1. Publish the both release tag and the main branch
$ git push origin ${release} && \
  git push origin main
  1. Upload the distributions on PyPI
$ pipx run twine upload dist/*
$ pipx run twine upload python_client/dist/*

Note

To first upload on TestPyPI , do the following:

$ pipx run twine upload -r pypitest dist/*
$ pipx run twine upload -r pypitest python_client/dist/*
  1. Create a clean testing environment to test the installation
$ pushd $(mktemp -d) && \
  mkvirtualenv slicer-package-manager-${release}-install-test && \
  pip install slicer-package-manager==${release}

$ pushd $(mktemp -d) && \
  mkvirtualenv slicer-package-manager-client-${release}-install-test && \
  pip install slicer-package-manager-client==${release} && \
  slicer_package_manager_client --version

Note

If the mkvirtualenv command is not available, this means you do not have virtualenvwrapper installed, in that case, you could either install it or directly use virtualenv or venv.

To install from TestPyPI, do the following:

$ pip install -i https://test.pypi.org/simple slicer-package-manager==${release}
  1. Cleanup
$ popd && \
  deactivate  && \
  rm -rf dist/* && \
  rmvirtualenv slicer-package-manager-${release}-install-test && \
  rm -rf python_client/dist/* && \
  rmvirtualenv slicer-package-manager-client-${release}-install-test
  1. Add a Next Release section back in CHANGES.rst, commit and push local changes.
$ git add CHANGES.rst && \
  git commit -m "CHANGES.rst: Add \"Next Release\" section [ci skip]" && \
  git push origin main