首页 > 解决方案 > Docker 容器内的 Jenkins Pipeline 使用 SSH 密钥进行 SSH 文件传输

问题描述

我正在尝试将 teamcity 管道迁移到 jenkins 管道。

我已经习惯了 teamcity,我仍然在 Jenkins 周围找到自己的方式,但我还没有找到办法做到这一点。

我想要一个包含两个步骤的管道,一个用于编译应用程序,第二个步骤是使用带有私钥的 SSH 将其发送到服务器。

我可以很容易地在 Teamcity 中做到这一点(经过一些研究),但在 Jenkins 中我已经研究过它,但还没有找到到达那里的方法,也没有找到网络上的示例。

我尝试了一个自由式项目,我可以在其中配置 SSH 代理,但我似乎无法找到放置其余逻辑的位置,以及使用 repo 中的 Jenkinsfile 进行编译的多分支管道,但无处设置发送的详细信息文件结束。

我应该使用多分支管道并从 jenkinsfile 中“发送”文件吗?如果是这样,我如何告诉 Jenkins 将密钥提供给 docker 容器?

或者我应该使用自由式项目,如果是,我如何告诉它先使用 Jenkinsfile,然后将生成的文件发送到目标服务器?

还是我应该使用完全不同的东西?

标签: jenkinsjenkins-pipeline

解决方案


您可以在管道中执行此操作:

1/ 通过创建一个新的凭证(带有私钥的 ssh 用户名)将您的私钥添加到 Jenkins

2/ 在 jenkinsFile 中:

node {
try {

    stage ("build") {

        dir('Build') {

            env.NODEJS_HOME = "${tool 'Node 12.12'}"
            env.PATH="${env.NODEJS_HOME}/bin:${env.PATH}"
            sh 'npm install'
            sh 'npm pack'  
        }
    }

    stage ("Deploy") {

            def remote = [:]
            remote.name = 'name of your server'
            remote.host = 'ip of your server'
            remote.allowAnyHosts = true

        dir ('Build') {

            withCredentials([sshUserPrivateKey(
                credentialsId: 'id_of_your_previously_created_credential',
                keyFileVariable: 'identityKey',
                passphraseVariable: 'passphraseV',
                usernameVariable: 'userR')])  
                {
                remote.user = userR
                remote.passphrase = passphraseV
                remote.identityFile = identityKey
                sshPut remote: remote, from: "yourArchive.tgz", into: '.'
                }
        }
    } 

} catch (e) {
  println "Caught: ${e}"
  throw e    
} 

}

我以 npm 为例,使用“npm pack”创建一个存档,我们将上传到服务器。

您可能还需要安装(如果尚未安装)以下插件:

  • SSH 凭证插件
  • SSH 管道步骤
  • 凭据绑定插件
  • 凭据插件

推荐阅读