6

我正在尝试用一个启用邮件支持的新文件替换我的 post-receive 钩子,它由 GitLab 自动生成,因此必须触发“post-receive”。

这是我的文件的以前版本:

#!/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”脚本如果包含在目录中就不会发送任何邮件。如果直接作为 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
4

3 回答 3

6

2014 年更新,GitLab不再使用 gitolite:

正如Ciro Santilli下面提到的,现在有一种设置自定义钩子的官方方法(GitLab 7.5.0+,2014 年 11 月)。

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

原始答案(2013 年 1 月)

这(允许自定义挂钩)已通过拉取请求 555提交 2245a6bbe解决,当时 GitLab 正在使用更新后挂钩。

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

您可以按照该模型修改 gitolite发布的更新后挂钩:如果检测到,它将调用您的所有更新后挂钩。


问题是:

在 Gitolite V2 中,GitLab 最终将管理权委托给了 Gitolite,因为您可以声明Gitolite 本身会调用的 post-update.secondary 挂钩。

在 Gitolite V3 中,不再有任何保留的钩子(除了 gitolite-admin repo 中的更新钩子),因此没有 gitolite “辅助”机制。
但是 GitLab(现在使用接收后挂钩)尚未更新其挂钩管理以考虑新的现实(gitolite 不再允许二级挂钩)。

于 2013-01-14T11:33:00.943 回答
5

自定义挂钩

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

基本上,您只需在裸 Git 存储库中创建一个custom_hooks目录并将钩子放入其中,GitLab 会确保它们运行。

于 2014-12-17T07:59:46.367 回答
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

就邮件通知而言,我建议使用电子邮件挂钩。或者,您可以使用git-notifier并替换/path/to/your/hook $oldrev $newrev $ref/path/to/git-notifier/

于 2013-02-11T13:00:39.037 回答