Jenkins是否支持使用”git@”(而不是”https”)URL克隆git子模块

111次阅读
没有评论

问题描述

在使用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进行子模块克隆,你需要确保以下步骤已完成:

  1. 为Jenkins创建一个SSH密钥对。
  2. 将私钥添加到Jenkins的凭据中,可以选择上传私钥文件或使用默认的Jenkins主机上的私钥路径(通常为~/.ssh/id_rsa)。
  3. 将对应的公钥添加到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密钥并确保访问权限正确。

正文完