为Jenkins从属节点

时间:2016-09-17 00:12:23

标签: windows git jenkins ssh

问题陈述

我正在寻找关于在Jenkins主服务器和从服务器上设置SSH密钥以连接到Git的正确方法的建议。关于Git,Jenkins和SSH还有其他类似的问题(最接近的是this),但似乎没有人回答这个问题,并提出了正确的方法来解决这个问题。

背景&测试

我正在使用内部部署的GitLab进行Jenkins的原型实现。我们有几年的Jenkins经验,但将它与Git集成对我们来说是新的。这也是我们第一次配置任何从节点。在这一点上,我们只是试图让简单的轮询工作,没有花哨的推送通知。

主Jenkins实例在Linux上运行(Red Hat Linux 6)。目前有三个从属服务器:另一个Red Hat Linux服务器和两个运行Windows Server 2012 R2的服务器。 Windows服务器上的Jenkins从属服务器作为Windows服务运行。主服务器和所有从服务器都运行最新的Git v2.10.0(64位)。

我们打算使用SSH访问GitLab。我创建了一个带密码的SSH密钥,并将其保存在主服务器的磁盘上。然后,我将公钥配置为GitLab中我的测试项目的部署密钥。最后,我在Jenkins中添加了一个新的凭证。

在我在Jenkins的第一个测试项目中,我配置了GitLab存储库URL并选择了上面创建的Jenkins凭据。然后我在主人身上建造了这个项目。 Jenkins毫无问题地与GitLab建立了SSH连接,并且构建成功。然后我将构建强制转换为Linux slave,结果相同。

不幸的是,当强制构建到任一Windows从属服务器时,构建不像在Linux上那样工作。

Windows上的错误

(根据我的原始问题编辑,基于进一步的研究。)

我最初遇到此错误,导致无法发生任何SSH连接:

stderr: Unable to negotiate with xxxx port 22: no matching host key type found. Their offer: ssh-dss

这与SSH级别的协商有关。与Git捆绑在一起的较新的SSH客户端默认不会使用ssh-dss,这是我所有相对较旧的SSH服务器都可以提供的。

为了解决这个问题,我添加了%HOME%/.ssh/config,其中包含以下几行,正如OpenSSH在Legacy Options下所记录的那样:

Host xxxx
   HostKeyAlgorithms +ssh-dss

这会强制Git SSH客户端接受ssh-dss连接。

大约在同一时间,我一直在努力解决如何从与Git捆绑的Windows SSH客户端中获取详细的SSH输出,因为设置GIT_SSH='ssh -vvv'的通常建议在Windows上不起作用。基于Ask Ubuntu问题和类似的Stack Overflow问题,我最终在%HOME%/.ssh/config中得到了此结果:

Host xxxx
   HostKeyAlgorithms +ssh-dss
   LogLevel DEBUG3

有了调试输出可以让我更好地了解发生了什么。最后,我可以在Windows上成功构建,但前提是我使用的SSH密钥没有密码短语。提示位于调试输出中:

debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password,hostbased
debug3: start over, passed a different list publickey,gssapi-keyex,gssapi-with-mic,password,hostbased
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Trying private key: C:\\Users\\JENKIN~1.TMS\\AppData\\Local\\Temp\\ssh2489775972592020656key
debug1: read_passphrase: can't open /dev/tty: No such device or address
debug2: no passphrase given, try next key
debug2: we did not send a packet, disable method

出于某种原因,Jenkins未能在Windows上使用正确的密码设置SSH密钥,在Linux上它可以正常工作。不幸的是,Jenkins不会从SSH转储调试输出,除非命令失败,所以我无法确切地看到Linux构建的不同之处。

问题

  1. 我尝试这样做的(可能是天真的)方式明显适用于Linux,但不适用于Windows。它应该在Windows上运行吗?

  2. 这是根据我的情况管理SSH密钥的正确方法,还是有更好的方法可以做到这一点?随着这种基础设施的发展,我希望避免为每个奴隶管理磁盘上的关键文件。

  3. 假设这是正确使用的机制,有人可以指点我或一个明确解释如何使其工作的答案吗?我觉得我一定错过了一些明显的东西......?

0 个答案:

没有答案