基于Gitlab钩子提交合并代码触发jenkins构建

641 阅读3分钟

基于Gitlab钩子提交合并代码触发jenkins构建

基于Gitlab钩子提交合并代码触发jenkins构建

背景需求:

  最近公司在搞流水线集成,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请求,去除后不影响需要。

image-20220417220919075

工作流程

image-20220417222916730

  如图,GitLab 在开发者推送或合并代码到 指定分支,触发 webhook,向 webhook URL 发送一个 HTTP 请求(即 Jenkins 流水线配置触发器的地址),Jenkins 获得构建任务,判断 构建任务分支是否为指定分支,流水线触发器启动构建并自动化发布

需要配置如下内容

  • jenkins 安装Generic Webhook Trigger Plugin 插件
  • jenkins 配置流水线【自由风格 and pipeline 流水线】
  • Gitlab 配置项目集成钩子,并绑定 webhook

步骤一:安装jenkins Generic Webhook Trigger Plugin 插件

image-20220417223526936

步骤二: 配置流水线 【自由风格 项目类型】

  • 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

image-20220417223838718

image-20220417224149324

步骤三: Gitlab 配置项目集成钩子,并绑定 webhook

  • 代码仓库,设置,集成
  • URL,把刚刚jenkins 上的webhook URL 贴到这里
  • Secret Token,把刚刚jenkins 上的Secret token 贴到这里
  • 勾选,Push events
  • 勾选,Enable SSL verification
  • Add webhook

image-20220417224528709

image-20220417224719631

步骤四: 测试下wehhook

还在刚刚配置gitlab 的集成配置页面,找到webhook 列表,点击 下拉选项里的 Push events

image-20220417225013278

可以看到,jenkins 已经自动获取到webhook 的通知请求,并开始了构建

image-20220417225348732

步骤五: 配置流水线 【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

参考