使用Jenkins Pipline将最新版本部署(复制)到服务器的最佳解决方案

时间:2018-09-19 05:38:49

标签: jenkins jenkins-pipeline

这是我的詹金斯管道:

pipeline {
    agent {
        docker {
            image 'node:6-alpine' 
            args '-p 3000:3000' 
        }
    }
    environment { 
        CI = 'true'
    }
    stages {
        stage('Build') { 
            steps {
                sh 'npm install'
                sh 'npm build'
            }
        }
        stage('Deliver') { 
            steps {
                sh './jenkins/scripts/deliver.sh' 
                input message: 'Finished using the web site? (Click "Proceed" to continue)' 
                sh './jenkins/scripts/kill.sh'
            }
        }
        stage('Deploy') { 
            steps {
                sh './jenkins/scripts/deploy.sh'
            }
        }
    } }

我使用Docker和jenkinsci/blueocean映像运行Jenkins。前两个阶段是构建NodeJS应用程序的一种标准,但是第三个阶段是Jenkins将新文件复制到服务器的部分。这是deploy.sh个文件:

#!/usr/bin/env sh
set -x
scp -o StrictHostKeyChecking=no -r dist/* deviceappstore:/var/www/my_website/static/

有两个问题,第一个jenkinsci/blueocean没有scp(未设置),第二个,~/.ssh/config在Jankins docker映像中不存在,因此SCP将无法进行身份验证。我的解决方案是从jenkinsci/blueocean扩展自定义映像,设置SCP并将配置文件和SSH密钥复制到其中。

有些插件类似Publish Over SSH,但似乎对管道项目没有用。

有没有更好的解决方案?整个场景正确还是我做错了什么?我正在寻找针对此问题的最安全,标准的解决方案。

1 个答案:

答案 0 :(得分:0)

好的,我想我找到了一个好的解决方案。 感谢SSH Agent plugin,我可以轻松地将凭据传递给SCP命令并将文件复制到服务器。像这样:

...

stage('Deploy') { 
    steps {
        sshagent(['my SSH']) {
            echo 'this works...'
            sh 'scp -o StrictHostKeyChecking=no -r dist/* my_server:/var/www/my_site/static/'
        }
    }
}

...

这是完美的,因为所有凭据都在Jenkins服务器内部,并且在存储库中也没有任何内容。

只有一种解决方案可以使用。您需要在apk(高山)图片中使用jenkinsci/blueocean,并设置openssh:

apk add openssh

或更佳的解决方案是创建新的Dockerfile并构建自己的版本。