Публикация: npm-пакет и Docker-образ

Автоматизируем выпуск: пакет в npm и образ в registry — без ручных команд.

Публикация — частный случай деплоя: артефакт собирается в CI и отправляется в реестр (npm, Docker registry), откуда его берут пользователи.

Публикация npm-пакета

Типичный сценарий: по релизному тегу собрать пакет и выложить в npm. Токен npm — секрет:

name: Publish npm
on:
  release:
    types: [published]

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "20"
          registry-url: "https://registry.npmjs.org"
      - run: npm ci
      - run: npm publish --access public
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

Ключевые детали: registry-url в setup-node настраивает .npmrc, а npm publish читает токен из переменной NODE_AUTH_TOKEN — её и заполняем из секрета.

Сборка и публикация Docker-образа

Образы удобно публиковать в GitHub Container Registry (ghcr.io) — авторизация там идёт встроенным GITHUB_TOKEN, отдельный секрет не нужен:

name: Build and push image
on:
  push:
    tags: ["v*"]

jobs:
  docker:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write          # право публиковать пакеты/образы
    steps:
      - uses: actions/checkout@v4

      - name: Login to GHCR
        run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin

      - name: Build
        run: docker build -t ghcr.io/${{ github.repository }}:${{ github.ref_name }} .

      - name: Push
        run: docker push ghcr.io/${{ github.repository }}:${{ github.ref_name }}

Разбор:

  • permissions: packages: write обязательно — без него push в registry запрещён.
  • Тег образа собираем из имени репозитория и версии: ghcr.io/owner/repo:v1.4.0.
  • Логинимся встроенным токеном — не нужно заводить отдельные креды.

Готовые экшены

Для Docker есть официальные экшены docker/login-action и docker/build-push-action, которые делают то же самое декларативно и умеют кэш слоёв. На старте достаточно понимать ручные команды выше — экшены лишь оборачивают их.

Итог

  • Публикация — деплой артефакта в реестр; запускают по релизу/тегу.
  • npm: registry-url в setup-node + токен в NODE_AUTH_TOKEN.
  • Docker в ghcr.io: логин встроенным GITHUB_TOKEN и обязательный packages: write.
Проверьте себя
1. Из какой переменной npm publish берёт токен авторизации?
ANPM_PASSWORD
BNODE_AUTH_TOKEN
CGITHUB_TOKEN
DREGISTRY_KEY
2. Что обязательно указать в permissions, чтобы запушить Docker-образ в ghcr.io?
Acontents: write
Bpackages: write
Cissues: write
Dactions: read
3. Чем удобна публикация образа именно в GitHub Container Registry (ghcr.io)?
AОна бесплатна для всех образов навсегда
BАвторизация идёт встроенным GITHUB_TOKEN, отдельный секрет с кредами не нужен
CНе требует Dockerfile
DОбразы не нужно тегировать
Поддержать проект