PyPIパッケージのリリースもバージョニングもGitHub単独で完結させる
リリースもバージョン上げもシンプルに
PyPIパッケージをリリースする際の面倒な作業を、GitHubだけ触れば完了できるようにします。
具体的には、GitHub上でバージョンタグをつけてリリースすれば、自動でバージョン情報を含めてPyPIにリリースされるよう設定します。
リリースできる環境をローカルに用意せずに済みますし、バージョンを上げるたびにsetup.py
やsetup.cfg
を書き換える必要もなくなります。
以下の作業をする前に、まずsetup.py
やsetup.cfg
にversion
引数があるなら消しておきましょう。
setuptools_scm
で自動バージョン付け
setuptools_scmはPyPAが提供するパッケージで、gitコミットのタグからバージョン情報を受け取り、ビルド時に設定してくれます。
本記事ではこのパッケージを使用します。
……といっても開発環境にインストールする必要はありません。
pyproject.toml
を次のように設定しましょう。
[build-system]
requires = ["setuptools>=45", "wheel", "setuptools_scm[toml]>=6.0"]
これだけでビルド環境にsetuptools_scm
が必要であることを伝えられます。
加えて、プログラム内でバージョン情報にアクセスする必要がある場合は、以下のセクションを追加します。
[tool.setuptools_scm]
write_to = "{パッケージ名}/_version.py"
write_to
で指定したファイルが作成され、バージョン情報が埋め込まれます。
# 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時点)と紹介されていますし、基本この手法で良いと思います。
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です。
以上のステップが上手く行っていれば、GitHubでリリースするたびにActionが走り、自動でビルド&PyPIにアップロードまでやってくれます。
Discussion