问题描述
在使用Jenkins时,尝试使用Git嵌套子模块检出项目时遇到了问题。在克隆子模块时出现了权限错误,导致失败。具体的错误信息如下:
hudson.plugins.git.GitException: Command "git submodule update --init --recursive some/path" returned status code 128:
stdout: Submodule path 'some/path': checked out '34e663c11661b5153076c1d624ead25137df0783'
stderr: Cloning into 'some/other/path'...
Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'git@github.com:foo/foo.git' into submodule path 'some/other/path' failed
Failed to recurse into submodule path 'some/path'
在Jenkins作业中,已启用检出子模块的功能。在Git插件的“高级子模块行为”下,启用了选项“递归更新子模块”和“使用父仓库的默认远程凭据”。所有的Git仓库都是私有的Github仓库,但Jenkins用户对它们有读取权限。
用户发现唯一能够使它工作的方法是将git@...
的URL替换为https://...
的URL。比如,下面的配置会失败:
[submodule "foo"]
path = some/path
url = git@github.com:foo/foo.git
但这样的配置会成功:
[submodule "foo"]
path = some/path
url = https://github.com/foo/foo.git
用户有一些通用的理解问题:
1. Jenkins的Git插件是否支持git@
的URL?或者使用https://...
的URL是一个已知的限制?
2. 为什么选择不同的协议会在Jenkins上产生不同的效果?是因为git@
假定Jenkins的SSH密钥已添加到Github仓库中吗?
解决方案
请注意以下操作可能存在版本差异或配置问题,请确保操作前做好备份。
在Jenkins中使用Git插件支持使用git@
的URL进行子模块克隆,但需要确保正确的SSH密钥已配置并且Jenkins具有访问权限。
使用Deploy Keys
如果你想要使用git@
的URL进行子模块克隆,可以考虑使用Deploy Keys。在GitLab中,你可以在项目的“设置” –> “仓库” –> “Deploy Keys”中找到它们。在使用的Git仓库(主仓库和子模块)中,需要将使用的密钥标记为“启用”。
使用SSH密钥
如果你想在Jenkins中使用git@
的URL进行子模块克隆,你需要确保以下步骤已完成:
- 为Jenkins创建一个SSH密钥对。
- 将私钥添加到Jenkins的凭据中,可以选择上传私钥文件或使用默认的Jenkins主机上的私钥路径(通常为
~/.ssh/id_rsa
)。 - 将对应的公钥添加到Github配置中,以便进行身份验证。
你还可以使用Github分支源插件中的“Checkout over SSH”选项来设置SSH认证。需要添加一个新的“SSH用户名与私钥”凭据,可以选择上传私钥、使用文件或使用Jenkins主机上的私钥。
问题的根本原因
在Git中,使用git@
的URL使用SSH协议进行克隆。这需要正确的SSH密钥来进行身份验证。而使用https://
的URL使用HTTP协议进行克隆,通常使用用户名/密码或者令牌进行认证。
在Jenkins上,当使用git@
的URL时,需要确保Jenkins服务器上正确的SSH密钥已配置,以便能够成功地进行克隆。如果选择https://
的URL,它使用不同的协议和认证机制,因此具有不同的行为。
请注意,如果你的配置中存在SSH密钥配置问题,这可能会导致git@
的URL失败,但这并不是Jenkins的限制,而是配置问题。检查SSH密钥、访问权限和配置是否正确是解决问题的关键。
总结
Jenkins的Git插件是支持使用git@
的URL进行子模块克隆的,但要确保Jenkins具有正确的SSH密钥配置以及访问权限。同时,也可以考虑使用Deploy Keys或SSH密钥来进行克隆,具体取决于你的配置和安全需求。选择不同的协议会影响克隆行为,因为git@
和https://
使用了不同的认证方式和协议。解决问题的关键是正确配置SSH密钥并确保访问权限正确。