🐍

PyPIパッケージのリリースもバージョニングもGitHub単独で完結させる

2021/08/23に公開

リリースもバージョン上げもシンプルに

PyPIパッケージをリリースする際の面倒な作業を、GitHubだけ触れば完了できるようにします。
具体的には、GitHub上でバージョンタグをつけてリリースすれば、自動でバージョン情報を含めてPyPIにリリースされるよう設定します。

リリースできる環境をローカルに用意せずに済みますし、バージョンを上げるたびにsetup.pysetup.cfgを書き換える必要もなくなります。

以下の作業をする前に、まずsetup.pysetup.cfgversion引数があるなら消しておきましょう。

setuptools_scmで自動バージョン付け

setuptools_scmはPyPAが提供するパッケージで、gitコミットのタグからバージョン情報を受け取り、ビルド時に設定してくれます。
本記事ではこのパッケージを使用します。
……といっても開発環境にインストールする必要はありません。
pyproject.tomlを次のように設定しましょう。

pyproject.toml
[build-system]
requires = ["setuptools>=45", "wheel", "setuptools_scm[toml]>=6.0"]

これだけでビルド環境にsetuptools_scmが必要であることを伝えられます。

加えて、プログラム内でバージョン情報にアクセスする必要がある場合は、以下のセクションを追加します。

pyproject.toml
[tool.setuptools_scm]
write_to = "{パッケージ名}/_version.py"

write_toで指定したファイルが作成され、バージョン情報が埋め込まれます。

_version.py
# coding: utf-8
# file generated by setuptools_scm
# don't change, don't track in version control
version = '0.1.1'
version_tuple = (0, 1, 1)

Github Actionsで自動リリース

PyPAユーザーガイドに載っていたものをベースに少し改良したActionを載せておきます。

↑のガイドでは(2023.08.20時点で)Repository secretsにPyPIのAPIトークンを手動で設定する方法が紹介されていますが、本記事ではsecretlessなtrusted publishingという機能を利用します。
PyPI publish GitHub ActionのREADMEでは現在のベストプラクティス(2023.08.20時点)と紹介されていますし、基本この手法で良いと思います。

publish-to-pypi.yml
name: Publish Python 🐍 distributions 📦 to PyPI

on:
  release:
    types: [published]

jobs:
  build-n-publish:
    name: Build and publish Python 🐍 distributions 📦 to PyPI
    runs-on: ubuntu-latest
    environment: release
    permissions:
      id-token: write
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python 3.x
      uses: actions/setup-python@v4
      with:
        python-version: '3.x'
    - name: Install pypa/build
      run: >-
        python -m
        pip install
        build
        --user
    - name: Build a binary wheel and a source tarball
      run: >-
        python -m
        build
        --sdist
        --wheel
        --outdir dist/
        .
    - name: Publish distribution 📦 to PyPI
      uses: pypa/gh-action-pypi-publish@release/v1

最後に、PyPIのプロジェクトページから、trusted publishingを利用する設定をします
↓の記事の通りに進めればOKです。
https://docs.pypi.org/trusted-publishers/adding-a-publisher/

以上のステップが上手く行っていれば、GitHubでリリースするたびにActionが走り、自動でビルド&PyPIにアップロードまでやってくれます。

Discussion