Пакет semantic-release
— это удобный способ автоматизировать части процесса выпуска вашего пакета NPM.
Он может автоматически
- опубликуйте свой пакет NPM, применяя семантическое управление версиями на основе формата ваших сообщений фиксации
- создать тег Git и релиз GitHub
Я создал пакет semantic-release-example
, чтобы проиллюстрировать, как реализовать пакет semantic-release
в существующем пакете NPM.
Важно отметить, что для пакета semantic-release
требуется Node 8 или выше.
Начальный пакет
Пакет semantic-release-example
пытается максимально имитировать структуру типичного пакета Javascript — в нем есть тесты (ну, тест), даже пара функций (гм, я думаю ровно две), linting, использует babel
и создает Travis CI.
Когда я впервые опубликовал semantic-release-example
в NPM (до внедрения semantic-release
), версия была 1.0.0
.
Переход на семантический релиз
Настройка семантического выпуска
- Создал новую ветку
implement-semantic-release
Git - Глобально установлен пакет
semantic-release-cli
NPM. - Запустите команду
semantic-release-cli setup
в окне терминала. - Ввел данные аутентификации GitHub и Travis CI как часть инструкций по установке.
- После успешного выполнения команды
semantic-release-cli setup
я заметил, что в моемpackage.json
появилось три новых обновления: поле версии было перезаписано (изменилось с1.0.0
на0.0.0-development
), вdevDependencies
был добавлен пакетsemantic-release
, а также был добавлен скриптsemantic-release
. Мой файл.travis.yml
был перезаписан, чтобы включить недавно добавленный сценарийsemantic-release
как часть шагаafter_success
. - Были также обновления для моей среды сборки Travis. Были добавлены две переменные среды,
GH_TOKEN
иNPM_TOKEN
. Это мои личные токены доступа к GitHub и NPM.
Настройка линтинга сообщений фиксации
Важным аспектом semantic-release
является то, что он использует формат сообщений фиксации для определения значения следующей версии (при необходимости).
Из коробки, semantic-release
следует Соглашению о сообщениях фиксации Angular и применяет следующие семантические правила управления версиями, учитывая формат сообщения фиксации.
// Patch Releasefix(pencil): stop graphite breaking when too much pressure applied
// Minor Releasefeat(pencil): add 'graphiteWidth' option
// Major Releaseperf(pencil): remove graphiteWidth option BREAKING CHANGE: The graphiteWidth option has been removed. The default graphite width of 10mm is always used for performance reasons.
Я думаю, важно отметить, что в соответствии с соглашением о сообщениях фиксации Angular любое сообщение фиксации, не соответствующее ни одному из этих четырех форматов, не приведет к обновлению версии NPM.
- Для простоты я придерживался соглашения о сообщениях коммитов Angular при реализации линтинга сообщений коммитов.
- Решил использовать
commitlint
, потому что он имеет относительно простой в использовании интерфейс командной строки и простой способ реализации перехватчиков сообщения фиксации Git с использованиемhusky
. - Установил свой новый
devDependencies
(`npm i -D @commitlint/cli @commitlint/config-angular @commitlint/prompt-cli husky` для ленивых) - Добавлено
"commitmsg": “commitlint -e $GIT_PARAMS"
к моемуscripts
в моем файлеpackage.json
.husky
сопоставляет скриптcommitmsg
сcommit-msg
Git hook. - Добавил
"semantic-commit": "commit"
к моемуscripts
. Это вызоветcommitlint
CLI. - Добавлен файл
commitlint.config.js
, который настраиваетcommitlint
на использование соглашения о сообщениях коммитов Angular при линтинге, а также при форматировании сообщений коммитов с помощью инструмента CLI (подробнее об этом позже).
Неправильно отформатированный Commit Fail Linting
Полезный интерфейс командной строки для фиксации
Создание PR
- Подтолкнул мою ветку
implement-semantic-release
- Создал пиар
- Сборка Travis PR не выполнила успешно команду
semantic-release
как часть шагаafter_success
, поскольку распознала, что текущая сборка была запущена PR.
Слияние PR и вырезание нового релиза
- Слил PR
- На этот раз сборка Travis удачно выполнила команду
semantic-release
, так как распознала, что ветка сборки былаmaster
(это ветка выпуска по умолчанию) и что сборка не была запущена PR. - Версия пакета NPM увеличилась до второстепенной версии, поскольку сообщение фиксации было
feat(semantic-release): Implementing semantic-release automation
. - Тег Git и релиз GitHub созданы
Последние мысли
Опять же, пакет semantic-release-example
является очень простым примером — он не реализует настраиваемое соглашение о сообщениях фиксации и даже не запускает сборку разных версий Node в Travis.
При этом я надеюсь, что он все же смог проиллюстрировать некоторые полезные возможности автоматизации semantic-release
.