LoginSignup
1
1

GitHub ActionでPythonパッケージのPyPI公開を自動化する

Posted at

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へ公開されるようになる。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1