Назад | Перейти на главную страницу

GitLab post-receive hook не срабатывает

Приносим извинения, если это не тот стек.

У меня установлен GitLab. Он был установлен поверх установки gitolite, которая была всего несколько дней назад, и я предполагаю, что эта нестандартная установка является корнем моей проблемы, но я не могу ее определить.

Проблема проста: перехватчики после получения не запускаются. Это предотвращает появление «активности проекта» в 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 перенаправить и передать пустой ввод, чтобы получить на выходе «ОК»):

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>

У меня закончились идеи по отладке этого. Есть ли у кого-нибудь предложения?

Хорошо, разобрался с этим. Вполне возможно, что эта ситуация будет применяться к другим людям, поэтому я задокументировал это.

В нашей инфраструктуре есть все внешние SSH-соединения, которые находятся на конкретной машине.1. Это не машина, на которой запущен gitlab. Это было неочевидно, потому что, несмотря на это, гитолит + gitlab работает. Наши домашние устройства - это монтирования NFS, и как машина SSH, так и машина gitlab видят файлы 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-адреса проектов были согласованы независимо от сетевой среды.

У меня была такая же проблема, но причина была в другой.

Мой 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

Это решило мою проблему с не срабатывающим крючком после получения.

Я надеюсь, что это будет полезно и для кого-то другого.