我正在尝试替换我的后接收挂钩,由GitLab自动生成一个新文件,该文件启用邮件支持,因此必须触发“post post”。
这是我文件的先前版本:
#!/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说:“管理区域中的项目包含无效的收件后文件”,但电子邮件已正确发送。
您知道如何处理多个post-receive支持的问题。目前我不知道文件的gitlab特定部分是否正确执行。
感谢您的帮助!
现在使用下面提到的解决方案(拉取请求)调用文件夹中的脚本。但我不明白为什么标准的“post-receive-email”-script如果包含在目录中则不发送任何邮件。如果直接作为post-receive调用它,它可以正常工作。
不知道为什么我必须更改订单,但以下内容适用于我(即使我不知道现在是否正确创建了resque作业:
#!/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
答案 0 :(得分:5)
2014年更新,GitLab 不使用gitolite:
mentioned below Ciro Santilli, setup custom hooks (GitLab 7.5.0 +,2014年11月)。
- 选择需要自定义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钩子函数按预期方式运行。钩子可以是任何语言。确保顶部的“shebang”正确反映语言类型 例如,如果脚本在Ruby中,则shebang可能是
醇>#!/usr/bin/env ruby
。
原始答案(2013年1月)
在GitLab使用更新后挂钩的时候,pull request 555和commit 2245a6bbe解决了这个问题(允许自定义挂钩)。
您需要在由gitolite和GitLab管理的git bare repo中声明hooks/post-receive.secondary.d
。
将所有更新后的挂钩放在那里。
您可以修改gitolite following that model发布的更新后挂钩:如果检测到,它将调用所有更新后挂钩。
问题是:
使用Gitolite V2,GitLab最终将管理委托给Gitolite,因为你可以{Gttolite本身打电话给declare post-update.secondary hooks。
With Gitolite V3, there is no longer any reserved hook(在gitolite-admin repo的更新旁边),因此没有gitolite“辅助”机制。
但GitLab(现在使用post-receive hook)尚未更新其钩子管理,以考虑新的现实(gitolite不再允许二次钩子)。
答案 1 :(得分:5)
自定义挂钩
GitLab最近添加了一个自定义钩子功能,因为常规钩子在内部使用:https://github.com/gitlabhq/gitlabhq/blob/667c0a909bde1cf71f21d8ec9768e98b1c489030/doc/hooks/custom_hooks.md
基本上,你只需在你的Git仓库中创建一个custom_hooks
目录并将钩子放入其中,然后GitLab确保它们运行。
答案 2 :(得分:3)
此特定问题的另一种可能解决方案可能是:
#!/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
就邮件通知而言,我建议使用this电子邮件挂钩。
或者,您可以使用git-notifier并将/path/to/your/hook $oldrev $newrev $ref
替换为/path/to/git-notifier/