原文:https://www.fxkjnj.com/3801/
背景需求:
最近公司在搞流水線集成,gitlab 和 jenkins 的自動構建的任務自然落在了我們運維的頭上,之前發佈開發和測試環境都是辛苦由我們的測試大大手動點的,公司項目越來越多,發現每次手動點,效率不高。本文基於gitlab的鉤子自動觸發jenkins構建,已達到自動發佈的目的【僅用於開發和測試環境】
環境:
- Jenkins 2.303.2
- GitLab Enterprise Edition 11.10.4-ee
- jenkins 插件 Generic Webhook Trigger Plugin
先說下坑 [某一博主發現的,後來實驗驗證是符合的]
2022.01.21更新:去除GitLab webhook的合併請求事件及移除gitlab插件觸發器無效合併請求配置。原因是合併請求創建時會誤觸發。實驗發現合併請求審批者同意合併時發起的是push請求,去除後不影響需要。
工作流程
如圖,GitLab 在開發者推送或合併代碼到 指定分支,觸發 webhook,向 webhook URL 發送一個 HTTP 請求(即 Jenkins 流水線配置觸發器的地址),Jenkins 獲得構建任務,判斷 構建任務分支是否爲指定分支,流水線觸發器啓動構建並自動化發佈
需要配置如下內容
- jenkins 安裝Generic Webhook Trigger Plugin 插件
- jenkins 配置流水線【自由風格 and pipeline 流水線】
- Gitlab 配置項目集成鉤子,並綁定 webhook
步驟一:安裝jenkins Generic Webhook Trigger Plugin 插件
步驟二: 配置流水線 【自由風格 項目類型】
- Build when a change is pushed to GitLab. GitLab webhook URL: XXXXXXXXXXXX , 記住這個URL地址,等會配置gitlab 鉤子需要使用到
- 勾選:Push Events
- 勾選:Comments
- 點擊,高級
- 勾選: Set build description to build cause (eg. Merge request or Git Push )
- 配置,指定分支 ,我這裏配置的是release 分支
- 點擊Generate 生成一個 Secret token, 記住這個Token地址,等會配置gitlab 鉤子需要使用到
- 保存,save
步驟三: Gitlab 配置項目集成鉤子,並綁定 webhook
- 代碼倉庫,設置,集成
- URL,把剛剛jenkins 上的webhook URL 貼到這裏
- Secret Token,把剛剛jenkins 上的Secret token 貼到這裏
- 勾選,Push events
- 勾選,Enable SSL verification
- Add webhook
步驟四: 測試下wehhook
還在剛剛配置gitlab 的集成配置頁面,找到webhook 列表,點擊 下拉選項裏的 Push events
可以看到,jenkins 已經自動獲取到webhook 的通知請求,並開始了構建
步驟五: 配置流水線 【pipeline 項目類型】
上面演示的流水線是基於自由風格類型去配置的,其實很多時候我們的job都是pipeline 流水線類型,這個就需要手動的寫pipeline
- triggerOnPush ,開啓Push Events 事件
- triggerOnMergeRequest ,關閉MergeRequest ;是否 Merge Request 事件時觸發,MR 包含創建、變更、接受等很多情況
- ciSkip,關閉 ci,允許 CI 跳過
- branchFilterType 和 includeBranchesSpec 是一個關聯,branchFilterType 爲 NameBasedFilter生效,監聽哪些分支的事件,多分支使用英文逗號分開
pipeline{
//Gitlab-webhook
triggers {
gitlab(
triggerOnPush: true,
triggerOnMergeRequest: false,
ciSkip: false,
branchFilterType: "NameBasedFilter",
includeBranchesSpec: "release",
secretToken: "XXXXXXXXXX"
)
}
修改完成流水線,需要執行一下構建以更新觸發器配置,也就是渲染出觸發器的配置
最後:
剛開始做的時候,根據網上提供的幾篇文章去測試,都發現一個問題,當開發者提交合並代碼的請求時,管理員還沒同意merge,gitlab webhook 就去通知jenkins 執行構建任務,管理員同意merge 後,jenkins 卻沒有收到任務構建任務。
後來發現 合併請求審批者同意合併時發起的是push請求,總以爲是merge請求,所以只需要在 jenkins 的job 裏 ,只勾選Push Events 【不能勾選Opened Merge Request Events,Accepted Merge Request Events】; gitlab 的webhook 設置裏 只設置 推送 Push events
參考
- gitlab自動觸發項目構建 https://www.kancloud.cn/noahs/linux/1539381
- Jenkins教程(七)實現 GitLab 提交/合併代碼觸發構建 https://blog.csdn.net/u012586326/article/details/120367345