使用GitLab自定义收发后文件

时间:2013-01-14 11:16:58

标签: git gitlab

我正在尝试替换我的后接收挂钩,由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

3 个答案:

答案 0 :(得分:5)

2014年更新,GitLab 使用gitolite:

mentioned below Ciro Santilli setup custom hooks (GitLab 7.5.0 +,2014年11月)。

  
      
  1. 选择需要自定义git hook的项目。
  2.   
  3. 在GitLab服务器上,导航到项目的存储库目录   对于手动安装,路径通常为/home/git/repositories/<group>/<project>.git   对于Omnibus安装,路径通常为/var/opt/gitlab/git-data/repositories/<group>/<project>.git
  4.   
  5. 在此位置创建名为custom_hook s。
  6. 的新目录   
  7. 在新的custom_hooks目录中,创建一个名称与钩子类型匹配的文件   对于pre-receive挂钩,文件名应为pre-receive,不带扩展名。
  8.   
  9. 使钩子文件可执行,并确保它由git拥有。
  10.   
  11. 编写代码以使git钩子函数按预期方式运行。钩子可以是任何语言。确保顶部的“shebang”正确反映语言类型   例如,如果脚本在Ruby中,则shebang可能是#!/usr/bin/env ruby
  12.   

原始答案(2013年1月)

在GitLab使用更新后挂钩的时候,pull request 555commit 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/