GitHub Actions CI/CDを使ってPyPIに自動アップロード
はじめに
GitHub Actions CI/CDを利用すると、GitHubでのイベント発生をトリガーに、一連のコマンドを自動実行できます。これを活用して、Pythonパッケージをビルドし、PyPIに自動公開するワークフローを構築できます。
こちらの記事もおすすめ
事前準備
PyPIのアカウントを作成しておく
プロジェクトのGitHubリポジトリを用意する
PyPIへの信頼できる公開の設定
PyPIへの信頼できる公開(Trusted Publishing)を設定するには:
PyPIのアカウント設定ページで、新しいプロジェクトを登録
信頼できる公開者(トラステッドパブリッシャー)を設定
GitHubリポジトリのオーナー名、リポジトリ名、ワークフロー名を指定
GitHub環境名(例: `pypi`)を指定
ワークフロー定義ファイルの作成
GitHub Actionsのワークフローは、リポジトリの `.github/workflows` ディレクトリ内のYAMLファイルで定義します。
リポジトリのルートディレクトリに`.github/workflows`ディレクトリを作成します。
`.github/workflows`ディレクトリ内に`publish-to-pypi.yml`ファイルを作成し、以下の内容を記述:
name: Publish Python Package
on:
push:
branches:
- main
tags:
- '*'
jobs:
publish:
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/p/sourcesage
permissions:
id-token: write
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install build
- name: Build package
run: python -m build
- name: Publish package
uses: pypa/gh-action-pypi-publish@release/v1
with:
skip-existing: true
この設定では、以下の条件が満たされたときにワークフローが起動します:
プッシュイベントがmainブランチで発生する
プッシュされたコミットにタグが付けられている
ワークフローの説明
`on`: ワークフローのトリガーを定義します。
`push`イベントをトリガーとし、`main`ブランチとすべてのタグを対象とします。
`jobs`: ワークフローのジョブを定義します。
`publish`ジョブを定義し、Ubuntu環境で実行します。
`environment`セクションで、使用するPyPI環境(`pypi`)とパッケージが公開されるPyPIプロジェクトのURLを指定します。
`permissions`セクションで、信頼された公開(Trusted Publishing)に必要な`id-token`の書き込み権限を付与します。
`steps`セクションで、以下のステップを定義します:
リポジトリをチェックアウトします。
Pythonの環境をセットアップします。
依存関係をインストールします。
`build`を使用してパッケージをビルドします。
`pypa/gh-action-pypi-publish`アクションを使用してパッケージをPyPIに公開します。
自動化の実行
上記のワークフロー定義を含むコミットをプッシュし、mainブランチにタグを付与すると、GitHub Actions上でワークフローが実行されます。
ワークフローが正常に完了すると、PyPIにパッケージが公開されます。
まとめ
本記事では、GitHub Actions CI/CDを使ってPythonパッケージをPyPIに自動公開する方法を解説しました。
PyPIの信頼できる公開設定
ワークフロー定義ファイルの作成
対象のブランチ・タグの指定方法
ジョブの定義とアクション活用
適切なワークフローを構築し、mainブランチでタグ付けされたコミットに対して自動的にパッケージの公開を行うことで、開発の効率化が図れます。
補足: パッケージのビルドとテスト
パッケージのビルドとテストは、以下のコマンドで行うことができます。
ビルド
python setup.py sdist bdist_wheel
テスト(TestPyPIへの公開)
twine upload --repository pypitest dist/*
本番(PyPIへの公開)
twine upload --repository pypi dist/*
ただし、本記事で解説したGitHub Actionsを用いた自動化により、これらの手動でのビルドや公開は不要になります。タグ付きのコミットをmainブランチにプッシュするだけで、自動的にビルド・テスト・公開が行われます。