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