如何在Jenkins管道中使用SSH?

时间:2017-05-29 08:02:14

标签: node.js git jenkins ssh jenkins-pipeline

我使用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

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

3 个答案:

答案 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)

使用SSH代理插件:

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

答案 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私钥,没有密码。