OK, percebi isso. É remotamente possível que esta situação se aplique a outras pessoas, por isso eu documentei isso.
Nossa infra-estrutura tem todas as conexões SSH externas em uma determinada máquina 1 . Esta não é a máquina que executa o gitlab. Isso não era óbvio porque o gitolite + gitlab funciona apesar disso. Nossos homedirs são montagens NFS e tanto a máquina SSH quanto a máquina gitlab vêem os arquivos gitolite como 'locais'. O único problema com esse gitolite 'distribuído' + gitlab é que o post-receive
hook tenta chamar redis-cli
, um binário que não existe na máquina que está executando o gancho.
Para resolver o problema, eu instalei o pacote redis-server
na máquina aceitando conexões SSH (infelizmente o binário redis-cli
não parece estar disponível separadamente). Em seguida, modifiquei a linha de redis em /home/git/.gitolite/hooks/common/post-receive
para o seguinte:
redis-cli -h hostname rpush "resque:queue:post_receive" "{\"class\":\"PostReceive\",\"args\":[\"$reponame\",\"$oldrev\",\"$newrev\",\"$ref\",\"$GL_USER\"]}" > /dev/null 2>&1
A opção -h hostname
é a única adição. Isso faz com que o comando redis rpush seja enviado para os redis na máquina correta.
O erro binário ausente não surgiu devido ao redirecionamento > /dev/null 2>&1
no script de gancho. Embora eu tenha removido durante a depuração, devo tê-lo restaurado antes de tentar acionar o gancho por meio de um git push
, que de outra forma teria ecoado no erro.
Minha suposição sobre a instalação do Gitlab, que não é padrão, acabou sendo incorreta. Esse problema teria ocorrido independentemente; é devido a uma peculiaridade de rede. De qualquer forma, espero que isso seja útil para alguém.
- No caso do git, usamos URLs externos, mesmo dentro da rede local, para que as URLs do projeto sejam consistentes, independentemente do ambiente de rede.