![GitLab 接收后钩子未触发](https://linux22.com/image/597505/GitLab%20%E6%8E%A5%E6%94%B6%E5%90%8E%E9%92%A9%E5%AD%90%E6%9C%AA%E8%A7%A6%E5%8F%91.png)
如果这不是正确的 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 安装的假设被证明是错误的。无论如何都会发生此问题;这是由于网络怪癖造成的。无论如何,我希望这对某些人有用。
- 在 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
它解决了我的接收后钩子无法触发的问题。
我希望这对其他人也会有帮助。