概要
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 上の各プロジェクトを、発行が許可されている各リポジトリとワークフローの組み合わせにリンクする信頼構成を追加します。
- 
PyPI にサインインし、構成するプロジェクトの信頼された発行元の設定に移動します。 myprojectという名前のプロジェクトの場合、これはhttps://pypi.org/manage/project/myproject/settings/publishing/で次のようになります。
- 
PyPI プロジェクトと GitHub リポジトリ (およびリポジトリ内のワークフロー) の間の信頼関係を構成します。 たとえば、GitHub リポジトリが myorg/myprojectで存在し、リリース ワークフローがreleaseの環境でrelease.ymlにおいて定義されている場合は、PyPI の信頼できる発行元に対して次の設定を使用する必要があります。メモ これらの値は慎重に入力してください。 正しくないユーザー、リポジトリ、またはワークフローに PyPI プロジェクトに発行する機能を与えることは、API トークンを共有することと同じです。 - 所有者: myorg
- リポジトリ名: myproject
- ワークフロー名: release.yml
- (任意) GitHub Actions 環境名: release
 
- 所有者: 
GitHub Actions ワークフローを更新する
信頼された発行元が PyPI に登録されたら、信頼された発行を使用するようにリリース ワークフローを更新できます。
独自のカスタム保護規則を有効にして、サードパーティ サービスを使ったデプロイを制御できます。 たとえば、Datadog、Honeycomb、ServiceNow などのサービスを使用し、GitHub への展開に対して自動承認を提供できます。
この pypa/gh-action-pypi-publish アクションには、信頼された発行元のサポートが組み込まれています。その包含ジョブに id-token: write アクセス許可を付与し、username と password を省略して有効にすることができます。
次の例では、pypa/gh-action-pypi-publish アクションを使用して、PYPI API トークンの OIDC トークンを交換します。このトークンを使用して、パッケージのリリースディストリビューションを PyPI にアップロードします。
jobs:
  release-build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - 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@v5
        with:
          name: release-dists
          path: dist/
      - name: Publish release distributions to PyPI
        uses: pypa/gh-action-pypi-publish@3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f
jobs:
  release-build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - 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@v5
        with:
          name: release-dists
          path: dist/
      - name: Publish release distributions to PyPI
        uses: pypa/gh-action-pypi-publish@3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f