Vue d’ensemble
OpenID Connect (OIDC) permet à vos flux de travail GitHub Actions de s’authentifier auprès d’un PyPI pour publication de packages Python.
Ce guide donne une vue d’ensemble de la configuration de PyPI pour approuver l’OIDC de GitHub comme identité fédérée et montre comment utiliser cette configuration dans l’action pypa/gh-action-pypi-publish
pour publier des packages sur PyPI (ou d’autres référentiels de packages Python) sans gestion manuelle des jetons d’API.
Prérequis
-
Pour en savoir plus sur les concepts de base décrivant la façon dont GitHub utilise OIDC (OpenID Connect) ainsi que sur son architecture et ses avantages, consultez « À propos du renforcement de la sécurité avec OpenID Connect ».
-
Avant de continuer, vous devez planifier votre stratégie de sécurité pour veiller à ce que les jetons d’accès soient uniquement alloués de manière prévisible. Pour contrôler la façon dont votre fournisseur de cloud émet des jetons d’accès, vous devez définir au moins une condition, afin que les dépôts non approuvés ne puissent pas demander de jetons d’accès à vos ressources cloud. Pour plus d’informations, consultez « À propos du renforcement de la sécurité avec OpenID Connect ».
-
Si vous suivez ce guide sur GHE.com, sachez que vous devez remplacer certaines valeurs dans la documentation suivante. Consultez « À propos du renforcement de la sécurité avec OpenID Connect ».
Ajout du fournisseur d’identité sur PyPl
Pour utiliser OIDC avec PyPI, ajoutez une configuration d’approbation qui lie chaque projet sur PyPI à chaque combinaison de référentiels et de flux de travail autorisée à le publier.
-
Connectez-vous à PyPI et accédez aux paramètres de publication approuvés pour le projet que vous voulez configurer. Pour un projet nommé
myproject
, ce sera àhttps://pypi.org/manage/project/myproject/settings/publishing/
. -
Configurez une relation d’approbation entre le projet PyPI et un référentiel GitHub (et le flux de travail dans le référentiel). Par exemple, si votre référentiel GitHub se trouve à
myorg/myproject
et votre flux de travail de mise en production est défini dansrelease.yml
avec un environnement derelease
, vous devez utiliser les paramètres suivants pour votre éditeur approuvé sur PyPI.Note
Entrez avec précaution ces valeurs. Donner à l’utilisateur, au référentiel ou au flux de travail incorrect la possibilité de publier sur votre projet PyPI équivaut à partager un jeton d’API.
- Propriétaire :
myorg
- Nom du référentiel :
myproject
- Nom du flux de travail :
release.yml
- (Facultatif) un nom d’environnement GitHub Actions :
release
- Propriétaire :
Mise à jour de votre workflow GitHub Actions
Quand votre éditeur approuvé est inscrit sur PyPI, vous pouvez mettre à jour votre flux de travail de mise en production pour utiliser la publication approuvée.
Remarque : lorsque des environnements sont utilisés dans des workflows ou dans des stratégies OIDC, nous vous recommandons d’ajouter des règles de protection à l’environnement pour plus de sécurité. Par exemple, vous pouvez configurer des règles de déploiement sur un environnement pour restreindre les branches et balises pouvant être déployées dans l’environnement ou accéder aux secrets d’environnement. Pour plus d’informations, consultez « Gestion des environnements pour le déploiement ».
L’action pypa/gh-action-pypi-publish
a un support prédéfini pour l’édition approuvée, qui peut être activée en donnant l’autorisation id-token: write
à la fonction qui la contient et en omettant username
et password
.
L’exemple suivant utilise l’action pypa/gh-action-pypi-publish
pour échanger un jeton OIDC contre un jeton d’API PyPI, qui est ensuite utilisé pour télécharger les distributions de mise en production d’un package sur 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