GitLab 运行程序获取子模块的“主机密钥验证失败”

dki*_*ish 1 git ssh ssh-keys gitlab gitlab-ci

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

sudo gitlab-runner install --user=<user> 
Run Code Online (Sandbox Code Playgroud)

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

GIT_SUBMODULE_STRATEGY: recursive
Run Code Online (Sandbox Code Playgroud)

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

LeG*_*GEC 6

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

例如:如果初始git clone运行的用户与更新子模块的用户不同,则它们没有相同的~/.ssh/known_hosts文件,并且 ssh 命令可以为第一个用户工作而不会出现错误,而对于第二个用户则失败。


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

例如,ssh 使用 $HOME/.ssh/known_hosts 以外的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>`
Run Code Online (Sandbox Code Playgroud)

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

# for example : set the GIT_SSH_COMMAND environment variable
GIT_SSH_COMMAND='ssh -o StrictHostKeyChecking=no'
Run Code Online (Sandbox Code Playgroud)

  • 好的。当您运行作业时,运行程序首先克隆(或获取)存储库,以便能够访问 gitlab.yml。这是第一步。然后它读取 gitlab.yml 中的指令并执行它们。这是第二步。如果第二步不是使用与第一步相同的用户运行,或者不在相同的环境中运行(例如:如果运行程序为第二步启动容器),则 ssh 周围的配置可能不同(不同的 `.ssh /config`、`.ssh/known_hosts` ...)。如果您想了解,请更深入地了解跑步者如何执行其动作。 (2认同)