img

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

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

Что такое 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",

"...": "..."

}

}


}

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

Ссылка
скопирована
DevOps
Скидка 25%
DevOps-инженер с нуля
Научитесь использовать инструменты и методы DevOps для автоматизации тестирования, сборки и развертывания кода, управления инфраструктурой и ускорения процесса доставки продуктов в продакшн. Станьте желанным специалистом в IT-индустрии и претендуйте на работу с высокой заработной платой.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Git Flow - это специальная система ветвления для Git. Она помогает команде лучше контролировать и добавлять различные версии про
img
Docker — популярная платформа виртуализации на уровне ОС. Она поставляет приложения в пакетах (контейнерах), которые, представля
img
Хуки в Git — это bash-скрипты, которые запускаются до или после команд Git, например, коммитов и пушей. Они позволяют автоматизи
img
  Nomad и Kubernetes – это две самые популярные платформы оркестровки, предназначенные для оркестровки динамических рабочих нагр
img
  Давайте узнаем о новом Ops-течении – GitOps! DevOps поспособствовал цифровизации многих компаний. Речь идет о командах разрабо
img
  Канареечное (canary) развёртывание – это метод разработки и развертывания программного обеспечения, который позволяет выпускат
Комментарии
ОСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59