Jenkins打造多分支流水線指南


overview:

多分支工作流程帶來了以下幾個關鍵能力:

  1. 在代碼倉庫中,每個新分支都有自己單獨的工作流水線(job)。
  2. 每個工作流水線都記錄了對應分支的構建和變更歷史。
  3. 可以自定義設置流水線隨着分支的刪除而刪除或修建。
  4. 通過重寫父屬性(如果需要),可以靈活地單獨配置分支流水線屬性。

Jenkins pipeline-as-code 使您可以在項目/應用程序源代碼存儲庫中維護CI / CD工作流邏輯,而無需在Jenkins中為每個分支維護其配置。用於構建/測試/部署的流水線代碼始終和你的項目/應用程序源代碼同步。在倉庫中我們用jenkinsfile對流水線代碼進行描述。關於jenkinsfile,其簡介及語法可參考官方文檔


do it:

1.jenkins需要安裝多分支流水線插件:

首先打開插件中心:jenkins>Manage Jenkins>Manage Plugins

並且安裝如下兩個插件(有可能已經安裝了):

image-20200403153130615

2.新建一個多分支流水線項目:

2.1 jenkins>新建Item

image-20200403153717166

2.2 填寫項目,代碼源相關信息

image-20200403155115959

創建完之后在首頁會顯示

image-20200403155507717

創建完成。

3.接下來在我們的項目根目錄添加jenkinsfile(以下用已經存在的項目做演示)

image-20200403155829285

然后在Jenkinsfile中編寫流水線代碼(pipeline代碼語法請參考 語法,以下為示例

pipeline {
    options {
        buildDiscarder(logRotator(numToKeepStr: '7', artifactNumToKeepStr: '10', daysToKeepStr: '5'))
        timeout(time: 12, unit: 'MINUTES')
        disableConcurrentBuilds()
    }
    agent {
        label 'master'
    }

    environment {
        JOB_NAME = 'pipeline-demo'
    }

    parameters {
            booleanParam(name: 'FAST_MODE', defaultValue: false, description: '此操作將會跳過單元測試以及代碼質量檢查。')
    }

    stages {
        stage('pipeline環境准備') {

            steps {
                script {
                    echo "開始構建"
                    if(!env.BRANCH_NAME.startsWith('feature-') && !env.BRANCH_NAME.startsWith('release-')){
                        error("自動構建分支名稱必須以feature-或release-開頭,當前分支名稱為: ${env.BRANCH_NAME}")
                    }

                    if (env.BRANCH_NAME.startsWith('feature-') ) {
                        env.env = "beta"
                    }
                    if (env.BRANCH_NAME.startsWith('release-')) {
                        env.env = "stage"
                    }

                    sh "echo 當前分支 : ${env.BRANCH_NAME}"
                    sh "echo 當前環境 : ${env.env}"
                    sh "echo 當前提交 : ${env.commit}"
                    sh "echo WORKSPACE : ${env.WORKSPACE}"
                    sh "echo GIT_BRANCH : ${env.GIT_BRANCH}"
                    sh "echo BUILD_NUMBER : ${env.BUILD_NUMBER}"
                    sh "echo JOB_NAME : ${env.JOB_NAME}"
                    sh "./mvnw -v"
                    sh "java -version"
                }
            }
        }

        stage("運行測試&收集報告"){
            when{
                expression {
                    params.FAST_MODE == false
                }
            }
           steps{
                script {
                    echo "開始運行測試"
                    sh "./mvnw clean test jacoco:report"
                }
           }
        }

        stage('代碼靜態檢查') {
            when{
                expression {
                    params.FAST_MODE == false
                }
            }
            steps {
                withSonarQubeEnv( installationName: 'sonar_server') {
                    sh './mvnw sonar:sonar'
                }
            }
        }

        stage("檢查結果分析") {
            when{
                expression {
                    params.FAST_MODE == false
                }
            }
            steps {
                timeout(time: 1, unit: 'HOURS') {
                    waitForQualityGate abortPipeline: true
                }
            }
        }


        stage("發布應用") {
            steps {
                script {
                    echo "開始發布"
                    sh "curl --location --request POST 'http://0.0.0.0:8080/job/${env.JOB_NAME}/buildWithParameters' \
                        --header 'Authorization: ${env.ecarx_jenkins_auth}' \
                        --form 'env=${env.env}' \
                        --form 'branchname=origin/${env.BRANCH_NAME}'"
                }
            }
        }
    }
}

4.在我們的代碼倉庫中添加webhook

如下(示例中使用gitlab,如果是其他倉庫,可參考各倉庫文檔):

https://images.cnblogs.com/cnblogs_com/dongxishaonian/1688642/o_200403081043image-20200403160957637.png

上圖中一系列trigger的多選框,我們只選push事件,意味着在push的時候觸發jenkins構建。
之后點擊add webhook保存。

⚠️:每個不同的代碼倉庫可能webhook地址的組成不同,所以添加前可查看各個倉庫文檔。

准備就緒。

5.push代碼

將帶有Jenkinsfile的項目代碼push的遠程代碼倉庫,回到jenkins控制台

image-20200403161653851

每當有分支push代碼時,都會自動觸發Jenkins的自動構建。

image-20200403162112928

從而實現ci/cd。

6.總結:

jenkins能讓我們輕松實現持續集成/持續部署(ci/cd)。ci/cd讓我們實現代碼質量內建,ci/cd中最重要的是測試自動化,沒有自動化測試的持續集成只是一堆不會帶來任何用處的垃圾。我們在流水線中嵌入測試自動化,代碼質量檢查來保證我們的開發質量。流水線能夠及時給開發者反饋,這種反饋非常重要,當我們的流水線失敗的時候,我們需要第一時間修復它,從而斷絕錯誤進一步積累(解決錯誤最好的時機就是錯誤出現的那一刻),而不是繼續開發別的功能。否則等到失敗積累到一定程度,我們在去修復的時候,需要付出的成本將是更大的。


關注筆者公眾號,推送各類原創/優質技術文章 ⬇️


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM