Публикация в npm
Два способа публикации
Рекомендуемый способ — Trusted Publishing через OIDC. npm-токен оставлен для сравнения. Подготовка версии и проверки пакета одинаковы при обоих способах авторизации:
- release-please готовит release PR с версиями и CHANGELOG.
- Bun устанавливает зависимости, проверяет и собирает пакет.
- npm CLI получает права одним из способов ниже и публикует подготовленный архив.
Авторизация подтверждает право публикации; качество архива проверяется отдельно.
Это сравниваемый подход, а не установленная история старого CI CDD. В исходниках подтверждены ручные release:* с bun publish у React и OpenAPI.
- Владелец создаёт granular token в npm и сохраняет его в GitHub Secrets как
NPM_TOKEN. Обычная repository variable для этого не подходит. - Нужный шаг job получает токен в env
NODE_AUTH_TOKEN, откуда npm CLI читает секрет через настройку registry. - Одного env недостаточно: конфигурация
.npmrcдолжна содержать ссылку на переменную, а не значение секрета:
//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}Компактный фрагмент публикации одного уже выпущенного пакета. Checkout, установка, проверки и сборка через Bun выполняются до показанного шага; Node.js и npm CLI уже установлены. packages/react — пример рабочего каталога с публикуемым package.json и собранным dist, а не запуск публикации из корня монорепозитория. setup-node с registry-url создаёт npm-конфигурацию, читающую NODE_AUTH_TOKEN.
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
# Checkout и подготовка пакета через Bun опущены.
- uses: actions/setup-node@v6
with:
node-version: '24'
registry-url: 'https://registry.npmjs.org'
package-manager-cache: false
- run: npm publish --access public
working-directory: packages/react
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}Общие ограничения и права
Уточнение на 2026-10-17: поддерживаются granular tokens; classic/automation tokens удалены. Для этого примера нужны права пакета/scoped packages Read and write (publish and stage) и допустимый политиками Bypass 2FA; stage-only не разрешает npm publish. npm объявил прекращение прямой публикации granular-токенами в январе 2027 года. Это контекст сравнения, не рекомендация внедрять такой CI. Правила npm access tokens.
Workflow с другим filename или repo не совпадёт с этим доверием и не получит npm-права. Не передаём постоянный npm-секрет в env или .npmrc публикации. repository.url пакета должен совпадать с GitHub-репозиторием. Новую конфигурацию надо подтвердить первым успешным выпуском за два дня, иначе её пересоздают; это срок первичной проверки, а не каждого релиза. npm Trusted Publishing, проверено 2026-10-17.
GitHub-авторизация release-please остаётся отдельной: для создания PR и GitHub Releases нужны соответствующие GitHub-права (pull-requests: write, contents: write). Их не заменяет id-token: write; права в показанном publish job относятся только к его работе.
Сравнение
| Критерий | npm-токен | Trusted Publishing |
|---|---|---|
| Источник полномочий | Права npm-пользователя и ограничения granular token | GitHub выдаёт identity; npm проверяет доверие и выдаёт права |
| Хранение npm-секрета | GitHub Secrets → env NODE_AUTH_TOKEN → npm CLI через registry auth | Постоянный npm-секрет не нужен |
| Срок полномочий | До истечения или отзыва токена | Краткоживущие права на публикацию |
| Отзыв и обслуживание | Отозвать токен в npm, обновлять секрет при ротации | Удалить доверие в npm; при смене repo/workflow пересоздать настройку |
| Настройка пакета/workflow | Права на нужные пакеты/скоупы, режим прямой публикации, Secrets и .npmrc | Trusted Publisher каждого пакета: точные owner/repo/filename, environment при использовании, Allow npm publish |
| Ограничения runner/CLI | Нет требования OIDC runner; прямой режим granular tokens прекращается в январе 2027 | GitHub-hosted runner, Node.js ≥ 22.14.0, npm CLI ≥ 11.5.1, id-token: write |
OIDC удостоверяет workflow. Совместимость кода, качество архива и право менять сам workflow проверяются отдельно: успешная авторизация не доказывает работу React/Zustand. Версии npm-правил в сравнении — по официальным источникам выше на 2026-10-17.