【问题标题】:GitLab runner gets "host key verification failed" for submodulesGitLab runner 获取子模块的“主机密钥验证失败”
【发布时间】:2021-04-17 05:17:51
【问题描述】:

我面临以下问题:
我正在尝试配置 GitLab CI 管道(shell)。
我的存储库包含两个子模块。
这两个子模块与包含它们的超级存储库位于同一 GitLab 服务器上。
克隆是 SSH 克隆,我已经在本地配置了密钥,并将我的密钥添加到 GitLab。
在安装了 runner 的机器上,我可以毫无问题地克隆所有内容,包括子模块。
但是,当运行器尝试克隆时,它会返回“主机密钥验证失败”,但仅限于子模块。
我尝试使用自己的用户和我的用户配置运行器:

sudo gitlab-runner install --user=<user> 

没有效果。
最让我困惑的是,错误仅针对子模块,即使它们与包含它们的超级仓库位于同一台服务器上,并且超级仓库可以毫无问题地克隆(当我关闭 submoudle recursive var in yml 文件):

GIT_SUBMODULE_STRATEGY: recursive

但是我当然没有子模块。
如有任何关于检查或尝试的建议,我将不胜感激!

【问题讨论】:

    标签: git ssh gitlab gitlab-ci ssh-keys


    【解决方案1】:

    “主机密钥验证失败”是关于 machine 密钥(~/.ssh/known_hosts 中列出的那些),而不是您的 gitlab 密钥。

    例如:如果最初的git clone 不是以与更新子模块的用户相同的用户运行,那么它们没有相同的~/.ssh/known_hosts 文件,ssh 命令可以为第一个用户工作而无需错误,而第二次失败。


    干净的解决方法是:将您知道正确的主机密钥复制到预期的known_host 文件中。

    例如见ssh use known_hosts other than $HOME/.ssh/known_hosts

    # use a 'known_hosts' file with the host key of your git server
    GIT_SSH_COMMAND=`ssh -o UserKnownHostsFile=<some provisioned known_hosts file>`
    

    几乎每个人都使用的解决方法是:关闭 HostKey 验证。

    # for example : set the GIT_SSH_COMMAND environment variable
    GIT_SSH_COMMAND='ssh -o StrictHostKeyChecking=no'
    

    【讨论】:

    • 谢谢,解决方法有效,但我仍然想了解这个问题。正如我所写,我可以在安装了运行器的机器上毫无问题地进行本地克隆,这意味着 known_hosts 已经拥有正确的主机密钥。那么为什么它对跑步者不起作用呢?我正在使用相同的用户运行运行器,该用户可以在没有运行器的情况下在本地克隆。
    • 什么是跑步者?虚拟机?一个泊坞窗图像?
    • 跑步者和 GitLab 服务器都在虚拟机上,是的。并且跑步者是一个shell跑步者。
    • 好的。当您运行作业时,运行程序首先克隆(或获取)存储库,以便能够访问 gitlab.yml。这是第一步。然后它读取 gitlab.yml 中的指令并执行它们。这是第二步。如果第二步不是在与第一步相同的用户下运行,或者不在相同的环境中(例如:如果运行器为第二步启动容器),那么围绕 ssh 的配置可以不同(不同.ssh/config.ssh/known_hosts ...)。如果您想了解,请深入了解您的跑步者如何执行其动作。
    • 谢谢。我的管道仅由一位用户运行 - 也就是说,所有阶段的所有内容都仅由一位运行者、一位用户运行,并且所有内容都在同一环境中运行。我将尝试在新 VM 上安装新的运行程序,看看问题是否与机器本身有关。
    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2021-12-25
    • 2013-02-16
    • 1970-01-01
    • 2020-07-15
    • 2018-10-04
    相关资源
    最近更新 更多