Серверные Git хуки

Серверные хуки 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-reseive хука с использованием 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)