Jenkins pipeline——使用ssh agent通过ssh在另一台机器上克隆一个仓库
Jenkins pipeline - use ssh agent to clone a repository in another machine through ssh
用例:
我有一个 Jenkins 管道来更新我的开发环境。
我的开发环境是一个具有 docker compose.
的 EC2 aws 实例
自动化是按照以下方式编写的:
withAWS(profile: 'default') {
sh "ssh -o StrictHostKeyChecking=no -i ~/my-key.pem user@3.456.789 /bin/bash -c 'run some command like docker pull'"
}
现在,我有其他测试环境,它们都有某种 docker-compose 文件、配置和 属性 文件,需要我在需要时检查所有这些文件改变。
为了解决这个问题,我创建了一个新的存储库来保存所有不同的环境配置,我的计划是在我所有的开发和测试环境中复制这个存储库,所以当我需要改变一些东西时,我可以在本地进行,推送它,然后让我的 jenkins 管道在它正在更新的任何环境中更新存储库。
我的 jenkins 有一个用于我的 repo 的 ssh 凭据(它在另一个克隆 repo 的工作中使用并 运行 对源代码进行测试),所以我想使用相同的凭据。
问题:我可以通过 ssh 连接到另一台机器,使用 Jenkins ssh-agent 凭据进入 clone/update 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-agent
实用程序通过创建一个 UNIX 域套接字然后由 ssh
使用来工作。如果 ssh
命令找到环境变量 SSH_AUTH_SOCK
,它会尝试与代理通信。另外,可以指示ssh
转发代理,通过-A
。有关详细信息,请参阅 ssh-agent
和 ssh
.
的手册页
因此,假设您的 withAWS
上下文使环境变量 SSH_AUTH_SOCK
(由插件设置)可用,我认为这应该足以:
- 将
-A
添加到您的 ssh
调用中
- 在
'run some command like 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
- 使文件
123.456.789.fingerprint
在 Jenkins 调用您的示例代码时可用。这可以通过在包含 Jenkins 管道的 repo 中提交该文件来完成,这样做是安全的,因为它不包含秘密。
- 最后,将您的 ssh 调用更改为
ssh -o UserKnownHostsFile=/path/to/123.456.789.fingerprint ...
用例: 我有一个 Jenkins 管道来更新我的开发环境。 我的开发环境是一个具有 docker compose.
的 EC2 aws 实例自动化是按照以下方式编写的:
withAWS(profile: 'default') {
sh "ssh -o StrictHostKeyChecking=no -i ~/my-key.pem user@3.456.789 /bin/bash -c 'run some command like docker pull'"
}
现在,我有其他测试环境,它们都有某种 docker-compose 文件、配置和 属性 文件,需要我在需要时检查所有这些文件改变。
为了解决这个问题,我创建了一个新的存储库来保存所有不同的环境配置,我的计划是在我所有的开发和测试环境中复制这个存储库,所以当我需要改变一些东西时,我可以在本地进行,推送它,然后让我的 jenkins 管道在它正在更新的任何环境中更新存储库。
我的 jenkins 有一个用于我的 repo 的 ssh 凭据(它在另一个克隆 repo 的工作中使用并 运行 对源代码进行测试),所以我想使用相同的凭据。
问题:我可以通过 ssh 连接到另一台机器,使用 Jenkins ssh-agent 凭据进入 clone/update 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-agent
实用程序通过创建一个 UNIX 域套接字然后由 ssh
使用来工作。如果 ssh
命令找到环境变量 SSH_AUTH_SOCK
,它会尝试与代理通信。另外,可以指示ssh
转发代理,通过-A
。有关详细信息,请参阅 ssh-agent
和 ssh
.
因此,假设您的 withAWS
上下文使环境变量 SSH_AUTH_SOCK
(由插件设置)可用,我认为这应该足以:
- 将
-A
添加到您的ssh
调用中 - 在
'run some command like 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
- 使文件
123.456.789.fingerprint
在 Jenkins 调用您的示例代码时可用。这可以通过在包含 Jenkins 管道的 repo 中提交该文件来完成,这样做是安全的,因为它不包含秘密。 - 最后,将您的 ssh 调用更改为
ssh -o UserKnownHostsFile=/path/to/123.456.789.fingerprint ...