Как использовать Git Hooks для автоматизации коммитов

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

icon strelka icons icons

узнай больше на курсе

DevOps-инженер с нуля
Освой Linux, Docker, Kubernetes и CI/CD и собери свой пайплайн: 4 месяца онлайн, практика и сертификат. Смотри программу и тарифы.
Подробнее о курсе
Полный курс по сетевым технологиям
Разберись в TCP/IP, коммутации и маршрутизации с нуля: 2 месяца онлайн, лабы и сертификат. Открой программу и выбери свой тариф.
Подробнее о курсе
Python программист с нуля
Напиши первый код и собери проекты на Python: 4 месяца онлайн в своём темпе, практика и сертификат. Смотри программу и тарифы.
Подробнее о курсе

Что такое Git Hooks?

Итак, Git-хуки идут со специальным именем, в папке:

.git/hooks/

Git будет автоматически вызывать эти функции при выполнении определенных задач, что позволит вам «подключиться» к рабочему процессу Git и изменить его с помощью собственного кода.

Репозитории Git инициализируются с несколькими примерами; чтобы применить их, достаточно откомментировать расширение. Это означает, что у вас будет только один скрипт на один хук. Поэтому если вы хотите выполнять несколько действий, вам нужно будет объединить их или делегировать другим скриптам.

Для чего же их можно использовать? Ну, любая задача, которую может выполнить bash-скрипт, будет работать. Два распространенных варианта использования - автоматическое тестирование и применение фильтров/чеков к исходящим коммитам.

Тесты — важная часть любого рабочего процесса. Хотя Git-хуки абсолютно не заменяют правильного конвейера непрерывной интеграции/непрерывного развертывания (CI/CD), который будет запускать тесты перед проверкой и развертыванием, их локальный запуск поможет вам отловить сбои до того, как они выйдут в свет.

Аналогичным образом, проверка содержимого коммитов для предотвращения распространения нежелательного кода может быть очень полезной, хотя для этого нужно быть достаточно умным, чтобы поймать проблему до того, как она станет проблемой. Если вы часто используете отладочный код, который никогда не должен быть зафиксирован, вы можете проверить это и предотвратить.

Существует множество крючков Git, о которых вы можете прочитать в документации Git'а, но наиболее полезными из них являются:

  • pre-commit, post-commit
  • pre-push
  • post-checkout
  • commit-msg

Каждый хук будет принимать аргументы для скрипта, к которым вы можете получить доступ с помощью:

$1

,

$2

и так далее. 

Совместное использование Git Hooks

Git-хуки предназначены только для локального репозитория и не передаются в удаленный. Вы можете установить любые Git-хуки, какие захотите, не затрагивая своих коллег, так что вы можете, например, создать локальную среду тестирования, которая будет зависеть от настроек вашего компьютера при каждом коммите, без каких-либо проблем.

Если же вы хотите поделиться Git-хуками со своей командой, вы можете создать для них новую папку, которая будет отслеживаться в Git, например:

.githooks

и установить в конфигурации значение:

core.hooksPath
git config core.hooksPath .githooks

Как и хуки по умолчанию, эта конфигурация зависит от репозитория, поэтому вашей команде также нужно будет установить это значение.

Как использовать Git Hooks

Как и большинство методов автоматизации, использование Git-хуков во многом зависит от вас и рабочего процесса вашего репозитория, но есть несколько распространенных вариантов использования.

Если вы хотите проверить содержимое коммитов, вы можете использовать git diff для отображения межстрочной разницы, а затем grep для поиска совпадений. В данном случае он блокирует все использование функции Debug.Log, завершая работу с ненулевым кодом:

if test $(git diff --cached | grep -E "Debug.Log(" | wc -l) != 0 then


exit 1



fi

Или вы можете проверить фактическое сообщение о фиксации. Пример pre-push использует аналогичный тест, но вместо него проверяет вывод git rev-list. Он проверяет коммиты, помеченные как незавершённые работы (WIP), и отказывается их проталкивать.

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

В любом случае это просто: запустите свою тестовую команду, получите статус выхода последней команды и выбросите ошибку, если она не выполнилась. В этом примере запускаются тесты для приложения .NET:

#!/bin/sh





exec dotnet test "./UnitTests/UnitTests.csproj" --filter "Category!=Integration"


if [ $? -ne 0 ]; then


echo "Tests must pass before commit!"


exit 1


fi

Есть несколько инструментов, которые помогут в этом; Husky легко запустит тесты NodeJS с настройкой конфигурации в package.json, которая будет применяться и ко всем вашим товарищам по команде.

{


"husky": {
"hooks": {
"pre-commit": "npm test",

"pre-push": "npm test",

"...": "..."

}

}


}

Однако это не замена реальным тестам в авторитетном репозитории. Есть сценарии, в которых ваши локальные тесты могут пройти, но удаленные тесты будут неудачными, а именно в случаях, когда вы не ставите все изменения на поток.

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
icon strelka icons icons

узнай больше на курсе

DevOps-инженер с нуля
Освой Linux, Docker, Kubernetes и CI/CD и собери свой пайплайн: 4 месяца онлайн, практика и сертификат. Смотри программу и тарифы.
Подробнее о курсе
Полный курс по сетевым технологиям
Разберись в TCP/IP, коммутации и маршрутизации с нуля: 2 месяца онлайн, лабы и сертификат. Открой программу и выбери свой тариф.
Подробнее о курсе
Python программист с нуля
Напиши первый код и собери проекты на Python: 4 месяца онлайн в своём темпе, практика и сертификат. Смотри программу и тарифы.
Подробнее о курсе
Онлайн-курс по кибербезопасности
Научись защищать сети и данные и разбирать атаки: 2 месяца онлайн, практика в лабах и сертификат. Открой программу и тарифы.
Подробнее о курсе
Java-разработчик с нуля
Освой Java, ООП и Spring и собери первые проекты: 4 месяца онлайн, практика с проверкой и сертификат. Смотри программу и тарифы.
Подробнее о курсе
Этичный хакинг
Освой пентест: разведка, поиск уязвимостей и отчёты для заказчика. 4 месяца онлайн, практика и сертификат. Смотри программу.
Подробнее о курсе
Еще по теме:
10 крутых AI промптов для быстрого решения проблем Kubernetes, CI/CD, Terraform и мониторинга
Наверняка ты постоянно слышишь про микросервисы. Микросервисы то, микросервисы сё, переписали все на микросервисы, развернули микросервисы в контейнерах. А че это вообще такое? Ща все объясним.
О том, как создать локальную DevOps-лабораторию с Docker, Kubernetes, Vagrant, Ansible и Terraform на обычном ноутбуке без затрат, смс, и прочего.
Git Flow - это специальная система ветвления для Git. Она помогает команде лучше контролировать и добавлять различные версии проекта. В статье рассказываем, как ее использовать.
Мы рассмотрим несколько простых способов, с помощью которых вы можете управлять и отслеживать логи для своих контейнеров.
ОСЕННИЕ СКИДКИ
30%
40%
50%
До конца акции: 30 дней 24 : 59 : 59