はじめに
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ブランチにプッシュするだけで、自動的にビルド・テスト・公開が行われます。
コメント