Git hooks и Husky

Git hooks — это сценарии, которые позволяют автоматизировать различные этапы работы с репозиториями в Git. Они могут быть использованы для выполнения задач, таких как проверка качества кода, линтинг, тестирование, сборка проекта и другие действия, которые необходимо выполнить до или после выполнения определённых операций с репозиторием. Git hooks поддерживаются непосредственно в Git и могут быть настроены для различных типов событий: коммиты, пуши, мёржи и другие.

Принципы работы с Git hooks

Git hooks представляют собой скрипты, которые находятся в каталоге .git/hooks репозитория. Каждый из этих скриптов соответствует определённому событию в Git. Скрипты могут быть написаны на любом языке, поддерживающем работу с командной строкой, но чаще всего используются bash-скрипты.

Важнейшие события, для которых можно настроить хуки:

  • pre-commit: выполняется перед выполнением коммита.
  • commit-msg: используется для проверки сообщения коммита.
  • post-commit: выполняется после того, как коммит был успешно завершён.
  • pre-push: запускается перед отправкой изменений в удалённый репозиторий.
  • pre-receive, update, post-receive: хуки на стороне сервера, которые используются для проверки или модификации данных перед или после их получения сервером.

Основная цель Git hooks — это автоматизация проверок, что помогает повысить качество кода и ускорить процессы разработки.

Установка Husky

Husky — это популярный инструмент, который позволяет легко интегрировать Git hooks в процесс разработки. Он упрощает настройку и управление хуками, а также позволяет автоматизировать выполнение различных задач перед коммитом или пушем. Husky интегрируется с такими инструментами как линтеры, тесты, форматировщики кода и другие.

Чтобы начать работать с Husky, необходимо установить его в проект:

npm install husky --save-dev

После установки Husky нужно активировать:

npx husky install

Это создаст каталог .husky в корне проекта, куда будут помещаться все конфигурации для хуков. Чтобы автоматически создавать хуки после установки, нужно добавить команду активации Husky в скрипт postinstall в package.json:

"scripts": {
  "postinstall": "husky install"
}

Настройка Git hooks с использованием Husky

После установки Husky можно настроить хуки, добавляя соответствующие скрипты. Для этого используется команда husky add. Например, для настройки хука pre-commit, который будет запускать линтер перед каждым коммитом, можно использовать такую команду:

npx husky add .husky/pre-commit "npm run lint"

Этот хук будет выполнять команду npm run lint перед каждым коммитом, проверяя код на соответствие стандартам.

Для хука pre-push, который будет запускать тесты перед отправкой изменений в удалённый репозиторий, команда будет следующей:

npx husky add .husky/pre-push "npm test"

Такой хук обеспечит запуск тестов перед каждым пушем. Если тесты не проходят, пуш не будет выполнен.

Форматирование и линтинг кода с помощью Git hooks

Одним из самых распространённых применений Git hooks является автоматический линтинг и форматирование кода перед коммитом. Это позволяет избежать попадания в репозиторий неформатированного или некачественного кода.

Для интеграции линтера, например ESLint, с Husky можно использовать следующий подход:

  1. Установить ESLint:

    npm install eslint --save-dev
  2. Настроить ESLint для проекта, если это ещё не сделано:

    npx eslint --init
  3. Добавить линтинг в хук pre-commit:

    npx husky add .husky/pre-commit "npx eslint --fix"

Теперь при каждом коммите ESLint будет автоматически проверять код и исправлять его, если это возможно.

Использование Prettier для автоматического форматирования кода

Вместо того чтобы полагаться на линтинг только для проверки ошибок, можно использовать Prettier для автоматического форматирования кода перед коммитом. Prettier хорошо сочетается с линтерами, но в отличие от них, он не делает проверки кода на ошибки, а лишь исправляет его стиль.

  1. Установить Prettier:

    npm install prettier --save-dev
  2. Добавить в хук pre-commit команду для форматирования:

    npx husky add .husky/pre-commit "npx prettier --write ."

Теперь Prettier будет автоматически форматировать все файлы перед каждым коммитом.

Преимущества использования Husky

  1. Удобство интеграции: Husky позволяет легко настраивать хуки без необходимости вручную создавать скрипты для каждого события.
  2. Поддержка нескольких хуков: Husky поддерживает работу с различными типами хуков, что позволяет полностью автоматизировать процесс разработки.
  3. Интеграция с популярными инструментами: Husky хорошо работает с такими инструментами, как ESLint, Prettier, Jest, Mocha и другими, что позволяет настроить весь цикл разработки с автоматическими проверками кода.
  4. Контроль качества: С помощью Husky можно обеспечить строгие проверки кода перед его отправкой в репозиторий, что значительно улучшает качество работы команды.
  5. Простота настройки: Настройка хуков с помощью Husky не требует глубоких знаний в области Git, что позволяет разработчикам быстро внедрить нужные процессы в рабочий процесс.

Советы по использованию

  1. Не перегружайте хуки: Излишняя автоматизация может привести к тому, что коммиты и пуши будут задерживаться из-за длительных проверок. Лучше использовать только самые необходимые процессы, такие как линтинг и тесты.
  2. Используйте хуки только для обязательных проверок: Некоторые операции, такие как форматирование кода, можно выполнять вручную или через другие инструменты в рамках процесса сборки, чтобы не перегружать хуки.
  3. Управляйте зависимостями: Husky и другие инструменты могут зависеть от различных версий Node.js и npm. Убедитесь, что зависимости вашего проекта совместимы с версией Node.js, используемой в разработке.

Подключение Husky к CI/CD

Для того чтобы автоматизация с использованием Husky работала не только локально, но и на сервере, важно настроить поддержку хуков в среде CI/CD. Некоторые сервисы, такие как GitHub Actions, GitLab CI и другие, поддерживают настройку хуков и позволяют выполнять проверки кода на сервере перед сборкой или деплоем.

Для этого потребуется установить Husky и другие зависимости на сервере, настроить соответствующие скрипты и интегрировать их в пайплайны CI/CD. Это позволит обеспечить консистентность процесса разработки как на локальных машинах разработчиков, так и в процессе автоматической сборки и деплоя на сервере.

Заключение

Использование Git hooks и Husky позволяет значительно улучшить процессы разработки, повысить качество кода и упростить управление проектом. Благодаря интеграции с такими инструментами как линтеры, форматировщики кода и тесты, можно автоматизировать выполнение рутинных задач и сосредоточиться на более важных аспектах разработки.