楔子
最近公司推行統一構建平台(基於 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)禁止轉載。