开发者

jenkins如何部署应用到多个环境

目录
  • jenkins部署应用到多个环境
    • 创建项目
    • 设置参数
    • 配置流水线
      • 设置环境变量
      • 配置maven
      • 构建
  • 总结

    jenkins部署应用到多个环境

    在日常开发的过程中,我们经常会遇到将应用程序部署到多个环境的需求场景,如会先发布到测试环境,由测试人员进行测试,成功之后,会继续将当前应用部署到集成环境,进行集成测试,全部通过后,再继续将应用部署到生产环境,即完成一整个上线的流程。

    本文将介绍如何基于流水线的方式,将应用部署到多个环境,本次之多两个环境,分别是测试环境和生产环境,可以根据实际情况进行优化调整。

    创建项目

    jenkins如何部署应用到多个环境

    如上,创建一个流水线的项目

    设置参数

    jenkins如何部署应用到多个环境

    如上图所示,设置一个标识参数,是否部署到生产环境

    配置流水线

    流水线的配置,如下图所示,是整个项目配置的核心所在,我们需要在此处设置项目构建工具maven,拉取项目代码,构建项目代码,将打包后的文件上传到部署的服务器上,在远程服务器上启动应用以及最后的清理等步骤。

    jenkins如何部署应用到多个环境

    设置环境变量

    设置环境变量是为了将之前配置的参数写到环境变量中,供后续阶段使用

    environment {
    DEPLOY_TO_PROD = "${params.deployToProd}"
    }

    以上配置之后,后续便可以通过env.DEPLOY_TO_PROD进行引用。

    配置maven

    tools {
    maven "maven"
    }

    以上配置了项目的构建工具maven,maven的值是之前在全局设置中配置的,可参考之前的文章。

    http://www.devze.com

    stages {
    }

    配置了构建的阶段,可以在里面配置多个stage代码块,每个块代表一个阶段,如构建、部署测试、部署生产等。

    构建项目阶段

    在构建阶段,我们拉取代码,并使用maven进行构建,构建成功后,将构建成功的包进行归档,供后续阶段使用

    stage('构建') {
                steps {
                    // Get some code from a github repository
                    git branch: 'main', credentialsId: 'git', url: 'http://ip:port/projectName.git'
    
                    // Run Maven on a Unix agent.
                    sh "mvn -Dmaven.test.skip=true clean package"
                }
    
                post {
                    // If Maven was able to run the tests, even if some of the test
                    // failed, record the test results and archive the jar file.
                    success {
                        archiveArtifacts 'target/*.jar'
                        archiveArtifacts 'dockerfile'
                    }
                }
          python  }

    在stage中,通过steps配置当前阶段的构建步骤,在上述片段中,先拉取代码,并使用mvaven进行构建。

    post片段是在maven执行成功后进行构建,我们将项目构建成功后的jar包以及项目根目录下的Dockerfile进行归档。

    在下一个步骤中,会将归档后的文件上传到部署的服务器中。

    部署测试环境

    在将项目的部署文件归档后,便可以部署到测试环境了,片段如下

    jenkins如何部署应用到多个环境

    在上个阶段,我们配置的是部署到测试环境,首先使用ssh over publisher插件,将归档的构建上传到服务器,在post中,设置了success 片段,是在上传成功后执行的片段,在此我们使用sh 命令,在远程服务器上执行命令,本项目使用了docker,因此,ssh中的命令都是关于docker的,大家可以根据实际情况,进行调整。

    此外,需要注意 ssh -o StrictHostKeyChecking=no root@ip,其中ip是远程服务器的ip地址,需要提前配置私匙,之前文章有讲解,可以参考下。此处,无须设置密码的操作。

    部署生产环境

    在部署生产环境时,需要判断环境变量DEPLOY_TO_PROD是否符合条件,如果符合,则执行生产阶段的代码,否则不执行。

    如下图所示:

    jenkins如何部署应用到多个环境

    本例子中,实在生产环境部署了两台服务器,因此sshPublisher是两个,而在post中,使用了script脚本,因为要操作两台服务器,变脸执行每台服务器的命令,大家可以根据需要调整。

    清理阶段

    post {
            always {
                // 清理工作空间
                cleanWs()
            }
        }

    如上,执行部署完成后的清理操作。

    整体代码如下:

    pipeline {
        agent any
        parameters {
            choice(
                name: 'deployToProd',
                choices: ['否','是'],
                description: "如果需要部署到生产,选择【是】"
            )
        }
    
        environment {
            DEPLOY_TO_PROD = "${params.deployToProd}"
        }
    
        tools {
            // Install the Maven version configured as "M3" and add it to the path.
            maven "maven"
        }
    
        stages {
            stage('构建') {
                steps {
                    // Get some code from a GitHub repository
                    git branch: 'main', credentialsId: 'git', url: 'http://ip:port/projectName.git'
    
                    // Run Maven on a Unix agent.
                    sh "mvn -Dmaven.test.skip=true clean package"
                }
    
                post {
                    // If Maven was able to run the tests, even if some of the test
                    // faile编程客栈d, record the test results and archive the jar file.
                    success {
                        archiveArtifacts 'target/*.jar'
                        archiveArtifacts 'Dockerfile'
                    }
                }
            }
            
            
            stage("测试") {
                steps {
                    sshPublisher(publishers: [sshPublisherDesc(configName: 'ss', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo "s"', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'refine', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo "Success"', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'refine', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                }
                post {
                    success {
                        sh '''
                            ssh -o StrictHostKeyChecking=no root@remote_ip "
                                cd /编程客栈app/dir
    
                            "
                        '''
                    }
                }
            }
            
    
            stage('线上环境') {
                when {
                    expression { return env.DEPLOY_TO_PROD == '是' }
                }
                steps {
                    sshPublisher(publishers: [sshPublisherDesc(configName: '10_202', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo "s"', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'refine', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo "s"', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'refine', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                    sshPublisher(publishers: [sshPublisherDesc(configName: '10_201', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo "s"', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'refine', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo "s"', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: http://www.devze.com'[, ]+', remoteDirectory: 'refine', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                }
                post {
                    success {
                        script {
                            def servers = ['remote_ip1','remote_ip2']
                            servers.each { server ->
                                echo "Processing server: ${server}"
                                sh """
                                    ssh -o StrictHostKeyChecking=no root@${server} "
                                    cd /home/app/dir
                                    # 其他linux命令
                                    "
                                """
                            }
                        }
                    }
                    
                }
            }
        }
        post {
            always {
                // 清理工作空间
                cleanWs()
            }
        }
    }

    以上是完成的流水线代码,大家可以根据实际情况进行调整。

    jenkins如何部署应用到多个环境

    jenkins如何部署应用到多个环境

    部署效果,如上图所示!

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