最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

jenkins如何部署應(yīng)用到多個環(huán)境

 更新時間:2024年11月12日 09:55:14   作者:面朝大海,春不暖,花不開  
本文介紹了如何基于流水線的方式將應(yīng)用程序部署到多個環(huán)境,包括測試環(huán)境和生產(chǎn)環(huán)境,通過創(chuàng)建項目、設(shè)置參數(shù)、配置流水線、設(shè)置環(huán)境變量、配置Maven工具、構(gòu)建階段、部署測試環(huán)境和生產(chǎn)環(huán)境、以及清理階段,實現(xiàn)了自動化部署流程

jenkins部署應(yīng)用到多個環(huán)境

在日常開發(fā)的過程中,我們經(jīng)常會遇到將應(yīng)用程序部署到多個環(huán)境的需求場景,如會先發(fā)布到測試環(huán)境,由測試人員進行測試,成功之后,會繼續(xù)將當(dāng)前應(yīng)用部署到集成環(huán)境,進行集成測試,全部通過后,再繼續(xù)將應(yīng)用部署到生產(chǎn)環(huán)境,即完成一整個上線的流程。

本文將介紹如何基于流水線的方式,將應(yīng)用部署到多個環(huán)境,本次之多兩個環(huán)境,分別是測試環(huán)境和生產(chǎn)環(huán)境,可以根據(jù)實際情況進行優(yōu)化調(diào)整。

創(chuàng)建項目

如上,創(chuàng)建一個流水線的項目

設(shè)置參數(shù)

如上圖所示,設(shè)置一個標(biāo)識參數(shù),是否部署到生產(chǎn)環(huán)境

配置流水線

流水線的配置,如下圖所示,是整個項目配置的核心所在,我們需要在此處設(shè)置項目構(gòu)建工具maven,拉取項目代碼,構(gòu)建項目代碼,將打包后的文件上傳到部署的服務(wù)器上,在遠(yuǎn)程服務(wù)器上啟動應(yīng)用以及最后的清理等步驟。

設(shè)置環(huán)境變量

設(shè)置環(huán)境變量是為了將之前配置的參數(shù)寫到環(huán)境變量中,供后續(xù)階段使用

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

以上配置之后,后續(xù)便可以通過env.DEPLOY_TO_PROD進行引用。

配置maven

tools {
maven "maven"
}

以上配置了項目的構(gòu)建工具maven,maven的值是之前在全局設(shè)置中配置的,可參考之前的文章。

構(gòu)建

stages {
}

配置了構(gòu)建的階段,可以在里面配置多個stage代碼塊,每個塊代表一個階段,如構(gòu)建、部署測試、部署生產(chǎn)等。

構(gòu)建項目階段

在構(gòu)建階段,我們拉取代碼,并使用maven進行構(gòu)建,構(gòu)建成功后,將構(gòu)建成功的包進行歸檔,供后續(xù)階段使用

