楔子

最近公司推行統一構建平臺(基於 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 branchFilterTypeNameBasedFilter生效,監聽哪些分支的事件,多分支使用英文逗號分開 ""
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 branchFilterTypeNameBasedFilter生效,指定排除哪些分支的事件 ""
sourceBranchRegex 分支匹配型別為 RegexBasedFilter 時源分支正則 ""
targetBranchRegex 分支匹配型別為 RegexBasedFilter 時目標分支正則 ""
mergeRequestLabelFilterConfig 根據標籤過濾 Merge Request 配置 非 null
includeMergeRequestLabels mergeRequestLabelFilterConfig 塊中設定包含的 Merge Request 的標籤,多個標籤以英文逗號分隔 ""
excludeMergeRequestLabels mergeRequestLabelFilterConfig 塊中設定排除的 Merge Request 的標籤,多個標籤以英文逗號分隔 ""

原始碼及配置參考:

檢視 Jenkins 流水線觸發器

修改完成流水線,如果是版本控制的指令碼需提交再執行一下構建以更新觸發器配置。

配置 GitLab webhook

在需要新增提交/合併請求的倉庫上操作。

到這步配置完成就可以提交/合併請求測試構建是否被觸發了。

最後

文章看起來內容雖然不多,但官方給了幾個例子例子有點坑人,沒看到哪裡列出來各引數的作用,最坑的是 includeBranchesSpec 這個引數官方示例是 release/qat,導致誤認為多分支需要用 / 分開。。。

寫完這篇文章還是有收穫的——清楚了很多引數的作用,如果後續用到不會太抓瞎。

本文同步釋出於部落格園(東北小狐狸 https://www.cnblogs.com/hellxz/)與CSDN(東北小狐狸-Hellxz https://blog.csdn.net/u012586326)禁止轉載。