Пользовательский файл пост-получения с использованием GitLab
Я пытаюсь заменить свой хук после получения, автоматически сгенерированный GitLab, на новый файл, который включает поддержку почты и, следовательно, должен вызывать "пост-получение".
Это предыдущая версия моего файла:
#!/usr/bin/env bash
# This file was placed here by GitLab. It makes sure that your pushed commits
# will be processed properly.
while read oldrev newrev ref
do
# For every branch or tag that was pushed, create a Resque job in redis.
repo_path=`pwd`
env -i redis-cli rpush "resque:gitlab:queue:post_receive" "{\"class\":\"PostRe
ceive\",\"args\":[\"$repo_path\",\"$oldrev\",\"$newrev\",\"$ref\",\"$GL_USER\"]}
" > /dev/null 2>&1
done
Когда я заменяю этот файл новым, который включает в себя вышеупомянутые строки в конце файла, GitLab говорит: "Проект имеет недопустимый файл после получения" в области администратора, но электронные письма отправляются правильно.
Знаете ли вы, как справиться с этой проблемой множественной пост-получения поддержки. На данный момент я не знаю, правильно ли выполнена часть файла, относящаяся к gitlab.
Спасибо за помощь!
Обновить:
Сценарии внутри папок теперь вызываются с помощью нижеприведенного решения (запрос на извлечение). Но я не понимаю, почему стандартный скрипт "post-receive-email" не отправляет письма, если он включен в каталог. Он отлично работает, если он вызывается непосредственно после получения.
Не знаю, почему я должен изменить порядок, но у меня работает следующее (даже я не знаю, правильно ли сейчас создаются задания на восстановление:
#!/usr/bin/env bash
repo_path=`pwd`
if [ -d hooks/post-receive.secondary.d ]; then
for i in hooks/post-receive.secondary.d/*
do
[ -x "$i" ] || continue
# call the hooklet with the same arguments we got
path=$repo_path"/"$i
"$path" "$@" || {
# hooklet failed; we need to log it...
echo hooklet $i failed
perl -I$GL_BINDIR -Mgitolite -e "log_it('hooklet $i failed')"
# ...and send back some non-zero exit code ;-)
exit 1
}
done
fi
while read oldrev newrev ref
do
# For every branch or tag that was pushed, create a Resque job in redis.
env -i redis-cli rpush "resque:gitlab:queue:post_receive" "{\"class\":\"PostReceive\",\"args\":[\"$repo_path\",\"$oldrev\",\"$newrev\",\"$ref\",\"$GL_USER\"]}" > /dev/null 2>&1
done
exit 0
3 ответа
Обновление 2014, с GitLab, больше не использующим gitolite:
Как упоминает Ciro Santilli 新疆改造中心 六四事件 法轮功, в настоящее время существует официальный способ установки пользовательских хуков (GitLab 7.5.0+, ноябрь 2014 г.).
- Выберите проект, который нуждается в пользовательском git hook.
- На сервере GitLab перейдите в каталог репозитория проекта.
Для ручной установки путь обычно/home/git/repositories/<group>/<project>.git
,
Для установок Omnibus путь обычно/var/opt/gitlab/git-data/repositories/<group>/<project>.git
,- Создайте новый каталог в этом месте под названием
custom_hook
s.- Внутри нового
custom_hooks
каталог, создайте файл с именем, соответствующим типу ловушки.
Дляpre-receive
перехватить имя файла должно бытьpre-receive
без продления- Сделайте исполняемый файл ловушки и убедитесь, что он принадлежит git.
- Напишите код, чтобы сделать функцию git hook должным образом. Крючки могут быть на любом языке. Убедитесь, что "шебанг" в верхней части правильно отражает тип языка.
Например, если скрипт написан на Ruby, шебанг, вероятно, будет#!/usr/bin/env ruby
,
Оригинальный ответ (январь 2013 г.)
Это (разрешение пользовательских хуков) было решено с помощью запроса на получение 555 и фиксации 2245a6bbe во время, когда GitLab использовал хуки после обновления.
Вы должны объявить hooks/post-receive.secondary.d
в вашем git голое репо, управляемое gitolite и GitLab.
Поместите туда все свои хуки после обновления.
Вы можете изменить хук после обновления, опубликованный gitolite, следуя этой модели: он будет вызывать все ваши хуки после обновления, если они обнаружены.
Вопрос заключается в следующем:
В Gitolite V2 GitLab наконец-то передал это управление Gitolite, потому что вы можете объявить вторичные перехваты post-update.secondary, которые вызовет сам Gitolite.
В Gitolite V3 больше нет зарезервированных хуков (кроме обновления в репозитории gitolite-admin), поэтому у gitolite "вторичный" механизм.
Но GitLab (который теперь использует хук пост-получения) еще не обновил свое управление хуками, чтобы учесть эту новую реальность (из-за того, что гитолит больше не допускает вторичных хуков).
Крючки на заказ
GitLab недавно добавил функцию пользовательских перехватчиков, поскольку обычные перехватчики используются внутри: https://github.com/gitlabhq/gitlabhq/blob/667c0a909bde1cf71f21d8ec9768e98b1c489030/doc/hooks/custom_hooks.md
По сути, вы просто создаете custom_hooks
каталог в вашем голом репозитории Git и вставьте в него хуки, и GitLab обеспечит их запуск.
Другим возможным решением этой конкретной проблемы может быть:
#!/usr/bin/env bash
while read oldrev newrev ref
do
# For every branch or tag that was pushed, create a Resque job in redis.
repo_path=`pwd`
env -i redis-cli rpush "resque:gitlab:queue:post_receive" "{\"class\":\"PostReceive\",\"args\":[\"$repo_path\",\"$oldrev\",\"$newrev\",\"$ref\",\"$GL_USER\"]}" > /dev/null 2>&1
/path/to/your/hook $oldrev $newrev $ref
done
Что касается почтовых уведомлений, я предлагаю использовать этот хук электронной почты. В качестве альтернативы, вы можете использовать git-notifier и заменить /path/to/your/hook $oldrev $newrev $ref
с /path/to/git-notifier/