1. 程式人生 > 其它 >Jenkins多分支構建

Jenkins多分支構建

目錄

一.建立多分支pipeline

在實際中,需要多分支同時進行開發。如果每個分支都建立一個Jenkins專案,比較多餘。建立選擇 Multibranch Pipeline

1.設定程式碼倉庫地址,也就是要選擇分支的倉庫地址

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

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

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

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

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

引數含義:
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
    )
}
本文版權歸作者所有,歡迎轉載,請務必新增原文連結。