如何使用SSH密钥配置Hudson和git插件

15

我使用了Hudson(持续集成系统)和Git插件,在Tomcat Windows服务上运行。已安装msysgit,并将msysgit bin目录加入了环境变量。PuTTY/Pageant/plink也已安装,msysgit已配置为使用它们。

当我运行一个尝试克隆git存储库的任务时,会出现以下错误:

$ git clone -o origin git@hostname:project.git "e:\HUDSON_HOME\jobs\Project Trunk\workspace" 
ERROR: Error cloning remote repo 'origin' : Could not clone git@hostname:project.git 
ERROR: Cause: Error performing git clone -o origin git@hostname:project.git e:\HUDSON_HOME\jobs\Project Trunk\workspace 
Trying next repository 
ERROR: Could not clone from a repository 
FATAL: Could not clone 
hudson.plugins.git.GitException: Could not clone 
  1. 在命令行中运行 git clone -o origin git@hostname:project.git "e:\HUDSON_HOME\jobs\Project Trunk\workspace" 没有错误。
  2. 我确认我的问题不同于 Hudson git clone error,因为git在路径中,而且在Hudson的“配置系统”页面上没有关于git可执行文件的任何错误。

这让我相信问题是因为拥有Tomcat/Hudson Windows服务(Local System)的用户没有设置SSH密钥以克隆git存储库。

我的问题是,如何设置才能让git插件/msysgit知道在尝试克隆时使用特定的SSH密钥?我认为Pageant不会起作用,因为Tomcat服务正在作为“Local System”用户运行,但我可能错了。 我尝试了将Pageant设置为服务(使用runassvc.exe),传递适当的密钥,并将其作为“Local System”运行。 Tomcat/Hudson服务似乎无法从pageant服务中看到密钥。 还有其他设置密钥的技巧吗?

谢谢。

编辑:在 http://n4.nabble.com/Hudson-with-git-and-ssh-td375633.html 上的讨论表明,其他人也有类似的问题。 ssh-agent被建议,而且这个工具确实随着msysgit提供,但我不确定如何与Hudson服务一起使用它。 如果有人能填补空白,那将是很好的线索。 感谢 Peter 提供带有链接的评论。

此外,在 http://n4.nabble.com/questions-about-git-and-github-plug-ins-td383420.html 上的讨论从同样的问题开始。 我正在尝试重新启动该线程。


请查看这里的内容:http://n4.nabble.com/Hudson-with-git-and-ssh-td375633.html - Peter Schuetze
谢谢Peter。我也看到了那个讨论串。我不确定如何在Hudson作为服务运行时使用ssh-agent。我还希望自那次讨论以来已经开发出了更官方的方法。我会编辑帖子以提及ssh-agent。 - jlpp
4个回答

7

对于Windows系统来说,还有一个非常重要的注意事项(我想在这个答案中附加说明,因为我很快就找到了这个问题,但是在搜索了数小时后才找到我需要的额外细节):

Git希望%HOME%环境变量设置为您的用户目录(例如C:\ Documents and Settings \ hudsonuser)......这就是它知道在那里查找具有密钥文件的.ssh目录的方式!

我在server fault上发现了这一点(但没有足够的声望点赞)。


6
我们使用Hudson,通过ssh密钥从git检出源代码。实际上,我们的Hudson在Ubuntu服务器上。Hudson的ssh密钥对存储在~hudson/id_rsa~hudson/id_rsa.pub中。
因此,在Windows环境下,我们建议:
我们团队中基于Windows的开发人员使用MSysGit,并经常通过git over ssh检出代码 - 但不使用Putty/Pageant。由于登录时存在一些协议错误,我们发现Pageant很麻烦。相反,他们配置了git以使用OpenSSH(这是安装过程中的选项之一)。然后,他们的公钥/私钥对存储在~username/id_rsa~username/id_rsa.pub中,所有东西都可以正常工作。
因此,我建议更改您的git配置以使用OpenSSH而不是pageant。如果没有其他问题,您就不必担心启动pageant了。
您可以使用PuttyGen生成密钥。但是,如果您使用的是OpenSSH而不是pageant,则需要导出一个适当的私钥(从PuttyGen顶部的菜单之一)并将其保存为id_rsa,并从PuttyGen的GUI中复制并粘贴公钥(它显示但不会保存适用于OpenSSH的版本),然后将其保存为id_rsa.pub。这是因为Putty使用的密钥格式与OpenSSH略有不同。
或者,当然,您始终可以在Ubuntu服务器上托管您的Hudson服务器(通过VirtualBox或实体服务器)。

这是一个很好的回答,William。我认为如果我将运行Tomcat/Hudson Windows服务的用户从“本地系统”更改,则可能可以使用此方法。不过,在我这样做之前,我想知道是否有任何方法可以在不更改服务所有者的情况下完成此操作。我会给其他人一个机会来回应。再次感谢。 - jlpp
1
这是我们在 Windows 从机上使用的方法。设置了一个名为 Hudson 的用户,将私钥放在 ~hudson/.ssh/id_rsa 中,将 Git 服务器注册到 ~hudson/.ssh/known_hosts 中,并将 hudson 从机服务更改为以 hudson 用户身份登录。我唯一的注意事项是:如果在 Windows 安装中安装了 cygwin,请确保您已将 hudson 设置 CYGWIN 变量为空,否则 mingw 将抛出私钥权限错误。 - Guildencrantz
1
@jlpp:我们在尝试在Hudson中检出bzr分支时遇到了同样的问题,最终我们将Tomcat Windows服务运行在本地用户帐户下,现在它可以正常工作了。 - Pete
谢谢你的建议,Guildencrantz。 - jlpp
还记得私有的 Github 仓库将无法访问之前“readonly”的公共 Uri(以 git:// 开头的那个)。所以,如果您刚刚将一个公共仓库切换为私有,请遵循以上所有步骤,然后检查您是否正在连接到 git@github.com... 的 uri。(/我拍了拍额头) - David Laing
3
在Windows(x64)中,本地系统“用户”的“主目录”是%WINDIR%\SysWOW64\config\systemprofile- 因此,您可以将.ssh文件夹放在那里,而无需使用其他用户。 - Adam Rofer

3

我发现,在Ubuntu上(通过Jenkins,而非Hudson),需要使用不同的方法来使这个工作正常。但除此之外,问题基本相同。我通过Jenkins GUI检查了%HOME%环境变量,看起来没问题。

我想要使用的密钥已经存在,用于识别Jenkins到Github私有仓库。我将它们复制到/var/lib/jenkins/.ssh目录下——为该密钥和账户复制id_rsa和id_rsa.pub文件。

最初,我将这些文件复制为“root”用户,导致Jenkins无法访问它们,所以我仍然会得到错误提示(令人困惑的是,错误提示让我输入密码,但实际上并没有设定密码)。因此,我进行了chown、chmod和chgrp操作,以便Jenkins可以访问这些文件。

我通过以Jenkins用户身份登录并执行git clone来进行测试。

我知道这条路线是特定于Ubuntu的,但是在Windows中,类似的设置,确保密钥文件可用并位于正确位置,并在命令行上执行git clone git:myrepo命令来测试,可能至少可以确定哪里与Ubuntu不同。


0
将您的 .ssh 文件夹放置在以下路径之一:
C:\Windows\SysWOW64\config\systemprofile 或者
C:\Windows\System32\config\systemprofile 具体路径取决于您的系统是32位还是64位。
这是“本地系统”的“用户”目录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接