基于Gitlab钩子提交合并代码触发jenkins构建
原文: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
作者:沐雪
文章均系作者原创或翻译,如有错误不妥之处,欢迎各位批评指正。本文版权归作者和博客园共有,如需转载恳请注明。
如果您觉得阅读这篇博客让你有所收获,请点击右下方【推荐】
为之网-热爱软件编程 http://www.weizhi.cc/