22
33## 🚀 Автоматическая публикация в PyPI через GitHub Actions
44
5- ### 📦 Современные стандарты упаковки
6-
7- Этот проект использует современные стандарты Python упаковки:
8- - ** pyproject.toml** вместо setup.py
9- - ** SPDX лицензии** вместо устаревших классификаторов
10- - ** Современные инструменты сборки** (build, twine)
11- - ** GitHub Actions** для автоматизации
12-
135### Как это работает
146
1571 . ** Создается git тег** с версией (например, ` v2.1.0 ` )
2315
2416### 📋 Предварительная настройка (только один раз)
2517
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 токен (устаревший):**
18+ #### Шаг 1: Создание API токена PyPI
3619
37201 . Зайдите на [ PyPI] ( https://pypi.org/ ) и войдите в свой аккаунт
38212 . Перейдите в ** Account settings** → ** API tokens**
39223 . Нажмите ** Add API token**
40234 . Выберите ** Entire account (all projects)**
41245 . Скопируйте созданный токен (выглядит как ` pypi-... ` )
4225
43- #### Шаг 2: Настройка GitHub Secrets (только для API токенов)
44-
45- ** Если используете Trusted Publisher (рекомендуется):**
46- - Секреты не нужны! 🎉
26+ #### Шаг 2: Настройка GitHub Secrets
4727
48- ** Если используете API токен (устаревший способ):**
49281 . Перейдите в ваш GitHub репозиторий
50292 . Нажмите ** Settings** → ** Secrets and variables** → ** Actions**
51303 . Нажмите ** New repository secret**
56351 . В том же разделе ** Secrets and variables** → ** Actions**
57362 . Перейдите на вкладку ** Environments**
58373 . Нажмите ** New environment**
59- 4 . Назовите среду ` release ` (важно для Trusted Publisher!)
38+ 4 . Назовите среду ` pypi `
60395 . В разделе ** Environment protection rules** можете добавить правила (опционально)
61- 6 . ** Рекомендуется** : Настроить правила для защиты от случайной публикации
62- 7 . ** Важно** : Убедитесь, что среда ` release ` доступна для workflow
63-
64- #### Шаг 4: Проверка разрешений в workflow
65-
66- Убедитесь, что в файле ` .github/workflows/publish.yml ` есть разрешения для OpenID Connect:
67-
68- ``` yaml
69- permissions :
70- id-token : write # Необходимо для Trusted Publisher (OpenID Connect)
71- contents : read # Необходимо для чтения кода репозитория
72- ` ` `
73-
74- **Важно**:
75- - Без ` id-token: write` Trusted Publisher не будет работать!
76- - Разрешения должны быть на уровне workflow (не только на уровне job)
77- - Это критически важно для OpenID Connect аутентификации
7840
7941### 🔄 Процесс публикации новой версии
8042
@@ -159,18 +121,14 @@ git push origin v2.1.0
159121
160122### ✅ Преимущества этого подхода
161123
162- - 🔒 **Безопасность** : Использует Trusted Publishers вместо API токенов
124+ - 🔒 ** Безопасность** : API токен хранится в GitHub Secrets
163125- 🤖 ** Автоматизация** : Не нужно вручную собирать и загружать
164- - 🆕 **Современность** : Использует современные инструменты сборки и аутентификации
126+ - 🆕 ** Современность** : Использует современные инструменты сборки
165127- 📝 ** Аудит** : Все действия логируются в GitHub Actions
166128- 🎯 ** Контроль** : Можно настроить правила для environment
167129- 🏷️ ** Теги** : Четкая связь между git тегами и версиями PyPI
168- - 🚀 **Простота** : Не нужно управлять секретами и токенами
169130
170- **⚠️ Важное напоминание**:
171- - Каждая новая версия требует создания нового git тега. Без тега workflow не запустится!
172- - **Название среды должно быть `release`** (не `pypi`) для корректной работы с Trusted Publisher
173- - **Workflow должен иметь разрешения** `id-token: write` для работы с Trusted Publisher
131+ ** ⚠️ Важное напоминание** : Каждая новая версия требует создания нового git тега. Без тега workflow не запустится!
174132
175133### 🚨 Troubleshooting
176134
@@ -181,19 +139,10 @@ git push origin v2.1.0
1811394 . Проверьте настройки в ** Settings** → ** Actions** → ** General**
1821405 . ** Помните** : workflow запускается только при создании новых тегов, не при коммитах
183141
184- # ### Если возникают предупреждения при сборке:
185- 1. **Проверьте формат лицензии** в `pyproject.toml` - используйте простую строку `license = "Apache-2.0"`
186- 2. **Уберите устаревшие классификаторы лицензии** - они больше не нужны при использовании SPDX выражения
187- 3. **Обновите setuptools** до версии >=77.0.0 для лучшей поддержки современных стандартов
188-
189142#### Если публикация в PyPI не удалась:
1901431 . Проверьте логи в GitHub Actions
191- 2. **Для Trusted Publisher** : Убедитесь, что Trusted Publisher настроен в PyPI
192- 3. **Для API токена** : Убедитесь, что `PYPI_API_TOKEN` правильно настроен
193- 4. **Проверьте, что environment `release` создан** (не `pypi`!)
194- 5. **Если используете Trusted Publisher** : Убедитесь, что workflow запущен из правильного репозитория
195- 6. **Проверьте название среды** : должно быть `release` в Trusted Publisher
196- 7. **Проверьте разрешения OpenID Connect** : в workflow должно быть `permissions: id-token: write`
144+ 2 . Убедитесь, что ` PYPI_API_TOKEN ` правильно настроен
145+ 3 . Проверьте, что environment ` pypi ` создан
197146
198147#### Если пакет не собирается:
1991481 . Проверьте синтаксис ` pyproject.toml `
@@ -211,35 +160,17 @@ pip install build twine
211160# Собрать пакет
212161python -m build --wheel --sdist
213162
214- # Загрузить в PyPI
215- # Для Trusted Publisher: используйте GitHub Actions (рекомендуется)
216- # Для API токена: настройте ~/.pypirc или используйте --username/--password
163+ # Загрузить в PyPI (требует настройки ~/.pypirc)
217164python -m twine upload dist/*
218165```
219166
220167### 📚 Полезные ссылки
221168
222169- [ GitHub Actions Documentation] ( https://docs.github.com/en/actions )
223- - [PyPI Trusted Publishers](https://docs.pypi.org/trusted-publishers/) ⭐ **Новое!**
224- - [PyPI API Tokens](https://pypi.org/help/api-tokens/) (устаревший способ)
170+ - [ PyPI API Tokens] ( https://pypi.org/help/api-tokens/ )
225171- [ Python Packaging User Guide] ( https://packaging.python.org/ )
226172- [ GitHub Releases] ( https://docs.github.com/en/repositories/releasing-projects-on-github )
227173
228- # ## 🔄 Миграция с API токена на Trusted Publisher
229-
230- Если у вас уже настроен API токен и вы хотите перейти на Trusted Publisher :
231-
232- 1. **Создайте новый тег** для запуска workflow
233- 2. **Настройте Trusted Publisher** по ссылке из логов
234- 3. **Удалите секрет** `PYPI_API_TOKEN` из GitHub Secrets
235- 4. **Убедитесь**, что workflow работает без предупреждений
236-
237- **Преимущества миграции:**
238- - 🔒 Более безопасно (нет токенов для хранения)
239- - 🚀 Проще в настройке
240- - 📱 Лучшая поддержка мобильных устройств
241- - 🆕 Соответствие современным стандартам PyPI
242-
243174---
244175
245176** Теперь ваша публикация полностью автоматизирована! 🎉**
0 commit comments