Обзор
OpenID Connect (OIDC) позволяет вашим рабочим процессам GitHub Actions аутентифицироваться с помощью PyPI публиковать Python пакеты.
Это руководство даёт обзор того, как настроить PyPI так, чтобы он доверял OIDC GitHub как федеративную идентичность, а также демонстрирует, как использовать эту конфигурацию в действии pypa/gh-action-pypi-publish для публикации пакетов в PyPI (или другие репозитории Python пакетов) без ручного управления токенами API.
Необходимые компоненты
-
Основные понятия о том, как GitHub использует OpenID Connect (OIDC) и его архитектуру и преимущества, см. в разделе OpenID Connect.
-
Прежде чем продолжить, необходимо спланировать стратегию безопасности, чтобы обеспечить выдачу маркеров доступа только предсказуемым способом. Чтобы управлять тем, как поставщик облачных служб выдает маркеры доступа, необходимо определить по крайней мере одно условие, запретив недоверенным репозиториям запрашивать маркеры доступа к облачным ресурсам. Дополнительные сведения см. в разделе OpenID Connect.
-
Если вы используете это руководство по GHE.com, понять, что необходимо заменить определенные значения в следующей документации. См . раздел AUTOTITLE.
Добавление поставщика удостоверений в PyPI
Чтобы использовать OIDC с PyPI, добавьте конфигурацию доверия, которая связывает каждый проект в PyPI с каждым репозиторием и сочетанием рабочих процессов, которые могут публиковаться для него.
-
Войдите в PyPI и перейдите к параметрам доверенной публикации для проекта, который вы хотите настроить. Для проекта с именем
myprojectэто будет вhttps://pypi.org/manage/project/myproject/settings/publishing/. -
Настройте отношение доверия между проектом PyPI и репозиторием GitHub (и рабочим процессом в репозитории). Например, если репозиторий GitHub находится
myorg/myprojectи рабочий процесс выпуска определен вrelease.ymlсредеrelease, следует использовать следующие параметры для доверенного издателя в PyPI.Примечание.
Внимательно введите эти значения. Предоставление неправильному пользователю, репозиторию или рабочему процессу возможности публикации в проекте PyPI эквивалентно совместному использованию маркера API.
- Владелец:
myorg - Имя репозитория:
myproject - Имя рабочего процесса:
release.yml - (Необязательно) имя среды GitHub Actions :
release
- Владелец:
Обновление рабочего процесса GitHub Actions
После регистрации доверенного издателя в PyPI можно обновить рабочий процесс выпуска, чтобы использовать надежную публикацию.
Примечание.
Если среды используются в рабочих процессах или политиках OIDC, рекомендуется добавить правила защиты в среду для дополнительной безопасности. Например, можно настроить правила развертывания в среде, чтобы ограничить, какие ветви и теги могут развертываться в среде или получить доступ к секретам среды. Дополнительные сведения см. в разделе Управление средами для развертывания.
Действие pypa/gh-action-pypi-publish имеет встроенную поддержку надежной публикации, которая может быть включена, предоставив ему id-token: write разрешение и опущению и опущениюusername.password
В следующем примере используется pypa/gh-action-pypi-publish действие для обмена маркером OIDC для маркера API PyPI, который затем используется для отправки дистрибутивов выпуска пакета в PyPI.
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.
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
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.
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