一.創建多分支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
)
}