docker容器内的Jenkins管道,使用SSH密钥进行SSH文件传输

docker容器内的Jenkins管道,使用SSH密钥进行SSH文件传输,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我正在尝试将teamcity管道迁移到jenkins管道 我已经习惯了teamcity,我仍然在Jenkins周围找到自己的路,但我还没有找到一种方法来做到这一点 我想要一个包含两个步骤的管道,一个用于编译应用程序,第二个用于使用SSH和私钥将其发送到服务器 我可以在Teamcity轻松做到这一点(经过一些研究),但我和Jenkins一起进行了研究,没有找到实现这一点的方法,也没有在网上找到例子 我曾经尝试过一个自由式项目,在这个项目中我可以配置SSH代理,但我似乎找不到将其余逻辑放在哪里,还有

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

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

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

我可以在Teamcity轻松做到这一点(经过一些研究),但我和Jenkins一起进行了研究,没有找到实现这一点的方法,也没有在网上找到例子

我曾经尝试过一个自由式项目,在这个项目中我可以配置SSH代理,但我似乎找不到将其余逻辑放在哪里,还有一个多分支管道,它使用repo中的Jenkinsfile进行编译,但却没有设置发送文件的细节

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

或者我应该使用freestyle项目,如果是这样,我如何告诉它首先使用Jenkinsfile,然后将生成的一个或多个文件发送到目标服务器


或者我应该使用完全不同的东西吗?

您可以在管道中这样做:

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

2/在Jenkins文件中:

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作为示例,“NPMPack”创建了一个档案,我们将上传到服务器

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

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

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

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

2/在Jenkins文件中:

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作为示例,“NPMPack”创建了一个档案,我们将上传到服务器

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

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

检查此项。检查此项。我必须对您上面留下的Jenkins文件进行一些额外的更改,但我已经能够根据您的答案使事情正常进行,因此我将其标记为正确。谢谢。我不得不对您留下的Jenkins文件进行一些额外的更改,但我已经能够根据您的答案使事情正常进行,因此我将其标记为正确。非常感谢。