楔子
最近公司推行統一構建平臺(基於 Jenkins + Kubernetes 外掛建立 slave),原來部門自建的 Jenkins 不讓用了。
遷移上統一構建平臺的最大阻力是前端模組釋出的問題:
- 前端單倉庫全量構建/釋出,安裝依賴有快取在小型機上跑著效率還行,如果遷到公司平臺上效能相對低些,又沒依賴快取,構建一次需要拉下約 15G 的依賴!
- 迭代分支僅允許合併分支,通過 GitLab API 取不到 Merge Request 變更檔案列表。
基於這個問題,研究了一下午 GitLab Plugin 官方文件和倉庫,實現了 Jenkins 宣告式流水線 GitLab 提交/合併程式碼觸發構建,記錄下來。
流程
如圖,GitLab 在開發者推送或合併程式碼時觸發 webhook,向 webhook URL 傳送一個 HTTP 請求(即 Jenkins 流水線配置觸發器的地址),Jenkins 流水線觸發器啟動構建與釋出流程。
所以,實現需求只做以下兩件事:
- 配置 Jenkins 流水線,新增觸發器
- GitLab 繫結 webhook
本著快速解決問題,再夾帶擴充套件知識的原則,接下來我們先講如何配置,更多引數將放到最後。
配置
配置 Jenkins 流水線,新增GitLab觸發器
pipeline{
//省略無關配置
triggers {
gitlab(
triggerOnPush: true,
triggerOnMergeRequest: false,
triggerOpenMergeRequestOnPush: "never",
acceptMergeRequestOnSuccess: false,
triggerOnApprovedMergeRequest: true,
branchFilterType: "NameBasedFilter",
includeBranchesSpec: "develop",
secretToken: "thisisfrontendpublish"
)
}
//省略無關配置
}
以上配置引數說明:
引數名 | 引數說明 | 預設值 |
---|---|---|
triggerOnPush | 是否 Push 事件時觸發 | true |
triggerOnMergeRequest | 是否 Merge Request 事件時觸發,MR 包含建立、變更、接受等很多情況 | true |
triggerOpenMergeRequestOnPush | Merge Request 中源分支或目的分支被Push時觸發 | false |
acceptMergeRequestOnSuccess | 構建成功時向GitLab發起接收 Merge Request 事件 | false |
triggerOnApprovedMergeRequest | MR 被批准時觸發 | true |
branchFilterType | 分支匹配型別:基於名稱 NameBasedFilter ,基於正則表示式 RegexBasedFilter ,兩者混用 ALL |
ALL |
includeBranchesSpec | branchFilterType 為 NameBasedFilter 生效,監聽哪些分支的事件,多分支使用英文逗號分開 |
"" |
secretToken | 類似一個密碼,用於外部呼叫此工程時校驗 | "" |
更多引數說明:
引數名 | 引數說明 | 預設值 |
---|---|---|
triggerToBranchDeleteRequest | 刪除分支時觸發 | false |
triggerOnlyIfNewCommitsPushed | 僅當新提交推送時 | false |
triggerOnAcceptedMergeRequest | 與 acceptMergeRequestOnSuccess 類似 |
false |
triggerOnClosedMergeRequest | 關閉 Merge Request 時觸發 | false |
triggerOnNoteRequest | 註釋觸發,根據提交時寫的註釋觸發 | true |
noteRegex | 註釋觸發正則表示式 | Jenkins please retry a build |
ciSkip | 允許 CI 跳過 | true |
skipWorkInProgressMergeRequest | 跳過正在合併過程中的 Merge Request | true |
setBuildDescription | 是否新增構建觸發原因描述 | true |
triggerOnPipelineEvent | GitLab Pipeline 事件觸發 | false |
cancelPendingBuildsOnUpdate | 當原始碼更新時取消正在 Pending 狀態的構建,適當開啟有助於減少構建次數,畢竟大家只關心最新的構建結果 | false |
excludeBranchesSpec | branchFilterType 為 NameBasedFilter 生效,指定排除哪些分支的事件 |
"" |
sourceBranchRegex | 分支匹配型別為 RegexBasedFilter 時源分支正則 |
"" |
targetBranchRegex | 分支匹配型別為 RegexBasedFilter 時目標分支正則 |
"" |
mergeRequestLabelFilterConfig | 根據標籤過濾 Merge Request 配置 | 非 null |
includeMergeRequestLabels | mergeRequestLabelFilterConfig 塊中設定包含的 Merge Request 的標籤,多個標籤以英文逗號分隔 |
"" |
excludeMergeRequestLabels | mergeRequestLabelFilterConfig 塊中設定排除的 Merge Request 的標籤,多個標籤以英文逗號分隔 |
"" |
原始碼及配置參考:
- https://github.com/jenkinsci/gitlab-plugin/blob/master/src/main/java/com/dabsquared/gitlabjenkins/GitLabPushTrigger.java
- https://github.com/jenkinsci/gitlab-plugin/blob/master/src/main/resources/com/dabsquared/gitlabjenkins/GitLabPushTrigger/config.jelly
檢視 Jenkins 流水線觸發器
修改完成流水線,如果是版本控制的指令碼需提交再執行一下構建以更新觸發器配置。
配置 GitLab webhook
在需要新增提交/合併請求的倉庫上操作。
到這步配置完成就可以提交/合併請求測試構建是否被觸發了。
最後
文章看起來內容雖然不多,但官方給了幾個例子例子有點坑人,沒看到哪裡列出來各引數的作用,最坑的是 includeBranchesSpec
這個引數官方示例是 release/qat
,導致誤認為多分支需要用 /
分開。。。
寫完這篇文章還是有收穫的——清楚了很多引數的作用,如果後續用到不會太抓瞎。
本文同步釋出於部落格園(東北小狐狸 https://www.cnblogs.com/hellxz/)與CSDN(東北小狐狸-Hellxz https://blog.csdn.net/u012586326)禁止轉載。