Jenkins多分支構建


一.創建多分支pipeline

在實際中,需要多分支同時進行開發。如果每個分支都創建一個Jenkins項目,比較多余。創建選擇 Multibranch Pipeline
file

1.設置代碼倉庫地址,也就是要選擇分支的倉庫地址

2.設置分支掃描觸發策略
分支掃描是指Jenkins根據一定的策略去代碼倉庫掃描分支,如果有新分支就創建一個以分支名命名的任務,如果發現有分支被刪除了,就刪除相應的Jenkins任務。
file

在"Scan Multibranch Pipeline Triggers"下就只有一一個可選項:Periodically if not otherwise run ( 沒有手動觸發,就定期掃描分支)。勾選此選項,設置掃描的間隔時長
file

讀者可根據項目建立分支的頻繁程度設置周期的長短。越頻繁建立分支,掃描周期應越短。當然我們也可以單擊任務頁面左側的"Scan Multibranch Pipeline Now"項,手動觸發Jenkins去掃描分支。

3.孤兒任務(Orphaned Item)處理策略
如果在代碼倉庫中刪除了release分支,那么在多分支任務頁面上,該分支在Jenkins上的任務也應該被刪除。至於什么時候刪除,取決於下次分支掃描的時間。如果代碼倉庫中的分支被刪除了,而Jenkins上的相應任務沒有被刪除,那么這個任務就被稱為孤兒任務。

對於分支任務上的歷史記錄,保存多長時間是可以設置的
file

參數含義:
Days to keep old items: 保留多少天
Max#of old items to keep:最多保留多少個孤兒任務

二.根據分支部署

git分支可以用於對代碼進行物理隔離。對分支的管理有很多方法,比如主干開發,發布分支以及Gitflow法等。我們不討論它們的好壞,但不論使用哪種分支管理方法,都可能會涉及一個問題:如何根據不同的分支做不同的事情,比如根據不同的分支部署到不同的環境。

類似這樣的事情可以使用if-else來實現

stage("deploy to test"){
    steps{
        script {
            if (env.GIT_BRANCH == 'master') {
                echo "deploy to test env"
            }
        }
    }
}

stage("deploy to prod"){
    steps{
        script {
            if (env.GIT_BRANCH == 'release') {
                echo "deploy to prod"
            }
        }
    }
}

但是這樣的代碼不夠優雅,而且不是聲明式的。使用when指令可以讓pipeline看起來更優雅。

stage("deploy to test") {
    when {
        branch 'master'
    }
    steps{
        echo "deploy to test"
    }
}

stage("deploy to prod") {
    when {
        branch 'release'
    }
    steps {
        echo "deploy to prod"
    }
}

gitlab觸發與多分支

對於GitLab來說,並沒有Jenkins多分支pipeline的概念,所以GitLab只會觸發Jenkins進行分支索引 ( branch index ) ,Jenkins可根據索引結果決定是否執行構建。對於多分支pipeline,Jenkins GitLab插件只監聽push事件,不監聽merge request事件。

而在Jenkins多分支pipeline項目的設置頁面中,是找不到GitLab配置項的。只能通過修改Jenkinsfile來實現,在triggers指令中加入gitlab配置。

triggers {
    gitlab(triggerOnPush: true,
    triggerOnMergeRequest: true,
    branchFilterType: 'Al1',
    secretToken: "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF")
}

值得一提的是,筆者通過實驗發現,對於不同的分支使用不同的secretToken時,是以master分支的secretToken為准的。

Generic Webhook多分支

pipeline場景下的應用在多分支pipeline場景下,我們希望觸發某個分支的構建執行,Generic Trigger可以這么傳參

triggers {
    GenericTrigger(
        genericVariables:[
            [key: 'ref' ,value: '$.ref']
        ],
        token: env.J0B_NAME,
        regexpFilterText: '$ref',
        regexpFilterExpression: 'refs/heads/' + env.BRANCH_NAME
    )
}


免責聲明!

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



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