stage('構(gòu)建') {
            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配置當(dāng)前階段的構(gòu)建步驟,在上述片段中,先拉取代碼,并使用mvaven進行構(gòu)建。

post片段是在maven執(zhí)行成功后進行構(gòu)建,我們將項目構(gòu)建成功后的jar包以及項目根目錄下的Dockerfile進行歸檔。

在下一個步驟中,會將歸檔后的文件上傳到部署的服務(wù)器中。

部署測試環(huán)境

在將項目的部署文件歸檔后,便可以部署到測試環(huán)境了,片段如下

在上個階段,我們配置的是部署到測試環(huán)境,首先使用ssh over publisher插件,將歸檔的構(gòu)建上傳到服務(wù)器,在post中,設(shè)置了success 片段,是在上傳成功后執(zhí)行的片段,在此我們使用sh 命令,在遠(yuǎn)程服務(wù)器上執(zhí)行命令,本項目使用了docker,因此,ssh中的命令都是關(guān)于docker的,大家可以根據(jù)實際情況,進行調(diào)整。

此外,需要注意 ssh -o StrictHostKeyChecking=no root@ip,其中ip是遠(yuǎn)程服務(wù)器的ip地址,需要提前配置私匙,之前文章有講解,可以參考下。此處,無須設(shè)置密碼的操作。

部署生產(chǎn)環(huán)境

在部署生產(chǎn)環(huán)境時,需要判斷環(huán)境變量DEPLOY_TO_PROD是否符合條件,如果符合,則執(zhí)行生產(chǎn)階段的代碼,否則不執(zhí)行。

如下圖所示:

本例子中,實在生產(chǎn)環(huán)境部署了兩臺服務(wù)器,因此sshPublisher是兩個,而在post中,使用了script腳本,因為要操作兩臺服務(wù)器,變臉執(zhí)行每臺服務(wù)器的命令,大家可以根據(jù)需要調(diào)整。

清理階段

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

如上,執(zhí)行部署完成后的清理操作。

整體代碼如下:

pipeline {
    agent any
    parameters {
        choice(
            name: 'deployToProd',
            choices: ['否','是'],
            description: "如果需要部署到生產(chǎn),選擇【是】"
        )
    }

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

    tools {
        // Install the Maven version configured as "M3" and add it to the path.
        maven "maven"
    }

    stages {
        stage('構(gòu)建') {
            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('線上環(huán)境') {
            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()
        }
    }
}

以上是完成的流水線代碼,大家可以根據(jù)實際情況進行調(diào)整。

部署效果,如上圖所示!

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot整合hutool驗證碼的實例代碼

    Springboot整合hutool驗證碼的實例代碼

    在 Spring Boot 中,你可以將 Hutool 生成驗證碼的功能集成到 RESTful API 接口中,這篇文章主要介紹了Springboot整合hutool驗證碼,需要的朋友可以參考下
    2024-08-08
  • 關(guān)于kafka-consumer-offset位移問題

    關(guān)于kafka-consumer-offset位移問題

    這篇文章主要介紹了關(guān)于kafka-consumer-offset位移問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java關(guān)鍵字synchronized原理與鎖的狀態(tài)詳解

    Java關(guān)鍵字synchronized原理與鎖的狀態(tài)詳解

    在Java當(dāng)中synchronized關(guān)鍵字通常是用來標(biāo)記一個方法或者代碼塊。本文將通過示例為大家詳細(xì)介紹一下Synchronized的各種使用方法,需要的可以參考一下
    2022-08-08
  • nacos如何修改默認(rèn)的用戶名密碼

    nacos如何修改默認(rèn)的用戶名密碼

    這篇文章主要介紹了nacos如何修改默認(rèn)的用戶名密碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java實現(xiàn)代碼統(tǒng)計小程序

    java實現(xiàn)代碼統(tǒng)計小程序

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)代碼統(tǒng)計小程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • java讀取文件里面部分漢字內(nèi)容亂碼的解決方案

    java讀取文件里面部分漢字內(nèi)容亂碼的解決方案

    這篇文章主要介紹了java讀取文件里面部分漢字內(nèi)容亂碼的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java讀寫Cookie記錄的方法

    Java讀寫Cookie記錄的方法

    這篇文章主要介紹了Java讀寫Cookie記錄的方法,實例分析了java針對cookie記錄讀取與寫入的技巧,需要的朋友可以參考下
    2015-05-05
  • springboot+mybatis通過實體類自動生成數(shù)據(jù)庫表的方法

    springboot+mybatis通過實體類自動生成數(shù)據(jù)庫表的方法

    這篇文章主要介紹了springboot+mybatis通過實體類自動生成數(shù)據(jù)庫表的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • ThreadLocal內(nèi)存泄漏常見要點解析

    ThreadLocal內(nèi)存泄漏常見要點解析

    這篇文章主要介紹了ThreadLocal內(nèi)存泄漏常見要點,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Java Springboot 重要知識點整理匯總

    Java Springboot 重要知識點整理匯總

    Spring Boot作為微服務(wù)中最好的Java框架,本文主要為大家整理匯總了七個Spring Boot的重要知識點,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-11-11

最新評論

长岛县| 柳江县| 平凉市| 白沙| 芦溪县| 昆明市| 新巴尔虎右旗| 磐安县| 连州市| 三原县| 集贤县| 小金县| 会理县| 隆德县| 苗栗县| 昭苏县| 宣武区| 铜川市| 桓仁| 青神县| 蓬溪县| 大姚县| 安阳县| 荥阳市| 滁州市| 彭阳县| 武鸣县| 栾城县| 沙雅县| 普陀区| 铜川市| 靖江市| 嵩明县| 新营市| 寿宁县| 临桂县| 通河县| 安乡县| 外汇| 云南省| 呼伦贝尔市|