Как активировать хук pre-receive в GitLab?

Мне нужно проверять каждый коммит, поступающий в GitLab, и блокировать любой из них, в котором есть определенный файл. Я использовал документацию здесь

Я создал файл с именем pre-receive в каталоге .git/custom_hooks.

В файле просто содержимое:

#!/bin/sh
exit 1

Что, я считаю, должно отклонять любые попытки отправить код в репо (?)

Файл принадлежит git и является исполняемым:

ls -a дает ответ:

-rwxrwxrwx 1 git корень 550 ...

Каталог custom_hooks также является исполняемым и принадлежит пользователю git.

Но все коммиты проходят без проблем, хук фиксации, похоже, никак не активируется.

Я не вижу ничего другого в документации, что я должен делать. Я ничего не пропустил?


person Stefan    schedule 12.01.2021    source источник
comment
Здравствуйте, название вашего вопроса предполагает, что у вас есть проблема с pre-commit ловушкой, вы говорите, что установили pre-receive ловушку (которая является на стороне сервера ловушкой, срабатывающей на сервере, когда клиент выдает git push ), и ваш вопрос предполагает, что вы хотите заблокировать push-уведомления с вашего локального компьютера, что будет играть роль хука pre-push. Пожалуйста, проверьте страницу документа об хуках и уточните ваш вопрос -- в частности : можете ли вы объяснить , чего вы хотите добиться ?   -  person LeGEC    schedule 12.01.2021
comment
Привет, я хочу проверить все файлы, которые были изменены, и найти определенный. Если он присутствует, я хочу заблокировать фиксацию. Прочитав документы (один из них тот, на который вы ссылались), я подумал, что место для этого было на стороне сервера в хуке перед получением? Я ошибаюсь?   -  person Stefan    schedule 12.01.2021
comment
Хорошо, вы можете обновить свой вопрос с этой информацией? Я хочу ...   -  person LeGEC    schedule 12.01.2021


Ответы (2)


Один из способов сделать это — установить хук перед фиксацией на локальном компьютере и проверить наличие указанного файла среди промежуточных файлов:

# .git/hooks/pre-comit :

#!/bin/bash

forbidden=$(git diff --cached --diff-filter=ACMR -- forbidden/file)

if [ -n "$forbidden" ]; then
    echo "*** rejecting commit, file '$forbidden' is present" >&2
    exit 1
fi

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

Недостатки:

  • этот хук должен быть установлен один раз для каждого клона вашего репо
  • пользователь может пропустить этот хук (удалите его вручную, измените скрипт хука или запустите git commit -n, чтобы пропустить pre-commit и commit-msg хуки)

Если вам нужно быть на 100% уверенным, что этот файл не попадет в центральное хранилище, один из способов предотвратить это — установить ловушку pre-receive, но эту ловушку необходимо установить на сервере.

Вы отметили свой вопрос gitlab, вот страница документации, чтобы установить такой хук:

https://docs.gitlab.com/ee/administration/server_hooks.html

Вам необходимо получить доступ к файловой системе установки вашего gitlab (например: ssh к серверу gitlab с учетной записью администратора) и установить хук pre-receive в соответствующих проектах.

Обратите внимание: поскольку пользователь может отправить целую ветку (или даже несколько веток) за один раз, вам следует проверять наличие указанного файла во всех новых коммитах, отправленных на сервер, а не только в конце каждая ветвь.

person LeGEC    schedule 12.01.2021
comment
Спасибо. Я следил за этой документацией, но моя проблема в том, что хук не активируется. Даже если у него есть только «выход 1», фиксация все еще разрешена. - person Stefan; 13.01.2021
comment
Извините, я не смог уточнить свой смысл. Мне нужно поместить его на сервер, так как он должен быть на месте для всех инженеров, поэтому я добавил файл «pre-receive» в свой каталог custom_hooks и hooks, но ни один из них не работает :-( - person Stefan; 13.01.2021
comment
Я дам вам прочитать документ gitlab, а затем проверьте документ для вашей версии gitlab. - person LeGEC; 13.01.2021
comment
Я прочитал это. Я создаю папку custom_hooks и помещаю в нее файл с именем pre-receive. Он просто возвращает «выход 1», но фиксация разрешена. Есть ли что-то необходимое, что отсутствует в документации? Есть ли основные предположения, которые я мог упустить? - person Stefan; 13.01.2021

Поместите этот скрипт в каталог hooks вашего сервера gitlab. В каталоге hooks создайте новый каталог с именем pre-receive.d и поместите в него файл скрипта.

#!/bin/bash

# Place this script in gitlab server directory -> <path_to_your_gitlab_server_root>/hooks/pre-receive.d
# Create directory,if it does not exists -> mkdir -p <path_to_your_gitlab_server_root>/hooks/pre-receive.d

# Get input data passed along pre-receive hook
read old_sha new_sha refname

# Default separator is ' ', change to ','
IFS=","

# Use env variable GL_USERNAME to get the matching details from users csv file
# This file can be easily generated from the database that you have configured for your gitlab instance.
# It contains records in following format - <username>,<user_email>,<user_name>
IFS=', ' read -r -a validuserarray <<< `grep -i "$GL_USERNAME," /tmp/gituser.csv `
valid_user_email=${validuserarray[1]}
valid_user_name=${validuserarray[2]}

# Get the last log user details from git log
IFS=', ' read -r -a incoming_committer_array <<< `git log -1 "$new_sha" --pretty=%ce,%cn | tr '[:upper:]' '[:lower:]'`
IFS=', ' read -r -a incoming_author_array <<< `git log -1 "$new_sha" --pretty=%ae,%an | tr '[:upper:]' '[:lower:]'`

# If no match found, fail the push
if [[ ${#validuserarray[@]} < 3 ]]; then
    echo "GL-HOOK-ERR: You are not authorised to perform this action."
    exit 1
fi

# Ensure no conflict markers are there
if git diff "$old_sha" "$new_sha" | grep -qE '^\+(<<<<<<<|>>>>>>>)'; then
    echo "GL-HOOK-ERR: Code has conflict markers. Please resolve and retry."
    exit 1
fi

# Validate author email ends with domain.com
if ! [[ "${incoming_author_array[0]}" =~ ^[A-Za-z0-9.]+[@]domain\.com$ ]]; then
        echo "GL-HOOK-ERR: Author email address ${incoming_author_array[0]} is invalid."
        exit 1
fi

# Validate committer email
if [ "${valid_user_email}" != "${incoming_committer_array[0]}" ]; then
    echo "GL-HOOK-ERR: Committer email address ${incoming_committer_array[0]} is invalid."
    exit 1
fi

# Validate committer name
if [ "${valid_user_name}" != "${incoming_committer_array[1]}" ]; then
    echo "GL-HOOK-ERR: Committer name ${incoming_committer_array[1]} is invalid."
    exit 1
fi
exit 0

Для каждого пуша gitlab будет предоставлять значения — branch, old_sha, new_sha. В будущем, если у вас будет какой-либо другой вариант использования, просто поместите условные обозначения на эти значения.

person rkdove96    schedule 09.06.2021