【问题标题】:Jenkins pipeline - use ssh agent to clone a repository in another machine through sshJenkins 管道 - 使用 ssh 代理通过 ssh 在另一台机器上克隆存储库
【发布时间】:2018-09-12 14:17:10
【问题描述】:

用例: 我有一个 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 管道在它正在更新的任何环境中更新存储库。

我的 jenkins 有我的 repo 的 ssh 凭据(它用于克隆 repo 并在源代码上运行测试的另一个作业),所以我想使用相同的凭据。

问题:我能否以某种方式通过 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.

【问题讨论】:

    标签: jenkins ssh mercurial


    【解决方案1】:

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

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

    • -A 添加到您的ssh 调用中
    • 'run some command like docker pull' 部分中,添加hg clone 命令,确保您使用ssh:// 架构作为mercurial URL。

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

    • 删除-o StrictHostKeyChecking=no
    • one-shot:获取123.456.789 的主机指纹(例如通过ssh-ing 进入它,然后在$HOME/.known_hosts 中查找相关行)。将该行保存在文件中,例如123.456.789.fingerpint
    • 让文件123.456.789.fingerprint 在Jenkins 调用您的示例代码时可用。这可以通过在包含 Jenkins 管道的 repo 中提交该文件来完成,这样做是安全的,因为它不包含秘密。
    • 最后,将 ssh 调用更改为 ssh -o UserKnownHostsFile=/path/to/123.456.789.fingerprint ...

    【讨论】:

    • 不确定我是否理解正确。我编辑了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 2012-04-04
    • 1970-01-01
    • 2016-12-09
    • 2019-10-03
    • 2017-08-07
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多