Gitlab预接收挂钩拒绝SSH推送

时间:2018-05-18 22:06:44

标签: git ssh gitlab ubuntu-16.04 githooks

当前安装:
服务器:Ubuntu Server 16.04
Gitlab版本:10.7.3
Gitlab Workhorse:4.1.0
Gitlab应用程序目录:/ opt / gitlab(应用程序驻留在这里)
Gitlab数据目录:/ drive2 / repositories(repos创建并存储在此处)

上下文:
我把一个工作的Gitlab安装打包在一起,data-dir指向一个单独的分区用于备份,因为数据连续性是一个很酷的主意,对吧?通过gitlab Web界面创建的存储库按预期存储在data-dir中。 SSL是好的和花花公子,所以我可以使用HTTPS来克隆这些回购。此外,我能够使用HTTPS推送到这些回购,没有任何错误 我还建立了SSH密钥并授权git用户(由omnibus gitlab安装创建)来验证这些密钥。我已经验证我可以成功通过SSH隧道连接到服务器作为git用户,并具有正确的权限来写入和读取存储repos的data-dir。这就是奇怪的地方:

错误:
我可以使用以下命令成功使用SSH从服务器克隆repo:

git clone git@some_domain.com:user/repo_name.git

冷却。在此之前,我对服务器的失望比我父母对我的要少。所以我继续,创建一个新的文件添加到repo,提交(不像我的女朋友,总是拖她的脚),最后PUSH到远程起源。在这里,我的世界在星期一早上工作之前就像我的动机一样崩溃了:

git push -u origin master
*** Edited Out: Push Stats
remote: GitLab: The project you were looking for could not be found.
To some_domain.com:user/repo_name.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 
'git@some_domain.com:user/repo_name.git'

我在gitlab服务器上打开repo的目录,导航到hooks文件夹,该文件夹包含一个符号链接,返回到包含预接收挂钩文件的gitlab app目录。这里预接收挂钩文件的内容:

#!/opt/gitlab/embedded/bin/ruby --disable-gems
# Fix the PATH so that gitlab-shell can find git-upload-pack and friends.
ENV['PATH'] = '/opt/gitlab/bin:/opt/gitlab/embedded/bin:' + ENV['PATH']
#!/usr/bin/env ruby
# This file was placed here by GitLab. It makes sure that your pushed commits
# will be processed properly.

refs = $stdin.read
key_id = ENV.delete('GL_ID')
protocol = ENV.delete('GL_PROTOCOL')
repo_path = Dir.pwd
gl_repository = ENV['GL_REPOSITORY']

def increase_reference_counter(gl_repository, repo_path)
  result = GitlabNet.new.pre_receive(gl_repository)

  result['reference_counter_increased']
end

require_relative '../lib/gitlab_custom_hook'
require_relative '../lib/gitlab_access'
require_relative '../lib/gitlab_net'

# It's important that on pre-receive `increase_reference_counter` gets executed
# last so that it only runs if everything else succeeded. On post-receive on the
# other hand, we run GitlabPostReceive first because the push is already done
# and we don't want to skip it if the custom hook fails.
if GitlabAccess.new(gl_repository, repo_path, key_id, refs, protocol).exec &&
    GitlabCustomHook.new(repo_path, key_id).pre_receive(refs) &&
    increase_reference_counter(gl_repository, repo_path)
  exit 0
else
  exit 1
end

符号链接是否返回到gitlab app文件夹,导致该文件正在构建的动态目录出现问题?

我完全失去了为什么SSH推送无法正常工作,并且我非常渴望得到帮助,因为我渴望在我的生活中进行一些验证。为什么CLONE命令成功找到目录,但PUSH命令没有?所有的东西都指向钩子文件,但我从来没有处理过这些,并且比生日后三周的5美元礼品卡更能体会到帮助。

感谢StackOverflow!

1 个答案:

答案 0 :(得分:0)

  

我还建立了SSH密钥并授权git用户(由omnibus gitlab安装创建)来验证这些密钥。

您需要注意 如何建立这些SSH密钥。

您只应将公钥复制到GitLab用户设置SSH页面(请参阅“How to create your SSH Keys ”)。
您应该直接在~git/.ssh/authorized_keys文件中添加该公钥。

此外,GitLab服务器上的gitlab-rake gitlab:check可以帮助检测此类问题。