Простые и доступные хуки 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 легко настроить и настроить. Нам это нравится и мы используем в наших проектах. Если вы еще этого не сделали, вам стоит попробовать.