Jenkins管道-使用ssh代理通过ssh在另一台机器上克隆存储库

Jenkins管道-使用ssh代理通过ssh在另一台机器上克隆存储库,jenkins,ssh,mercurial,Jenkins,Ssh,Mercurial,用例: 我有一个Jenkins管道来更新我的开发环境。 My dev env是一个带有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'" } 现在,我有其他的测试环

用例: 我有一个Jenkins管道来更新我的开发环境。 My dev env是一个带有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文件、配置和属性文件,需要我在需要更改时检查所有这些文件

为了帮助实现这一点,我创建了一个新的存储库来保存所有不同的环境配置,我的计划是在我所有的开发和测试环境中都有一个此repo的克隆,因此当我需要更改某些内容时,我只需在本地执行,然后推送,并让我的jenkins管道在更新的环境中更新存储库

My jenkins为我的repo提供了一个ssh凭据(它用于克隆repo并对源代码运行测试的另一个作业),因此我希望使用相同的凭据

问题:我是否可以通过ssh进入另一台机器,使用Jenkins ssh代理凭据克隆/更新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.

首先了解一些背景知识来理解推理(这是纯ssh,不是Jenkins或Mercurial特有的):ssh代理工具通过创建UNIX域套接字来工作,然后供ssh使用。
ssh
命令在找到环境变量
ssh\u AUTH\u SOCK
时尝试与代理通信。此外,可以通过
-A
指示
ssh
转发代理。有关更多详细信息,请参阅
ssh-agent
ssh
的手册页

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

  • -A
    添加到
    ssh
    调用中
  • 在“运行docker pull之类的命令”部分中,添加
    hg clone
    命令,确保对mercurial URL使用
    ssh://
    模式
安全观察:
-o StrictHostKeyChecking=no
应作为最后手段。根据您的示例,目标的IP地址是固定的,因此您应该执行以下操作:

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

不确定我是否理解正确。我编辑了我的问题。