Автоматическая публикация пакета в npm

5 min read

В этой статье я расскажу, как настроить публикацию обновлений npm-пакета при изменении кода в репозитории. Для этого воспользуемся сервисом непрерывной интеграции Semaphore.

Предположим, что вы уже умеете пользоваться командой npm publish и знаете, что такое Continuous Integration. Если нет, то можете ознакомиться с парой наших заметок:

  1. Публикация пакета в npm
  2. Разбираемся с Continuous Integration

CI позволяет запускать тесты или выполнять любые другие команды при обновлении кода в проекте. А ещё с его помощью можно настроить развертывание новой версии кода на сервере автоматически или вручную.

Получаем токен доступа к NPM

Чтобы система Semaphore могла публиковать пакеты от вашего имени, необходимо получить ключ доступа. Сделать это можно в настройках профиля на npmjs.com.

Нажмите на «Create New Token» и создайте токен с правами полного доступа. 

Оставьте вкладку открытой. Этот токен потребуется чуть позже.

Настройка окружения

Создайте проект на Semaphore и подключите репозиторий, если вы ещё не сделали этого. В настройках проекта перейдите во вкладку «Build Settings», выберите окружение и добавьте команды для подготовки к работе в разделе «Setup».

Если ваш проект содержит тесты, то добавьте команды для сборки проекта и их выполнения ниже в отдельной задаче «Parallel job». 

Если тесты будут успешно пройдены, то проект станет доступным для развертывания. Теперь нужно настроить профиль npm в окружении. Откройте вкладку «Configuration Files» и создайте новый файл .npmrc со следующим содержимым.

//registry.npmjs.org/:_authToken=${NPM_TOKEN}

Для завершения настройки окружения остается только создать переменную NPM_TOKEN в соседней вкладке «Environment Variables». Вставьте в поле «Content» токен доступа, полученный ранее.

Настройка развертывания

На странице проекта нажмите на кнопку «Set Up Deployment».

Выберите пункт «Generic Deployment».

Выберите стратегию развертывания «Automatic», чтобы публикация новой версии пакета происходила автоматически при обновлении основной ветки проекта.

«Manual» можно использовать тогда, когда нужно опубликовать код из любой другой ветки или делать это не при каждом коммите. 

Затем выберите ветку, успешные сборки которой будут запускать процесс публикации.

Теперь задайте набор команд, которые должен будет выполнить сервер для сборки проекта и его публикации. Все эти команды будут выполнены после настройки окружения, которую мы описали выше. Если какая-то из команд выдаст ошибку при выполнении, то процесс прекратится, и будет отображена ошибка.

Пропускаем шаг ввода ssh-ключа, потому что вам, скорее всего, не требуется развертывание на каком-либо сервере.

Остается задать имя этому способу развертывания. Пусть будет «npm».

После создания сценария сразу будет предложено развернуть последнее обновление выбранной ветки. Можно этого не делать и снова вернуться на страницу проекта.

Теперь на главной странице отображается состояние и веток, и серверов.

Теперь при новом коммите в ветку master, Semaphore сам выполнит проверку состояния проекта и опубликует новую версию.

Можно получить информацию по каждой команде конкретного развертывания, нажав на бейдж «Deployed» или «Failed».

Cвежая версия пакета будет публиковаться в npm автоматически. Не забывайте пользоваться командой npm version для того, чтобы правильно поднимать версию проекта.

Настройка оповещений в Telegram или Slack

Мы настроили отправку уведомлений после публикации новой версии пакета в рабочий чат. Скрипт развертывания стал выглядеть так. 

# Сборка и публикация пакета yarn yarn build yarn publish --access=public # Переменная с закодированным эмодзи 📦 EMOJI_PACKAGE=$'\xf0\x9f\x93\xa6' # Имя пакета и его версия из package.json PACKAGE_NAME=$(node -p "require('./package.json').name") PACKAGE_VERSION=$(node -p "require('./package.json').version") # Сообщение, которое будет отправлено в чат MESSAGE="$EMOJI_PACKAGE $PACKAGE_NAME $PACKAGE_VERSION was published" # POST запрос на вебхук с сообщением curl -X POST $CODEX_BOT_WEBHOOK -d "message=$MESSAGE"

Вместо «картонной коробки» в сообщении можно закодировать и использовать любые другие эмодзи.

Вебхук для уведомлений задаем в переменной CODEX_BOT_WEBHOOK в настройках проекта. Получить адрес для отправки уведомлений можно в приложении Webhooks для @codex_bot.

Теперь при успешной публикации будет приходить уведомление в чат.

Заключение

Вы можете больше не беспокоиться о том, что кто-то забудет опубликовать обновление npm-пакета — Semaphore сделает это сам.