如何在 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管道中使用自定义Dockerfile名称?