Lefthook Как навести порядок в Git-хуках и ускорить разработку
Знакомая ситуация? Вы работаете в команде, где каждый разработчик настраивает линтеры, форматтеры и тесты по-своему. В итоге в репозиторий попадает код, который не соответствует общим стандартам, а ревью превращается в бесконечную правку стилистических ошибок. Или, что еще хуже, кто-то забыл запустить тесты, и CI/CD падает.
Git-хуки — это мощный инструмент для автоматизации проверок и действий перед коммитом, пушем или во время других событий Git. Но управлять ими вручную, особенно в больших проектах или командах, может быть настоящей головной болью. Тут на помощь приходит Lefthook — элегантное и производительное решение от команды Evil Martians, которое превращает хаос в порядок.
Что такое Lefthook и зачем он нужен?
Представьте, что у вас есть швейцарский армейский нож для ваших Git-хуков. Именно таким инструментом и является Lefthook. Это не просто обертка над стандартными хуками, а полноценный менеджер, написанный на Go, что сразу намекает на его скорость и минимальные зависимости. Он позволяет централизованно управлять всеми пред-коммит, пред-пуш и другими хуками в вашем проекте, обеспечивая единообразие и автоматизацию.
Кому это будет полезно? Да практически любой команде разработчиков!
- Фронтендерам, чтобы автоматически запускать ESLint, Prettier, Stylelint.
- Бэкендерам на Ruby, Python, Go, чтобы проверять код линтерами, запускать юнит-тесты.
- DevOps-инженерам, чтобы валидировать конфигурационные файлы или скрипты.
- Всем, кто хочет избежать "ой, я забыл запустить линтер" или "у меня на машине работает, а на CI нет".
Lefthook берет на себя рутину, позволяя вам сосредоточиться на написании кода, а не на его форматировании или поиске забытых ошибок.
Ключевые возможности, которые меняют игру
Lefthook не просто запускает команды. Он делает это умно, быстро и гибко. Давайте посмотрим на несколько фич, которые выделяют его среди других решений.
1. Скорость — залог продуктивности
Одна из самых раздражающих вещей в хуках — это их медлительность. Ждать по несколько секунд или даже минут, пока прогонятся все линтеры и тесты, прежде чем сделать коммит, — то еще удовольствие. Lefthook решает эту проблему благодаря двум вещам:
- Написан на Go: Это означает высокую производительность и минимальное потребление ресурсов.
- Параллельное выполнение: Вы можете настроить хуки так, чтобы они запускались одновременно, а не последовательно.
Представьте: у вас есть линтер для JS, линтер для CSS и тесты. Зачем ждать, пока один завершится, чтобы начать другой? Lefthook позволяет указать в lefthook.yml:
pre-push:
parallel: true
jobs:
- name: lint frontend
run: yarn eslint {staged_files}
- name: stylelint frontend
run: yarn stylelint {staged_files}
- name: run tests
run: yarn test
И все эти задачи полетят одновременно! Это значительно сокращает время ожидания и делает процесс коммита или пуша гораздо приятнее.
2. Гибкое управление файлами и фильтрация
Часто нам нужно запускать команды только для определенных файлов или исключать некоторые из них. Lefthook предоставляет мощные механизмы для этого:
- Различные списки файлов: Вы можете работать только с
staged_files(файлы в стейджинге),all_files(все файлы в репозитории) или дажеgit diff --name-only HEAD @{push}(файлы, которые будут отправлены при пуше). - Glob и Regexp фильтры: Нужно запустить Rubocop только для Ruby-файлов, но исключить миграции? Легко!
pre-commit:
jobs:
- name: lint backend
glob: "*.rb" # glob-фильтр для Ruby-файлов
exclude:
- "db/migrate/*.rb" # исключаем миграции
run: bundle exec rubocop --force-exclusion {all_files}
- name: lint frontend
files: git diff --name-only HEAD @{push} # берем файлы из последнего пуша
glob: "*.{js,jsx,ts,tsx}" # только JS/TS файлы
run: yarn eslint {files}
Такая детализация позволяет создавать очень точные и эффективные хуки, которые не тратят время на проверку ненужных файлов.
3. Поддержка Docker и выполнение скриптов
Работаете в Docker-контейнерах? Lefthook не оставит вас в беде. Вы можете запускать команды прямо внутри вашего контейнера, что гарантирует идентичность окружения для всех разработчиков и CI/CD.
pre-commit:
jobs:
- script: "good_job.js" # Можно запускать внешние скрипты
runner: docker run -it --rm <container_id_or_name> {cmd} # Запускаем через Docker
А если одной команды в строке недостаточно, можно указать путь к скрипту, который будет выполнен. Это дает огромную свободу для реализации сложной логики.
4. Локальные конфиги и теги для командной работы
В больших командах или монорепозиториях часто возникает потребность в гибкой настройке хуков. Например, фронтенд-разработчику не нужны все бэкенд-проверки, и наоборот. Lefthook предлагает элегантное решение:
- Теги: Вы можете помечать задачи тегами (
frontend,backend,security). - Локальные конфиги (
lefthook-local.yml): Каждый разработчик может создать файлlefthook-local.yml, чтобы переопределить или пропустить определенные хуки или теги.
# lefthook.yml (общий конфиг)
pre-push:
jobs:
- name: audit packages
tags:
- frontend
- linters
run: yarn lint
- name: audit gems
tags:
- backend
- security
run: bundle audit
# lefthook-local.yml (локальный конфиг фронтендера)
pre-push:
exclude_tags:
- backend # Пропускаем все бэкенд-проверки
jobs:
- name: audit packages
skip: true # Пропускаем конкретную задачу
Это позволяет командам сохранять общий стандарт, но при этом давать разработчикам возможность адаптировать процесс под свои нужды, не затрагивая основной конфиг.
Установка и начало работы
Начать работать с Lefthook удивительно просто, благодаря его бинарной природе и отсутствию зависимостей.
-
Установка: Выберите удобный для вас способ:
- Go:
go install github.com/evilmartians/lefthook/v2@v2.0.12 - NPM:
npm install lefthook --save-dev - Ruby:
gem install lefthook - Python:
pipx install lefthook - Или через Homebrew, apt, winget и другие пакетные менеджеры.
- Go:
-
Конфигурация: Создайте файл
lefthook.ymlв корне вашего проекта и опишите свои хуки.# lefthook.yml pre-commit: commands: eslint: run: yarn eslint {staged_files} prettier: run: yarn prettier --write {staged_files} -
Установка хуков: Выполните команду в терминале:
lefthook installLefthook создаст необходимые файлы в
.git/hooks, которые будут ссылаться на его бинарник. -
Наслаждайтесь: Теперь при каждом
git commitилиgit pushваши хуки будут автоматически запускаться.
Выводы: Стоит ли Lefthook вашего внимания?
Однозначно да! Если вы ищете способ:
- Улучшить качество кода в вашей команде.
- Автоматизировать рутинные проверки и форматирование.
- Ускорить циклы разработки, сократив время ожидания хуков.
- Обеспечить единообразие окружения для всех разработчиков.
- Получить гибкий и мощный инструмент, который легко интегрируется в любой проект.
Lefthook — это зрелое, хорошо документированное и активно развивающееся решение. Его простота в установке, высокая производительность и богатый набор функций делают его одним из лучших менеджеров Git-хуков на сегодняшний день. Попробуйте, и вы, скорее всего, забудете о других инструментах для этой задачи. Evil Martians в очередной раз показали, как можно сделать сложную вещь простой и эффективной.
P.S. Не забудьте заглянуть в официальную документацию Lefthook, там вы найдете еще больше примеров и продвинутых настроек.
