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

 更新时间:2024年11月12日 09:55:14   作者:面朝大海,春不暖,花不开  
本文介绍了如何基于流水线的方式将应用程序部署到多个环境,包括测试环境和生产环境,通过创建项目、设置参数、配置流水线、设置环境变量、配置Maven工具、构建阶段、部署测试环境和生产环境、以及清理阶段,实现了自动化部署流程

jenkins部署应用到多个环境

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

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

创建项目

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

设置参数

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

配置流水线

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

设置环境变量

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

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

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

配置maven

tools {
maven "maven"
}

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

构建

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'
                }
            }
        }

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

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

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

部署测试环境

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

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

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

部署生产环境

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

如下图所示:

本例子中,实在生产环境部署了两台服务器,因此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
                // failed, 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: '[, ]+', 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()
        }
    }
}

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

部署效果,如上图所示!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 生产者消费者模型ThreadLocal原理及实例详解

    生产者消费者模型ThreadLocal原理及实例详解

    这篇文章主要介绍了生产者消费者模型ThreadLocal原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java实现简单酒店管理系统

    Java实现简单酒店管理系统

    这篇文章主要为大家详细介绍了Java实现简单酒店管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • java9开始——接口中可以定义private私有方法

    java9开始——接口中可以定义private私有方法

    这篇文章主要介绍了从java9开始 接口中可以定义private私有方法,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-10-10
  • Mybatis实现分页的注意点

    Mybatis实现分页的注意点

    Mybatis提供了强大的分页拦截实现,可以完美的实现分功能。下面小编给大家分享小编在使用拦截器给mybatis进行分页所遇到的问题及注意点,需要的朋友一起看看吧
    2017-07-07
  • Mybatis Plus 逆向工程介绍

    Mybatis Plus 逆向工程介绍

    这篇文章主要介绍了Mybatis Plus 逆向工程,文章通过Mybatis Plus 逆向工程相关资料及示例代码详细介绍,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考一下
    2022-01-01
  • 一文教会你使用jmap和MAT进行堆内存溢出分析

    一文教会你使用jmap和MAT进行堆内存溢出分析

    本文介绍关于jmap和MAT的使用来进行堆内存溢出分析,因为这个内存溢出是我们手动构造出来的,查找比较简单,真的到了生产上面需要我们仔细排除
    2021-09-09
  • Springboot使用RabbitMQ实现关闭超时订单(示例详解)

    Springboot使用RabbitMQ实现关闭超时订单(示例详解)

    介绍了如何在Spring Boot项目中使用RabbitMQ实现订单的延时处理和超时关闭,通过配置RabbitMQ的交换机、队列和绑定关系,以及编写监听方法,实现了订单数据的发送和延时消费,感兴趣的朋友一起看看吧
    2025-01-01
  • java  StringBuilder类的详解及简单实例

    java StringBuilder类的详解及简单实例

    这篇文章主要介绍了java StringBuilder类的详解及简单实例的相关资料,实现了StringBuilder类的追加、插入、替换、删除等操作,需要的朋友可以参考下
    2017-08-08
  • SpringBoot的监控及使用详解

    SpringBoot的监控及使用详解

    这篇文章主要介绍了SpringBoot的监控及使用详解,Spring Boot提供了一系列的监控功能,方便开发人员对应用程序进行监控和管理,本文将讨论 Spring Boot中的监控功能及其使用方法,需要的朋友可以参考下
    2023-07-07
  • Java 深入理解创建型设计模式之建造者模式

    Java 深入理解创建型设计模式之建造者模式

    建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用
    2022-02-02

最新评论