GitLab runner 获取子模块的“主机密钥验证失败”
Posted
技术标签:
【中文标题】GitLab runner 获取子模块的“主机密钥验证失败”【英文标题】:GitLab runner gets "host key verification failed" for submodules 【发布时间】: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
但是我当然没有子模块。 如有任何关于检查或尝试的建议,我将不胜感激!
【问题讨论】:
【参考方案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 上安装新的运行程序,看看问题是否与机器本身有关。以上是关于GitLab runner 获取子模块的“主机密钥验证失败”的主要内容,如果未能解决你的问题,请参考以下文章