GitLab 接收后钩子未触发

GitLab 接收后钩子未触发

如果这不是正确的 stackexchange,请原谅。

我有一个 GitLab 安装。它是在几天前安装的 gitolite 之上安装的,我认为这种非标准设置是导致我出现问题的根源,但我无法确定原因。

问题很简单:post-receive 钩子没有被触发。这阻止了“项目活动”出现在 GitLab 中。问题如下:

$ git push
#...
error: cannot run hooks/post-receive: No such file or directory

钩子存在

接收后钩子/符号链接存在并且可以执行:

-rwxr-xr-x 1 git git 470 Oct  3  2012 .gitolite/hooks/common/post-receive
lrwxrwxrwx 1 git git  45 Oct  3  2012 repositories/project.git/hooks/post-receive -> /home/git/.gitolite/hooks/common/post-receive

可由 GitLab 执行

gitlab 用户可以执行该脚本(我已删除/dev/null重定向并输入空白输入以获得“OK”作为输出):

sudo su - gitlab -c /home/git/.gitolite/hooks/common/post-receive

OK

GitLab 可以找到它

GitLab 正在正确位置寻找钩子:

$ grep hooks /srv/gitlab/gitlab/config/gitlab.yml
  hooks_path: /home/git/.gitolite/hooks/

$ bundle exec rake gitlab:app:status RAILS_ENV=production
# ...
/home/git/.gitolite/hooks/common/post-receive exists? ............YES

GitLab 以正确的用户身份运行

GitLab 软件正在由 gitlab 用户运行:

$ ps U gitlab
  PID TTY      STAT   TIME COMMAND
 3650 ?        Sl     0:59 unicorn_rails master -c /srv/gitlab/gitlab/config/unicorn.rb -E production -D
 3671 ?        Sl     0:43 unicorn_rails worker[0] -c /srv/gitlab/gitlab/config/unicorn.rb -E production -D
 3674 ?        Sl     0:42 unicorn_rails worker[1] -c /srv/gitlab/gitlab/config/unicorn.rb -E production -D
# ...

环境

env -i鱼钩里的线通常被认为是一个问题。我认为会发生这种情况这个问题,但为了完整性,redis-cli发现没问题:

$ env -i redis-cli
redis>

我已经没有办法调试这个了。有人有什么建议吗?

答案1

好的,我搞明白了。这种情况也有可能发生在其他人身上,所以我记录了下来。

我们的基础架构将所有外部 SSH 连接都放在特定机器1上。这不是运行 gitlab 的机器。这并不明显,因为尽管如此,gitolite+gitlab 仍能正常工作。我们的主目录是 NFS 挂载,SSH 机器和 gitlab 机器都将 gitolite 文件视为“本地”。这种“分布式”gitolite+gitlab 的一个问题是,钩子post-receive试图调用redis-cli运行钩子的机器上不存在的二进制文件。

为了解决这个问题,我redis-server在接受 SSH 连接的机器上安装了该软件包(不幸的是,redis-cli二进制文件似乎不能单独使用)。然后我将 redis 行修改/home/git/.gitolite/hooks/common/post-receive为以下内容:

redis-cli -h hostname rpush "resque:queue:post_receive" "{\"class\":\"PostReceive\",\"args\":[\"$reponame\",\"$oldrev\",\"$newrev\",\"$ref\",\"$GL_USER\"]}" > /dev/null 2>&1

开关-h hostname是唯一的附加功能。这会导致 redis rpush 命令被发送到正确机器上的 redis。

由于钩子脚本中的重定向,丢失的二进制错误没有出现> /dev/null 2>&1。虽然我在调试期间确实删除了它,但我必须在尝试通过 触发钩子之前恢复它git push,否则就会回显错误。

我对略微不标准的 gitlab 安装的假设被证明是错误的。无论如何都会发生此问题;这是由于网络怪癖造成的。无论如何,我希望这对某些人有用。

  1. 在 git 的情况下,即使在本地网络内我们也使用外部 URL,以便无论网络环境如何,项目 URL 都是一致的。

答案2

我遇到了同样的问题,但原因不同。

我的redis安装位于/usr/local/bin。Git 用户已将其安装在其 中PATH,但没有效果。

我必须在脚本中明确说明如何从以下位置启动 redis /usr/local/bin/redis-cli

env -i /usr/local/bin/redis-cli rpush "resque:queue:post_receive" "{\"class\":\"PostReceive\",\"args\":[\"$reponame\",\"$oldrev\",\"$newrev\",\"$ref\",\"$GL_USER\"]}"  > /dev/null 2>&1

它解决了我的接收后钩子无法触发的问题。

我希望这对其他人也会有帮助。

相关内容