如何在 Jenkins 管道中使用 SSH?

Posted

技术标签:

【中文标题】如何在 Jenkins 管道中使用 SSH?【英文标题】:How do I use SSH in a Jenkins pipeline? 【发布时间】:2017-10-29 11:07:15 【问题描述】:

我使用构建 NPM 项目的 Jenkins 管道模型定义定义了一些 Jenkins 作业。我使用 Docker 容器来构建这些项目(使用与 只是 Node.js + npm + yarn)。

构建的结果包含在我使用zip 管道命令压缩的dist/ 文件夹中。

我想将此 ZIP 文件复制到使用 SSH/SCP(使用私钥身份验证)的另一台服务器。我的私钥已添加到 Jenkins 环境(凭据管理器)中,但是当我使用 Docker 容器时,无法建立 SSH 连接。

我尝试添加 agent label 'master' 以使用主 Jenkins 节点进行文件传输,但它似乎使用新的 Git 提取创建了一个干净的工作区,并且没有我构建的文件。

在我尝试了 SSH 代理插件后,我得到了这样的输出:

Identity added: /srv/jenkins3/workspace/myjob-TFD@tmp/private_key_370451445598243031.key (rsa w/o comment)
[ssh-agent] Started.
[myjob-TFD] Running shell script
+ scp -r dist test@myremotehost:/var/www/xxx
$ docker exec bfda17664965b14281eef8670b34f83e0ff60218b04cfa56ba3c0ab23d94d035 env SSH_AGENT_PID=1424 SSH_AUTH_SOCK=/tmp/ssh-k658r0O76Yqb/agent.1419 ssh-agent -k
unset SSH_AUTH_SOCK;
unset SSH_AGENT_PID;
echo Agent pid 1424 killed;
[ssh-agent] Stopped.
Host key verification failed.
lost connection

如何添加授权的远程主机?

【问题讨论】:

我有同样的问题,sshagent 插件在容器中不起作用 使用 withCredentials 并删除 sshAgent 插件withCredentials([sshUserPrivateKey(credentialsId: 'ssh-credentials-id', keyFileVariable: 'keyfile')]) sh "mkdir -p ~/.ssh && cp $keyfile ~/.ssh/id_rsa" other_stuff 与@SZMER 备份说:sshagent plugin broken on Windows 10 version 1803 【参考方案1】:

我遇到了类似的问题。我没有使用“master”标签,当我这样做时,我发现文件传输可以跨从属设备进行:

第 1 步 - 在远程主机服务器中创建 SSH 密钥,将密钥包含到 authorized_keys

第 2 步 - 在 Jenkins 中使用 SSH 密钥创建凭据,使用来自远程主机的私钥

使用SSH agent plugin:

stage ('Deploy') 
    steps
        sshagent(credentials : ['use-the-id-from-credential-generated-by-jenkins']) 
            sh 'ssh -o StrictHostKeyChecking=no user@hostname.com uptime'
            sh 'ssh -v user@hostname.com'
            sh 'scp ./source/filename user@hostname.com:/remotehost/target'
        
    

【讨论】:

【参考方案2】:

使用 SSH 代理插件:

SSH Agent Plugin SSH Agent Plugin

使用此插件时,您可以使用全局凭据。

【讨论】:

我尝试了您指定的插件并因此更新了问题。 如何在管道脚本中使用来自 SSH 插件的凭据?【参考方案3】:

要将远程主机添加到已知主机并希望解决您的错误,请尝试以 Jenkins 用户身份从 Jenkins 主机手动 ssh 到目标主机。

进入安装 Jenkins 的主机。类型

sudo su jenkins

现在使用 ssh 或 scp 之类的

ssh username@server

你应该得到这样的提示:

无法建立主机“服务器(IP)”的真实性。 ECDSA 密钥指纹是 SHA256:some-weird-string。 确定要继续连接(是/否)?

键入是。服务器将永久添加为已知主机。甚至不必费心传递密码,只需 Ctrl + C 并尝试运行 Jenkins 作业。

【讨论】:

为什么要投反对票?这是更新问题的正确答案。【参考方案4】:

就像@haschibaschi 推荐的那样,我也使用 ssh-agent 插件。我需要在远程机器上使用我的个人 UID 凭据,因为它没有任何 UID Jenkins 帐户。代码如下所示(例如,使用我的个人 UID="myuid" 和远程服务器主机名="non_jenkins_svr":

sshagent(['e4fbd939-914a-41ed-92d9-8eededfb9243']) 
    // 'myuid@' required for scp (this is from UID jenkins to UID myuid)
    sh "scp $WORKSPACE/example.txt myuid@non_jenkins_svr:$dest_dir"

ID e4fbd939-914a-41ed-92d9-8eededfb9243 是在我创建全局域凭据条目后由 Jenkins 凭据管理器生成的。

创建凭据条目后,可以在凭据页面的“ID”列下找到 ID。创建条目时,我选择了类型“带有私钥的 SSH 用户名”(“Kind”字段),并复制了为此目的在主机 non_jenkins_svr 上的 myuid 帐户下创建的 RSA 私钥,没有密码。

【讨论】:

以上是关于如何在 Jenkins 管道中使用 SSH?的主要内容,如果未能解决你的问题,请参考以下文章

在带有 ssh、scp 或 sftp 的 jenkins 管道中使用 ssh 凭据

如何在 Linux 中创建用于 Github 的 Jenkins SSH 密钥?

在 Jenkins 管道中使用 Ansible 进行部署

如何在Jenkins管道中使用自定义Dockerfile名称?

如何测试使用分支名称的Jenkins管道(或其他jenkins脚本)?

Jenkins如何使用AnchorChain插件向Jenkins管道添加外部URL