使用GitLab定制后收到文件(Custom post-receive file using Git

2019-07-18 04:42发布

我试图取代我的后收到钩,自动生成一个新文件,这使得邮件的支持,因而具有通过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特定部分被正确执行的。

感谢帮助!

更新:

在文件夹内的脚本是通过使用后述的溶液(拉请求)现在调用。 但我不明白为什么标准“后收到的电子邮件”,如果它被包含在目录-script不发送任何邮件。 如果是直接调用的,因为它工作正常后领取。

不知道为什么我要改变顺序,但对我来说,以下工作(甚至我不知道现在是正确创建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

Answer 1:

更新到2014年,与使用gitolite了GitLab:

正如下面提到的西罗桑蒂利 ,现在有一个正式的方式设置自定义的钩子 (GitLab 7.5.0+ 11月2014)。

  1. 挑选需要自定义的Git挂钩的项目。
  2. 在GitLab服务器,浏览到该项目的库目录。
    对于手动安装的路径通常是/home/git/repositories/<group>/<project>.git
    对于总括安装路径通常是/var/opt/gitlab/git-data/repositories/<group>/<project>.git
  3. 建立在这个位置称为一个新的目录custom_hook秒。
  4. 里面的新custom_hooks目录中创建相匹配的钩型名称的文件。
    对于pre-receive钩的文件名应该是pre-receive不带扩展名。
  5. 使钩可执行文件,并确保它是由混帐拥有。
  6. 编写代码,以使git的钩子函数如预期。 钩子可以在任何语言。 确保在顶部的“家当”正确反映了语言类型。
    例如,如果脚本是用Ruby的家当很可能会#!/usr/bin/env ruby

原来的答案(2013年1月)

这(允许自定义挂钩)已经解决了与拉请求555和提交2245a6bbe ,在那里GitLab使用更新后钩的时间。

你需要声明一个hooks/post-receive.secondary.d由gitolite和GitLab管理您的git回购裸露。
把你的所有更新后钩在那里。

你可以通过修改发布gitolite的post-update挂钩下面这个模型 :如果检测到它会打电话给你的所有更新后挂钩。


问题是:

随着Gitolite V2,GitLab终于委派管理层对Gitolite,因为你可以声明后update.secondary挂钩 ,即Gitolite本身会打电话。

与Gitolite V3,不再有任何保留钩 (更新一个在gitolite管理员回购旁边),所以没有gitolite“次要”的机制。
但GitLab(现在使用后收到钩),还没有更新其挂钩的管理考虑到新的现实(gitolite的不允许再二次钩)帐户。



Answer 2:

自定义挂钩

GitLab最近增加了一个自定义的钩子功能,因为正规挂钩的内部使用: https://github.com/gitlabhq/gitlabhq/blob/667c0a909bde1cf71f21d8ec9768e98b1c489030/doc/hooks/custom_hooks.md

基本上,你只需创建一个custom_hooks在你裸露的Git回购目录,并把钩子在里面,GitLab确保他们获得运行。



Answer 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

至于邮件通知而言,我建议使用这个电子邮件挂钩。 另外,您也可以使用混帐通知并更换/path/to/your/hook $oldrev $newrev $ref/path/to/git-notifier/



文章来源: Custom post-receive file using GitLab
标签: git gitlab