Если вы получаете ошибку:
Token request failed: the server refused the request for the following reasons:
* `invalid-publisher`: valid token, but no corresponding publisher
Это означает, что Trusted Publisher не настроен в PyPI или настройки не совпадают.
Сверьтесь с логами failed job. Важные claims:
| Claim | Ожидаемое значение | Что проверить |
|---|---|---|
repository |
svalench/fastapi_viewsets |
Должен совпадать с owner/repo на GitHub |
workflow_ref |
.../.github/workflows/release.yml@... |
Должен совпадать с путём к workflow |
environment |
pypi |
В release.yml задан environment pypi |
Если workflow_ref указывает на release.yml, а в PyPI настроен publish.yml — это и есть причина ошибки.
-
Войдите в PyPI:
- Перейдите на https://pypi.org/manage/account/
- Войдите в свой аккаунт
-
Перейдите в раздел Trusted Publishing:
- В меню слева выберите "Publishing" → "Trusted publishers"
- Или перейдите напрямую: https://pypi.org/manage/account/publishing/
-
Добавьте новый Trusted Publisher:
- Нажмите "Add a new pending publisher"
- Заполните форму:
- PyPI project name:
fastapi-viewsets(или ваше имя пакета) - Publisher type:
GitHub - Owner:
svalench(ваш GitHub username) - Repository name:
fastapi_viewsets(имя репозитория) - Workflow filename:
.github/workflows/release.yml⚠️ (именноrelease.yml, неpublish.yml) - Environment name:
pypi(вrelease.ymlиспользуется environmentpypi)
- PyPI project name:
-
Сохраните настройки:
- Нажмите "Add"
- Publisher будет добавлен в статус "Pending"
-
Активируйте publisher:
- Запушьте тег (например,
git push origin v1.3.0) - Workflow
release.ymlзапустится, и publisher автоматически активируется при первом успешном обмене токенами
- Запушьте тег (например,
- Workflow filename должен точно совпадать:
.github/workflows/release.yml - Repository name должен совпадать с именем репозитория на GitHub (без префикса username/)
- Owner должен совпадать с владельцем репозитория на GitHub
- Environment name обязателен: введите
pypi(оставить пустым не получится — в workflow environment задан явно)
Если Trusted Publishing настроить сейчас нет возможности, используйте API токен:
-
Создайте API токен в PyPI:
- Перейдите на https://pypi.org/manage/account/token/
- Нажмите "Add API token"
- Введите имя токена (например, "GitHub Actions")
- Выберите scope: "Entire account" или "Project: fastapi-viewsets"
- Нажмите "Add token"
- ВАЖНО: Скопируйте токен сразу (он показывается только один раз!)
-
Добавьте токен в GitHub Secrets:
- Перейдите в ваш репозиторий на GitHub
- Settings → Secrets and variables → Actions
- Нажмите "New repository secret"
- Name:
PYPI_API_TOKEN - Value: вставьте скопированный токен
- Нажмите "Add secret"
-
Переключите workflow на fallback:
- Settings → Secrets and variables → Actions → Variables
- Нажмите "New repository variable"
- Name:
USE_PYPI_TOKEN - Value:
true - Нажмите "Add variable"
Workflow
release.ymlувидитUSE_PYPI_TOKEN=trueи будет использоватьPYPI_API_TOKENвместо Trusted Publishing.
После настройки Trusted Publisher, проверьте claims:
repository:svalench/fastapi_viewsets✅repository_owner:svalench✅workflow_ref:svalench/fastapi_viewsets/.github/workflows/release.yml@refs/tags/v1.3.0✅environment:pypi✅
Эти значения должны совпадать с настройками в PyPI.