개요
OIDC(OpenID Connect)를 사용하면 Actions 워크플로우에서 PyPI로 인증하여 Python 패키지를 게시할 수 있습니다.
이 가이드에서는 의 OIDC를 페더레이션 ID로 신뢰하도록 PyPI를 구성하는 방법에 대한 개요를 제공하고, 이 구성을 사용하여 pypa/gh-action-pypi-publish
수동 API 토큰 관리 없이 PyPI(또는 다른 Python 패키지 리포지토리)에 패키지를 게시하는 방법을 설명합니다.
필수 조건
가 OIDC(OpenID Connect)를 사용하는 방법과 아키텍처 및 이점에 대한 기본 개념을 알아보려면 OpenID Connect를 사용한 보안 강화 정보을(를) 참조하세요.
계속하기 전에 액세스 토큰이 예측 가능한 방식으로만 할당되도록 보안 전략을 계획해야 합니다. 클라우드 공급자가 액세스 토큰을 발급하는 방법을 제어하려면 신뢰할 수 없는 리포지토리가 클라우드 리소스에 대한 액세스 토큰을 요청할 수 없도록 하나 이상의 조건을 정의해야 합니다. 자세한 내용은 OpenID Connect를 사용한 보안 강화 정보을(를) 참조하세요.
PyPI에 ID 공급자 추가하기
PyPI에서 OIDC를 사용하려면 PyPI의 각 프로젝트를 게시가 허용된 각 리포지토리 및 워크플로 조합에 연결하는 신뢰 구성을 추가하세요.
PyPI에 로그인하고 구성하려는 프로젝트의 신뢰할 수 있는 게시 설정으로 이동합니다. 이름이
myproject
인 프로젝트의 경우https://pypi.org/manage/project/myproject/settings/publishing/
에 있습니다.PyPI 프로젝트와 리포지토리(및 리포지토리 내의 워크플로) 간의 신뢰 관계를 구성합니다. 예를 들어 리포지토리가
myorg/myproject
이고 릴리스 워크플로우가release.yml
에 정의되어 있고 환경이release
인 경우 PyPI에서 신뢰할 수 있는 퍼블리셔에 대해 다음 설정을 사용해야 합니다.참고 항목
이 값을 신중하게 입력하세요. 잘못된 사용자, 리포지토리 또는 워크플로우에 PyPI 프로젝트에 게시할 수 있는 권한을 부여하는 것은 API 토큰을 공유하는 것과 같습니다.
- 소유자:
myorg
- 리포지토리 이름:
myproject
- 워크플로 이름:
release.yml
- (선택 사항) Actions 환경 이름:
release
- 소유자:
Actions 워크플로 업데이트
신뢰할 수 있는 퍼블리셔가 PyPI에 등록되면 릴리스 워크플로를 업데이트하여 신뢰할 수 있는 퍼블리싱을 사용할 수 있습니다.
참고 항목
워크플로 또는 OIDC 정책에서 환경을 사용하는 경우 추가 보안을 위해 환경에 보호 규칙을 추가하는 것이 좋습니다. 예를 들어 환경에 배포할 수 있는 분기 및 태그를 제한하거나 환경 비밀에 액세스하도록 환경에 대한 배포 규칙을 구성할 수 있습니다. 자세한 내용은 배포 환경 관리을(를) 참조하세요.
이 pypa/gh-action-pypi-publish
작업은 신뢰할 수 있는 게시에 대한 기본 제공 지원을 제공합니다. 이 작업은 포함된 작업에 id-token: write
사용 권한을 부여하고 생략 username
하고 password
생략하여 사용하도록 설정할 수 있습니다.
다음 예제에서는 pypa/gh-action-pypi-publish
작업을 사용하여 OIDC 토큰을 PyPI API 토큰으로 교환한 다음, PyPI API 토큰을 사용하여 패키지의 릴리스 배포를 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@3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f
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