概要
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@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@release/v1
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@release/v1