Información general
OpenID Connect (OIDC) permite que tus flujos de trabajo GitHub Actions se autentiquen con PyPI para publicar paquetes de Python.
En esta guía se proporciona información general sobre cómo configurar PyPI para OIDC GitHub's de confianza como identidad federada y se muestra cómo usar esta configuración en la acción pypa/gh-action-pypi-publish
para publicar paquetes en PyPI (u otros repositorios de paquetes de Python) sin ninguna administración manual de tokens de API.
Requisitos previos
-
Para conocer los conceptos básicos de cómo GitHub usa OpenID Connect (OIDC) y su arquitectura y ventajas, consulta "Acerca del fortalecimiento de seguridad con OpenID Connect".
-
Antes de proceder, debes planear tu estrategia de seguridad para garantizar que los tokens de acceso solo se asignen de forma predecible. Para controlar la forma en que el proveedor de servicios en la nube emite tokens de acceso, tendrá que definir al menos una condición, para que los repositorios no confiables no puedan solicitar tokens de acceso para los recursos en la nube. Para obtener más información, vea «Acerca del fortalecimiento de seguridad con OpenID Connect».
Agregar el proveedor de identidades a AWS
Para usar OIDC con PyPI, agrega una configuración de confianza que vincule cada proyecto de PyPI a cada repositorio y combinación de flujo de trabajo que tenga permiso para publicar para él.
-
Inicia sesión en PyPI y vaya a la configuración de publicación de confianza del proyecto que deseas configurar. En el caso de un proyecto denominado
myproject
, se encontrará enhttps://pypi.org/manage/project/myproject/settings/publishing/
. -
Configura una relación de confianza entre el proyecto PyPI y un repositorio GitHub (y flujo de trabajo dentro del repositorio). Por ejemplo, si tu repositorio GitHub está en
myorg/myproject
y el flujo de trabajo de versión se define enrelease.yml
con un entorno derelease
, debes usar la siguiente configuración para el editor de confianza en PyPI.Note
Escriba estos valores con cuidado. Proporcionar al usuario, repositorio o flujo de trabajo incorrectos la capacidad de publicar en el proyecto de PyPI es equivalente a compartir un token de API.
- Propietario:
myorg
- Nombre del repositorio:
myproject
- Nombre del flujo de trabajo:
release.yml
- (Opcionalmente) un nombre de entorno GitHub Actions:
release
- Propietario:
Actualizar tu flujo de trabajo de GitHub Actions
Una vez registrado el editor de confianza en PyPI, puedes actualizar el flujo de trabajo de lanzamiento para usar la publicación de confianza.
Note
Cuando los entornos se usan en flujos de trabajo o en directivas de OIDC, se recomienda agregar reglas de protección al entorno para mayor seguridad. Por ejemplo, puedes configurar reglas de implementación en un entorno para restringir qué ramas y etiquetas se pueden implementar en el entorno o acceder a secretos del entorno. Para obtener más información, vea «Administrar entornos para la implementación».
La acción pypa/gh-action-pypi-publish
tiene compatibilidad integrada con la publicación de confianza, que se puede habilitar al conceder a su trabajo contenedor el permiso id-token: write
y omitir username
y password
.
En el ejemplo siguiente se usa la acción pypa/gh-action-pypi-publish
para intercambiar un token OIDC para un token de API de PyPI, que luego se usa para liberar las distribuciones de versión de un paquete en 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