Серверные Git хуки
Функционал доступен в Enterprise и On-premise версиях
Серверные хуки Git (не путать с системными или файловыми хуками) запускают пользовательскую логику на сервере GitFlic. Вы можете использовать их для запуска задач, связанных с Git, таких как:
- Обеспечение соблюдения определенных условий при создании коммитов
- Выполнение задач исходя из состояния репозитория.
Серверные перехватчики Git используют перехватчики pre-receive
, post-receive
и update
Git на стороне сервера.
Описание типов серверных хуков
pre-receive
Первый скрипт, который запускается при обработке push-уведомлений от клиента, — это pre-receive. Он принимает список ссылок, передаваемых со стандартного ввода. Если оно выходит ненулевым, ни один из них не принимается. Вы можете использовать этот хук, чтобы убедиться, что ни один из обновленных коммитов не использует fast-forward
, или для контроля доступа ко всем ссылкам и файлам, которые они изменяют при нажатии.
update
Скрипт update
очень похож на pre-receive
скрипт, за исключением того, что он запускается один раз для каждой обновляемой ветки. Если клиент пытается отправить сообщение в несколько веток, pre-receive
запускается только один раз, тогда как update
запускается один раз для каждой обновляемой ветки. update
принимает три аргумента: имя ссылки (ветки), SHA-1, на который указывала ссылка перед отправкой, и SHA-1, который пользователь пытается отправить. Если update
сценарий завершает работу с ненулевым значением, отклоняется только эта ссылка; другие ссылки все еще могут быть обновлены.
post-receive
Хук post-receive
запускается после завершения всего процесса и может использоваться для обновления других служб или уведомления пользователей. Он принимает те же данные, что и pre-receive
хук. Примеры включают отправку списка по электронной почте, уведомление сервера непрерывной интеграции или обновление системы отслеживания заявок — вы даже можете проанализировать сообщения коммита, чтобы узнать, нужно ли открывать, изменять или закрывать какие-либо заявки. Этот сценарий не может остановить процесс отправки, но клиент не отключится до его завершения, поэтому будьте осторожны, если попытаетесь сделать что-либо, что может занять много времени.
Пример сценария для Git-хуков
Узнайте в Панели администратора путь, по которому находится требуемый проект на сервере. Для этого перейдите в раздел проектов и откройте редактирование проекта. На вкладке “Основное” будет указан путь до этого проекта в хранилище.
В директории проекта, например, /var/tmp/gitflic/repo/c20242c3-1234-5678-90ab-49afff94c56c.git
, присутствует папка hooks. В данной папке хранятся исполняемые скрипты сценариев для ваших хуков. Файлы со скриптами необходимо называть в соответствии с их типом.
Если вы хотите создать pre-recive хук, то название его исполняемого файла будет pre-recive
Вариант pre-receive
хука с использованием bash-скриптов
#!/bin/bash
# check each branch being pushed
echo "pre-receive HOOK"
while read old_sha new_sha refname
do
if git diff "$old_sha" "$new_sha" | grep -qE '^\+(<<<<<<<|>>>>>>>)'; then
echo "Saw a conflict marker in $(basename "$refname")."
git diff "$old_sha" "$new_sha" | grep -nE '^\+(<<<<<<<|>>>>>>>)'
exit 1
fi
if git diff "$old_sha" "$new_sha" | grep -qE '^\+.*\s+$'; then
echo "Saw whitespaces at EOL."
git diff "$old_sha" "$new_sha" | grep -nE '^\+.*\s+$'
exit 1
fi
done
exit 0
Вместо Bash можно использовать любой другой скриптовый язык, но для этого необходимо указать путь до исполняемого файла в первой строке вашего скрипта. Пример использования Python для создания pre-receive
#!/usr/bin/python3
import re
import sys
print(sys.argv[0])
print(sys.argv[1],sys.argv[2])
if sys.argv[0] != sys.argv[1]: sys.exit(0)