22
33## 🚀 Автоматическая публикация в PyPI через GitHub Actions
44
5+ ### 📦 Современные стандарты упаковки
6+
7+ Этот проект использует современные стандарты Python упаковки:
8+ - ** pyproject.toml** вместо setup.py
9+ - ** SPDX лицензии** вместо устаревших классификаторов
10+ - ** Современные инструменты сборки** (build, twine)
11+ - ** GitHub Actions** для автоматизации
12+
513### Как это работает
614
7151 . ** Создается git тег** с версией (например, ` v2.1.0 ` )
1523
1624### 📋 Предварительная настройка (только один раз)
1725
18- #### Шаг 1: Создание API токена PyPI
26+ #### Шаг 1: Настройка Trusted Publisher (рекомендуется)
27+
28+ ** Современный и безопасный способ:**
29+
30+ 1 . Запустите workflow в GitHub Actions (создайте тег)
31+ 2 . В логах найдите ссылку для создания Trusted Publisher
32+ 3 . Перейдите по ссылке и войдите в PyPI как владелец пакета
33+ 4 . Подтвердите настройку Trusted Publisher
34+
35+ ** Альтернативный способ - API токен (устаревший):**
1936
20371 . Зайдите на [ PyPI] ( https://pypi.org/ ) и войдите в свой аккаунт
21382 . Перейдите в ** Account settings** → ** API tokens**
22393 . Нажмите ** Add API token**
23404 . Выберите ** Entire account (all projects)**
24415 . Скопируйте созданный токен (выглядит как ` pypi-... ` )
2542
26- #### Шаг 2: Настройка GitHub Secrets
43+ #### Шаг 2: Настройка GitHub Secrets (только для API токенов)
44+
45+ ** Если используете Trusted Publisher (рекомендуется):**
46+ - Секреты не нужны! 🎉
2747
48+ ** Если используете API токен (устаревший способ):**
28491 . Перейдите в ваш GitHub репозиторий
29502 . Нажмите ** Settings** → ** Secrets and variables** → ** Actions**
30513 . Нажмите ** New repository secret**
35561 . В том же разделе ** Secrets and variables** → ** Actions**
36572 . Перейдите на вкладку ** Environments**
37583 . Нажмите ** New environment**
38- 4 . Назовите среду ` pypi `
59+ 4 . Назовите среду ` release ` (важно для Trusted Publisher!)
39605 . В разделе ** Environment protection rules** можете добавить правила (опционально)
61+ 6 . ** Рекомендуется** : Настроить правила для защиты от случайной публикации
4062
4163### 🔄 Процесс публикации новой версии
4264
@@ -121,14 +143,17 @@ git push origin v2.1.0
121143
122144### ✅ Преимущества этого подхода
123145
124- - 🔒 ** Безопасность** : API токен хранится в GitHub Secrets
146+ - 🔒 ** Безопасность** : Использует Trusted Publishers вместо API токенов
125147- 🤖 ** Автоматизация** : Не нужно вручную собирать и загружать
126- - 🆕 ** Современность** : Использует современные инструменты сборки
148+ - 🆕 ** Современность** : Использует современные инструменты сборки и аутентификации
127149- 📝 ** Аудит** : Все действия логируются в GitHub Actions
128150- 🎯 ** Контроль** : Можно настроить правила для environment
129151- 🏷️ ** Теги** : Четкая связь между git тегами и версиями PyPI
152+ - 🚀 ** Простота** : Не нужно управлять секретами и токенами
130153
131- ** ⚠️ Важное напоминание** : Каждая новая версия требует создания нового git тега. Без тега workflow не запустится!
154+ ** ⚠️ Важное напоминание** :
155+ - Каждая новая версия требует создания нового git тега. Без тега workflow не запустится!
156+ - ** Название среды должно быть ` release ` ** (не ` pypi ` ) для корректной работы с Trusted Publisher
132157
133158### 🚨 Troubleshooting
134159
@@ -139,10 +164,18 @@ git push origin v2.1.0
1391644 . Проверьте настройки в ** Settings** → ** Actions** → ** General**
1401655 . ** Помните** : workflow запускается только при создании новых тегов, не при коммитах
141166
167+ #### Если возникают предупреждения при сборке:
168+ 1 . ** Проверьте формат лицензии** в ` pyproject.toml ` - используйте простую строку ` license = "Apache-2.0" `
169+ 2 . ** Уберите устаревшие классификаторы лицензии** - они больше не нужны при использовании SPDX выражения
170+ 3 . ** Обновите setuptools** до версии >=77.0.0 для лучшей поддержки современных стандартов
171+
142172#### Если публикация в PyPI не удалась:
1431731 . Проверьте логи в GitHub Actions
144- 2 . Убедитесь, что ` PYPI_API_TOKEN ` правильно настроен
145- 3 . Проверьте, что environment ` pypi ` создан
174+ 2 . ** Для Trusted Publisher** : Убедитесь, что Trusted Publisher настроен в PyPI
175+ 3 . ** Для API токена** : Убедитесь, что ` PYPI_API_TOKEN ` правильно настроен
176+ 4 . ** Проверьте, что environment ` release ` создан** (не ` pypi ` !)
177+ 5 . ** Если используете Trusted Publisher** : Убедитесь, что workflow запущен из правильного репозитория
178+ 6 . ** Проверьте название среды** : должно быть ` release ` в Trusted Publisher
146179
147180#### Если пакет не собирается:
1481811 . Проверьте синтаксис ` pyproject.toml `
@@ -160,17 +193,35 @@ pip install build twine
160193# Собрать пакет
161194python -m build --wheel --sdist
162195
163- # Загрузить в PyPI (требует настройки ~/.pypirc)
196+ # Загрузить в PyPI
197+ # Для Trusted Publisher: используйте GitHub Actions (рекомендуется)
198+ # Для API токена: настройте ~/.pypirc или используйте --username/--password
164199python -m twine upload dist/*
165200```
166201
167202### 📚 Полезные ссылки
168203
169204- [ GitHub Actions Documentation] ( https://docs.github.com/en/actions )
170- - [ PyPI API Tokens] ( https://pypi.org/help/api-tokens/ )
205+ - [ PyPI Trusted Publishers] ( https://docs.pypi.org/trusted-publishers/ ) ⭐ ** Новое!**
206+ - [ PyPI API Tokens] ( https://pypi.org/help/api-tokens/ ) (устаревший способ)
171207- [ Python Packaging User Guide] ( https://packaging.python.org/ )
172208- [ GitHub Releases] ( https://docs.github.com/en/repositories/releasing-projects-on-github )
173209
210+ ### 🔄 Миграция с API токена на Trusted Publisher
211+
212+ Если у вас уже настроен API токен и вы хотите перейти на Trusted Publisher:
213+
214+ 1 . ** Создайте новый тег** для запуска workflow
215+ 2 . ** Настройте Trusted Publisher** по ссылке из логов
216+ 3 . ** Удалите секрет** ` PYPI_API_TOKEN ` из GitHub Secrets
217+ 4 . ** Убедитесь** , что workflow работает без предупреждений
218+
219+ ** Преимущества миграции:**
220+ - 🔒 Более безопасно (нет токенов для хранения)
221+ - 🚀 Проще в настройке
222+ - 📱 Лучшая поддержка мобильных устройств
223+ - 🆕 Соответствие современным стандартам PyPI
224+
174225---
175226
176227** Теперь ваша публикация полностью автоматизирована! 🎉**
0 commit comments