Jenkins管道-使用ssh代理通过ssh

时间:2018-09-12 14:17:11

标签: jenkins ssh mercurial

用例: 我有一个Jenkins管道来更新我的开发环境。 我的开发环境是带有docker compose的EC2 aws实例。

自动化是按照以下方式编写的:

withAWS(profile: 'default') {
   sh "ssh -o StrictHostKeyChecking=no -i ~/my-key.pem user@$123.456.789 /bin/bash -c 'run some command like docker pull'"
}

现在,我还有其他测试环境,它们都具有某种docker-compose文件,配置和属性文件,需要我在需要更改时对它们进行遍历。

为此,我创建了一个新的存储库来保留所有不同的环境配置,并且我的计划是在所有开发和测试环境中对此仓库进行克隆,因此,当我需要更改某些内容时,可以只需在本地执行,推送它,然后让我的jenkins管道在要更新的任何环境中更新存储库即可。

我的詹金斯人为我的仓库有一个ssh证书(它用于克隆仓库和对源代码进行测试的另一项工作),所以我想使用相同的证书。

问题:我可以通过某种方式通过ssh'进入另一台计算机,使用Jenkins的ssh-agent凭据来克隆/更新bitbucket存储库吗?

编辑: 我将管道更改为:

script {
   def hgCommand = "hg clone ssh://hg@bitbucket.org/my-repo"
   sshagent(['12345']) {
     sh "ssh -o StrictHostKeyChecking=no -i ~/mykey.pem admin@${IP_ADDRESS} /bin/bash -c '\"${hgCommand}\"'"
   }
}

我得到了:

[ssh-agent] Looking for ssh-agent implementation...
[ssh-agent]   Exec ssh-agent (binary ssh-agent on a remote machine)
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-FOburguZZlU0/agent.662
SSH_AGENT_PID=664
Running ssh-add (command line suppressed)
Identity added: /home/jenkins/workspace/abc@tmp/private_key_12345.key (rsa w/o comment)
[ssh-agent] Started.
[Pipeline] {
[Pipeline] sh
[test-env-config] Running shell script
+ ssh -o StrictHostKeyChecking=no -i /home/jenkins/mykey.pem admin@123.456.789 /bin/bash -c "hg clone ssh://hg@bitbucket.org/my-repo"
remote: Warning: Permanently added the RSA host key for IP address '765.432.123' to the list of known hosts.
remote: Permission denied (publickey).
abort: no suitable response from remote hg!
$ ssh-agent -k
unset SSH_AUTH_SOCK;
unset SSH_AGENT_PID;
echo Agent pid 664 killed;
[ssh-agent] Stopped.

1 个答案:

答案 0 :(得分:1)

首先需要了解一些背景知识(这是纯粹的ssh,没有特定的Jenkins或Mercurial):ssh-agent实用程序的工作方式是使UNIX域套接字供ssh使用。如果ssh命令找到了环境变量SSH_AUTH_SOCK,它将尝试与代理进行通信。另外,可以指示ssh通过-A转发代理。有关更多详细信息,请参见ssh-agentssh的手册页。

因此,假设您的withAWS上下文使环境变量SSH_AUTH_SOCK(由插件设置)可用,我认为它应该足以:

  • -A添加到您的ssh调用中
  • 'run some command like docker pull'部分中,添加hg clone命令,确保您将ssh://模式用于商品网址。

安全性观察:-o StrictHostKeyChecking=no应该用作最后的手段。从您的示例中,目标的IP地址是固定的,因此您应该执行以下操作:

  • 删除-o StrictHostKeyChecking=no
  • 一次拍摄:获取123.456.789的主机指纹(例如,通过将其切入,然后在$HOME/.known_hosts中查找关联的行)。将该行保存到文件中,说123.456.789.fingerpint
  • 在调用示例代码时使文件123.456.789.fingerprint对Jenkins可用。可以通过在包含Jenkins管道的仓库中提交该文件来完成此操作,这样做是安全的,因为它不包含秘密。
  • 最后,将ssh调用更改为类似ssh -o UserKnownHostsFile=/path/to/123.456.789.fingerprint ...