Skip to content

ci: add release workflow with PyPI Trusted Publishing#5

Merged
svalench merged 1 commit into
masterfrom
ci/release-pypi-action
Apr 25, 2026
Merged

ci: add release workflow with PyPI Trusted Publishing#5
svalench merged 1 commit into
masterfrom
ci/release-pypi-action

Conversation

@svalench
Copy link
Copy Markdown
Owner

Что меняем

Добавляем единый workflow .github/workflows/release.yml для публикации релизов в PyPI и GitHub Releases по push тега.

Refs #4.

Триггеры

  • push тега вида vX.Y.Z или X.Y.Z (с поддержкой pre-release-суффиксов: 1.2.0rc1, 1.2.0a1, 1.2.0b2).
  • workflow_dispatch с обязательным version и опциональным publish_to_pypi.

Структура pipeline

  1. build

    • Резолвит версию из тега или input.
    • Сверяет project.version в pyproject.toml с целевой версией (фейлит сборку при рассинхроне).
    • python -m build → sdist + wheel.
    • twine check --strict dist/*.
    • Smoke-install wheel в чистом venv и import fastapi_viewsets.
    • Загружает dist/ как artifact python-package-distributions.
  2. github-release (только для push тега)

    • Создаёт/обновляет GitHub Release с тем же тегом.
    • Подтягивает release notes из RELEASE_<version>.md (если есть), иначе из RELEASE_NOTES.md, иначе авто-генерация.
    • Прикрепляет sdist + wheel.
    • Помечает prerelease: true для версий с a/b/rc.
  3. pypi-publish

    • По умолчанию — Trusted Publishing (OIDC, id-token: write) через pypa/gh-action-pypi-publish@release/v1.
    • Fallback — если в репозитории задана переменная USE_PYPI_TOKEN=true, используется secret PYPI_API_TOKEN.
    • Использует environment: pypi — после первого релиза в этом окружении можно включить required reviewers / branch protection.

Что нужно сделать перед первым релизом

Один из двух путей (см. TRUSTED_PUBLISHER_SETUP.md):

A. Trusted Publisher (рекомендуется):

  • На PyPI добавить pending publisher: project fastapi-viewsets, owner svalench, repo fastapi_viewsets, workflow release.yml, environment pypi.

B. API-токен:

  • Добавить repo variable USE_PYPI_TOKEN=true в Settings → Variables → Actions.
  • Добавить repo secret PYPI_API_TOKEN.

После мерджа достаточно запушить тег 1.2.0:

git tag -a 1.2.0 -m "Release 1.2.0"
git push origin 1.2.0

…и весь pipeline отработает автоматически.

Соотношение со старыми workflow

Старые publish.yml и publish-manual.yml оставлены без изменений — их можно удалить отдельным PR после успешного релиза 1.2.0 через новый workflow, чтобы избежать двойной публикации.

Чек-лист

  • YAML валиден
  • concurrency группа предотвращает параллельные запуски на одном теге
  • Версия в pyproject.toml сверяется с тегом
  • Smoke-import после сборки
  • Артефакты прикрепляются к GitHub Release
  • OIDC + token fallback

Pipeline triggered on push of a vX.Y.Z (or X.Y.Z) tag and via
workflow_dispatch. Builds sdist+wheel, validates with twine check
--strict, smoke-imports the wheel in a clean venv, creates a GitHub
Release with the artifacts attached, and publishes to PyPI via
Trusted Publishing (OIDC) with a PYPI_API_TOKEN fallback gated by the
USE_PYPI_TOKEN repo variable.

Refs #4
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 25, 2026

Welcome to Codecov 🎉

Once you merge this PR into your default branch, you're all set! Codecov will compare coverage reports and display results in all future pull requests.

ℹ️ You can also turn on project coverage checks and project coverage reporting on Pull Request comment

Thanks for integrating Codecov - We've got you covered ☂️

@svalench svalench merged commit 7c0148f into master Apr 25, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant