Простые и доступные хуки Git для проектов JS
Husky - это библиотека JS, которая упрощает обработку хуков Git на стороне клиента в проектах JS. Git hook - это скрипт, который Git выполняет до или после некоторого события (фиксации, push и т. Д.). Вы можете создать побочные эффекты в ловушке или проверить какое-либо условие, чтобы прервать текущую операцию Git. Мы используем ловушку pre-push
в наших проектах для запуска проверок работоспособности перед отправкой ветки, чтобы избежать сбоев в сборках в нашей непрерывной интеграции.
Чтобы настроить ловушку, вы добавляете соответствующий скрипт внутри .git/hooks
. В папке есть несколько *.sample
сценариев, которые помогут вам начать работу.
Однако у хуков есть проблема: каталог .git
не версируется. Делиться кастомными хуками непросто.
Введите хаски
Существует несколько подходов к решению проблемы общих хуков. Один из них использует такой инструмент, как Husky.
После установки Husky с npm install husky --save-dev
все ваши хуки Git будут настроены для вызова двоичного файла Husky. Затем вы определяете свои хуки в package.json
проекта (или в .huskyrc.js
файле).
Наша package.json
выглядит так (отредактировано для наглядности):
Каждый раз, когда мы нажимаем, мы проверяем пакет, запустив набор тестов и проанализировав код.
Такой подход имеет ряд преимуществ:
- Разделяемые и версионные хуки.
- Хуки определяются с помощью сценариев npm, как и любая другая задача в проекте.
- Хуки готовы после клонирования и установки зависимостей. Никаких лишних шагов.
- Нет необходимости знать внутреннее устройство
.git/hooks
.
Укрощение хаски
Иногда мы не хотим, чтобы наши крючки работали. Я знаю. Они предназначены для запуска каждый раз, когда мы делаем толчок, но жизнь тяжелая, и иногда мы просто не хотим этого.
Чтобы справиться с этими случаями, мы используем две переменные env: HUSKY_GIT_PARAMS
и HUSKY_GIT_STDIN
. Хуки получают параметры через командную строку и stdin
, и они сохраняются в этих переменных окружения Husky. Каждый хук получает разные данные (см. Документацию Git, чтобы узнать больше).
В нашем случае мы определяем собственный сценарий, который запускается перед ловушкой pre-push
. Если скрипт имеет код выхода 0, мы пропускаем ловушку.
Скрипт skip-husky
выглядит так:
Разобьем его на части:
- Мы можем пропустить ловушку, установив
NO_HUSKY
env var. Полезно, если мы не хотим ждать толчка. Удобно для проектов с большими чеками. CI обработает возможный сбой. Мы также используем его, когда уверены, что не сломаем сборку (обновили документацию, исправили опечатки и т. Д.). - Мы пропускаем крючок при нажатии на альтернативное начало. В нашем случае это обычно репозиторий наших клиентов с собственной средой CI. Только немногие могут продвигаться туда, и мы нажимаем только в том случае, если наш CI говорит, что мы можем это сделать. Из-за безопасности сети мы не можем автоматизировать синхронизацию.
- Мы определенно не хотим проверять код при удалении удаленных веток. Это было бы глупо.
Подводя итоги
Однажды владелец хаски сказал мне: «В списке 100 самых обучаемых пород собак хаски занимают 98-е место сверху». Это было выдуманное число, но оно действительно подчеркивало ее точку зрения. К счастью для нас, здесь речь идет о компьютерах, а не о настоящих собаках.
Хуки Git довольно полезны, но жаль, что ими нельзя делиться. Такие библиотеки, как хаски, позволяют нам это преодолеть. Husky легко настроить и настроить. Нам это нравится и мы используем в наших проектах. Если вы еще этого не сделали, вам стоит попробовать.