我使用Jenkins管道模型定义定义了一些Jenkins作业,它构建了NPM项目。我使用Docker容器来构建这些项目(使用常见的图像 只是Node.js + npm + yarn)。
构建的结果包含在我使用dist/
管道命令压缩的zip
文件夹中。
我想使用SSH / SCP将此ZIP文件复制到另一台服务器(使用私钥验证)。我的私钥被添加到Jenkins环境(凭证管理器),但是当我使用Docker容器时,无法建立SSH连接。
我尝试添加agent { label 'master' }
以使用主Jenkins节点进行文件传输,但它似乎创建了一个带有新Git fetch的干净工作空间,而且没有我构建的文件。
尝试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
如何添加授权的远程主机?
答案 0 :(得分:8)
我有类似的问题。我没有使用标签'master',我确定文件传输在奴隶之间工作,当我这样做时:
步骤1 - 在远程主机服务器中创建SSH密钥,包括authorized_keys的密钥
步骤2 - 使用Jenkins中的SSH密钥创建凭证,使用远程主机中的私钥
以下步骤已添加到管道中:
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'
}
}
}
答案 1 :(得分:3)
答案 2 :(得分:0)
像@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私钥,没有密码。