見出し画像

GitHub Actions CI/CDを使ってPyPIに自動アップロード

はじめに

GitHub Actions CI/CDを利用すると、GitHubでのイベント発生をトリガーに、一連のコマンドを自動実行できます。これを活用して、Pythonパッケージをビルドし、PyPIに自動公開するワークフローを構築できます。


こちらの記事もおすすめ


事前準備

  • PyPIのアカウントを作成しておく

  • プロジェクトのGitHubリポジトリを用意する

PyPIへの信頼できる公開の設定

PyPIへの信頼できる公開(Trusted Publishing)を設定するには:

  1. PyPIのアカウント設定ページで、新しいプロジェクトを登録

  2. 信頼できる公開者(トラステッドパブリッシャー)を設定

    • GitHubリポジトリのオーナー名、リポジトリ名、ワークフロー名を指定

    • GitHub環境名(例: `pypi`)を指定

ワークフロー定義ファイルの作成

GitHub Actionsのワークフローは、リポジトリの `.github/workflows` ディレクトリ内のYAMLファイルで定義します。

  1. リポジトリのルートディレクトリに`.github/workflows`ディレクトリを作成します。

  2. `.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ブランチで発生する

  • プッシュされたコミットにタグが付けられている

ワークフローの説明

  1. `on`: ワークフローのトリガーを定義します。

    • `push`イベントをトリガーとし、`main`ブランチとすべてのタグを対象とします。

  2. `jobs`: ワークフローのジョブを定義します。

    • `publish`ジョブを定義し、Ubuntu環境で実行します。

    • `environment`セクションで、使用するPyPI環境(`pypi`)とパッケージが公開されるPyPIプロジェクトのURLを指定します。

    • `permissions`セクションで、信頼された公開(Trusted Publishing)に必要な`id-token`の書き込み権限を付与します。

    • `steps`セクションで、以下のステップを定義します:

      1. リポジトリをチェックアウトします。

      2. Pythonの環境をセットアップします。

      3. 依存関係をインストールします。

      4. `build`を使用してパッケージをビルドします。

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

この記事が気に入ったらサポートをしてみませんか?