Skip to main content

PyPI での OpenID Connect の構成

ワークフロー内で OpenID Connect を使用して、PyPI で認証を行います。

概要

OpenID Connect (OIDC) を使うと、GitHub Actions ワークフローが PyPI で認証し、Python パッケージを発行します。

このガイドでは、GitHubの OIDC をフェデレーション ID として信頼するように PyPI を構成する方法の概要と、手動 API トークン管理なしでパッケージを PyPI (またはその他の Python パッケージ リポジトリ) に発行するアクションで pypa/gh-action-pypi-publish この構成を使用する方法について説明します。

前提条件

  • GitHub が OpenID Connect (OIDC) を使用する方法の基本的な概念とそのアーキテクチャと利点については、「OpenID Connect を使ったセキュリティ強化について」を参照してください。

  • 先に進む前に、アクセス トークンが予測可能な方法でのみ割り当てられるようにセキュリティ戦略を計画する必要があります。 クラウド プロバイダーがアクセス トークンを発行する方法を制御するには、少なくとも 1 つの条件を定義し、信頼できないリポジトリがクラウド リソースにアクセス トークンを要求できないようにする必要があります。 詳しくは、「OpenID Connect を使ったセキュリティ強化について」を参照してください。

PyPI への ID プロバイダーの追加

PyPI で OIDC を使用するには、PyPI 上の各プロジェクトを、発行が許可されている各リポジトリとワークフローの組み合わせにリンクする信頼構成を追加します。

  1. PyPI にサインインし、構成するプロジェクトの信頼された発行元の設定に移動します。 myproject という名前のプロジェクトの場合、これは https://pypi.org/manage/project/myproject/settings/publishing/ で次のようになります。

  2. PyPI プロジェクトと GitHub リポジトリ (およびリポジトリ内のワークフロー) の間の信頼関係を構成します。 たとえば、GitHub リポジトリが myorg/myproject で存在し、リリース ワークフローが release の環境で release.yml において定義されている場合は、PyPI の信頼できる発行元に対して次の設定を使用する必要があります。

    Note

    これらの値は慎重に入力してください。 正しくないユーザー、リポジトリ、またはワークフローに PyPI プロジェクトに発行する機能を与えることは、API トークンを共有することと同じです。

    • 所有者: myorg
    • リポジトリ名: myproject
    • ワークフロー名: release.yml
    • (任意) GitHub Actions 環境名: release

GitHub Actions ワークフローを更新する

信頼された発行元が PyPI に登録されたら、信頼された発行を使用するようにリリース ワークフローを更新できます。

独自のカスタム保護規則を有効にして、サードパーティ サービスを使ったデプロイを制御できます。 たとえば、Datadog、Honeycomb、ServiceNow などのサービスを使用し、GitHub への展開に対して自動承認を提供できます。

この pypa/gh-action-pypi-publish アクションには、信頼された発行元のサポートが組み込まれています。その包含ジョブに id-token: write アクセス許可を付与し、usernamepassword を省略して有効にすることができます。

次の例では、pypa/gh-action-pypi-publish アクションを使用して、PYPI API トークンの OIDC トークンを交換します。このトークンを使用して、パッケージのリリースディストリビューションを PyPI にアップロードします。

YAML
jobs:
  release-build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: "3.x"

      - name: build release distributions
        run: |
          # NOTE: put your own distribution build steps here.
          python -m pip install build
          python -m build

      - name: upload windows dists
        uses: actions/upload-artifact@v4
        with:
          name: release-dists
          path: dist/

  pypi-publish:
    runs-on: ubuntu-latest
    needs:
      - release-build
    permissions:
      id-token: write

    steps:
      - name: Retrieve release distributions
        uses: actions/download-artifact@v4
        with:
          name: release-dists
          path: dist/

      - name: Publish release distributions to PyPI
        uses: pypa/gh-action-pypi-publish@3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f