poetryベースのプロジェクトでパッケージをPyPIに公開する一連の手続きをGitHub Actionで自動化する方法を備忘録としてまとめる。
poetryによるパッケージング
以前はソースコードをパッケージとして配布するためにsetup.py
を書く必要があったが、現在はその役割がpyproject.toml
に集約されている。poetryではpyproject.toml
をベースにプロジェクトを管理するため、パッケージの開発から公開までをスムーズに行うことができる。
ディレクトリ構成は以下のようにsrc layoutに従うとする。
.
├── README.md
├── pyproject.toml
├── src/
│ └── your_package/
└── tests/
プロジェクトの一般的なディレクトリ構成としてflat layoutとsrc layoutの2種類がある。pytestを利用する際にはsrc layoutが推奨されている(詳細はこちらのリンクを参照)。
プロジェクト情報の記述
pyproject.toml
の[tool.poetry]
にプロジェクトの情報を記述する。この情報がPyPI上のページにも反映される。
[tool.poetry]
name = "your-package-name"
version = "0.1.0"
description = "package description"
authors = ["name <email address>"]
license = "MIT"
readme = "README.md"
repository = "repository URL"
記述項目の詳細はpoetryのドキュメントを参照。
PyPIへの公開
1. 認証情報の設定
PyPIでアカウントを作成してAPIトークンを取得する。以下のコマンドでpoetryに認証情報を読み込ませる。
poetry config pypi-token.pypi <your API Token>
2. パッケージのビルド
src/
以下のコードを配布形式にビルドする。以下のコマンドを実行すると、dist/
にtar.gz
で固められたもの(source distribution)とwheel(built distribution)が生成される。
poetry build
3. PyPIへの公開
以下のコマンドでビルドしたパッケージをPyPIに公開できる。
poetry publish
GitHub Actionによる自動化
上記の一連の手続きを、GitHub上でのリリース公開をトリガーとして自動的に実行するようなワークフローを定義する。
以下のyamlファイルを.github/workflows/
に配置してリポジトリにpushする。また、こちらのリンクに従って、PyPIのAPIトークンをPYPI_TOKEN
という名前のシークレットとして登録する。
name: Publish Package
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: JRubics/poetry-publish@v2.0
with:
pypi_token: ${{ secrets.PYPI_TOKEN }}
パッケージの公開については、Marketplaceで公開されているアクションpoetry-publishを拝借した。
これによりワークフローが登録され、リリースを公開したタイミングで自動的にパッケージがPyPIへ公開されるようになる。
参考