楔子

最近公司推行统一构建平台(基于 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)禁止转载。

Jenkins教程(七)实现 GitLab 提交/合并代码触发构建的更多相关文章

  1. Jenkins教程(四)安装BlueOcean与Maven构建

    前言 本文旨在使用BlueOcean实现构建可视化与使用Maven构建上一节Jenkins教程(三)添加凭据与流水线拉取Git代码拉下来的代码 什么是Blue Ocean Blue Ocean 重新思 ...

  2. Jenkins + GitLab 通过 Webhook 自动触发构建爬坑记录

    前言   在局域网搭建了一个Jenkins服务,用于自动构建和发布,在调通了构建程序之后,想使用内网的GitLab的Webhook功能触发代码推送事件,然后进行自动构建.后来发现在GitLab上做测试 ...

  3. SourceTree工具进行提交合并代码步骤

    1.先安装SourceTree工具. beyong compare工具 2.在 SourceTree工具加载beyong compare插件 1.工具.选项.比较 2.就是修改.gitconfig文件 ...

  4. 【06】Jenkins:Gitlab 自动触发构建以及钉钉通知

    写在前面的话 在某些时候,我们希望能够实现这样一个功能,当用户提交东西到 gitlab 上的时候,希望它能够自动触发构建,发布到我们需要的环境. 目前我们内部有做类似的需求:产品提交原型到 gitla ...

  5. Jenkins 实现前端自动打包,自动部署代码及邮件提醒功能

    在之前的公司,我们前端使用webpack构建项目,项目构建完成后,我们会使用ftp或linux的一些命令工具上传我们的文件到服务器上,这种方式虽然是可以,但是最近面试的时候,人家会问我前端如何部署项目 ...

  6. Jenkins教程(八)实现 GitLab 触发 Jenkins 自动按模块发布前端

    楔子 上篇文章解决了提交/合并请求自动触发的需求,但所有前端模块都在同一个代码仓库里,如何获取变更文件路径确定要发布哪个模块呢?本文将带你解决这个问题. 思路 分别解决 3 个问题: 获取变更的文件列 ...

  7. Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突

    Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突 这篇是接着上篇分布式版本库--Windows下G ...

  8. Gitlab+Jenkins用钩子实现git提交后jenkins自动化构建

    Gitlab+Jenkins用钩子实现git提交后jenkins自动化构建 一.Jenkins 进入项目---->Configure 1.设置项目代码从git中拉取 2.设置钩子程序 二.git ...

  9. ASP.NET 5系列教程(七)完结篇-解读代码

    在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...

随机推荐

  1. 第一个Java文件

    HelloWorld 1.新建一个文件夹,用来存放java文件的 2.用subline来编辑第一个Java文件 要注意的是java的文件名为.java 我们自定义的文件名是Hello 3.编写第一个j ...

  2. oracle、postgres、mysql数据库的建库、创建用户、导人导出备份总结

    本文包含的内容:使用命令操作oracle.postgres.mysql的导入导出,登录到数据,创建用户 注:我在公司使用的是Center OS操作系统,所以oracle和postgres均是在Linu ...

  3. vue 快速入门 系列 —— vue-cli 下

    其他章节请看: vue 快速入门 系列 Vue CLI 4.x 下 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...

  4. SpringBoot开发三

    需求介绍-SpringMVC 服务层的三层架构:表现层,业务层,数据层,浏览器访问服务器先访问表现层,期待表现层返回一些数据,表现层呢就访问业务层处理业务,而业务层在处理业务的时候会调用数据层请求数据 ...

  5. Java通过SSLEngine与NIO实现HTTPS访问

    Java使用NIO进行HTTPS协议访问的时候,离不开SSLContext和SSLEngine两个类.我们只需要在Connect操作.Connected操作.Read和Write操作中加入SSL相关的 ...

  6. Oracle 11g数据库下载安装教程

    今天重装系统之后发现甲骨文的网站变化较大,下载安装废了一点时间,留下个笔记为以后再装留作参考.本教程是win10,64位系统环境下 1.下载 下载的时候需要登陆甲骨文账号,如果没有的话申请一个也挺快. ...

  7. 模拟7 T3 寿司题解

    题目要求可以转化成一个01串,让通过最少次数把序列变成中间是0,两端是1: 首先我们可以考虑一些性质: 最优解一定是每次操作都把0和1交换 这个很好理解,如果你交换同一种东西,跟没换一样 这个题卡就卡 ...

  8. 百度地图开发-引入地图SDK并配置 02

    百度地图开发-引入地图SDK并配置 02 通过上一篇文章的介绍,基本了解百度地图的基本信息,接下来就让我们一起来实际在项目中操作,显示出地图. 01 引入地图SDK 首先需要新建一个空白的Androi ...

  9. MySQL:互联网公司常用分库分表方案汇总!

    转载别人 一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连接可用 ...

  10. mzy对于反射的复习

    反射其实就是指在超脱规则的束缚,从强引用到弱相关,在上帝视角做事情,对于写配置文件,和一些框架的源码,得到调用上至关重要,java带有解释器的语法特性,使得泛型一类的语法糖和反射配合之后更如鱼得水! ...