Jenkins教程(七)实现 GitLab 提交/合并代码触发构建
楔子
最近公司推行统一构建平台(基于 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 | branchFilterType 为 NameBasedFilter生效,监听哪些分支的事件,多分支使用英文逗号分开 |
"" |
| 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 | branchFilterType 为 NameBasedFilter生效,指定排除哪些分支的事件 |
"" |
| sourceBranchRegex | 分支匹配类型为 RegexBasedFilter 时源分支正则 |
"" |
| targetBranchRegex | 分支匹配类型为 RegexBasedFilter 时目标分支正则 |
"" |
| mergeRequestLabelFilterConfig | 根据标签过滤 Merge Request 配置 | 非 null |
| includeMergeRequestLabels | mergeRequestLabelFilterConfig 块中设置包含的 Merge Request 的标签,多个标签以英文逗号分隔 |
"" |
| excludeMergeRequestLabels | mergeRequestLabelFilterConfig 块中设置排除的 Merge Request 的标签,多个标签以英文逗号分隔 |
"" |
源码及配置参考:
- https://github.com/jenkinsci/gitlab-plugin/blob/master/src/main/java/com/dabsquared/gitlabjenkins/GitLabPushTrigger.java
- https://github.com/jenkinsci/gitlab-plugin/blob/master/src/main/resources/com/dabsquared/gitlabjenkins/GitLabPushTrigger/config.jelly
查看 Jenkins 流水线触发器
修改完成流水线,如果是版本控制的脚本需提交再执行一下构建以更新触发器配置。


配置 GitLab webhook
在需要添加提交/合并请求的仓库上操作。


到这步配置完成就可以提交/合并请求测试构建是否被触发了。
最后
文章看起来内容虽然不多,但官方给了几个例子例子有点坑人,没看到哪里列出来各参数的作用,最坑的是 includeBranchesSpec 这个参数官方示例是 release/qat,导致误认为多分支需要用 / 分开。。。
写完这篇文章还是有收获的——清楚了很多参数的作用,如果后续用到不会太抓瞎。
本文同步发布于博客园(东北小狐狸 https://www.cnblogs.com/hellxz/)与CSDN(东北小狐狸-Hellxz https://blog.csdn.net/u012586326)禁止转载。
Jenkins教程(七)实现 GitLab 提交/合并代码触发构建的更多相关文章
- Jenkins教程(四)安装BlueOcean与Maven构建
前言 本文旨在使用BlueOcean实现构建可视化与使用Maven构建上一节Jenkins教程(三)添加凭据与流水线拉取Git代码拉下来的代码 什么是Blue Ocean Blue Ocean 重新思 ...
- Jenkins + GitLab 通过 Webhook 自动触发构建爬坑记录
前言 在局域网搭建了一个Jenkins服务,用于自动构建和发布,在调通了构建程序之后,想使用内网的GitLab的Webhook功能触发代码推送事件,然后进行自动构建.后来发现在GitLab上做测试 ...
- SourceTree工具进行提交合并代码步骤
1.先安装SourceTree工具. beyong compare工具 2.在 SourceTree工具加载beyong compare插件 1.工具.选项.比较 2.就是修改.gitconfig文件 ...
- 【06】Jenkins:Gitlab 自动触发构建以及钉钉通知
写在前面的话 在某些时候,我们希望能够实现这样一个功能,当用户提交东西到 gitlab 上的时候,希望它能够自动触发构建,发布到我们需要的环境. 目前我们内部有做类似的需求:产品提交原型到 gitla ...
- Jenkins 实现前端自动打包,自动部署代码及邮件提醒功能
在之前的公司,我们前端使用webpack构建项目,项目构建完成后,我们会使用ftp或linux的一些命令工具上传我们的文件到服务器上,这种方式虽然是可以,但是最近面试的时候,人家会问我前端如何部署项目 ...
- Jenkins教程(八)实现 GitLab 触发 Jenkins 自动按模块发布前端
楔子 上篇文章解决了提交/合并请求自动触发的需求,但所有前端模块都在同一个代码仓库里,如何获取变更文件路径确定要发布哪个模块呢?本文将带你解决这个问题. 思路 分别解决 3 个问题: 获取变更的文件列 ...
- Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突
Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突 这篇是接着上篇分布式版本库--Windows下G ...
- Gitlab+Jenkins用钩子实现git提交后jenkins自动化构建
Gitlab+Jenkins用钩子实现git提交后jenkins自动化构建 一.Jenkins 进入项目---->Configure 1.设置项目代码从git中拉取 2.设置钩子程序 二.git ...
- ASP.NET 5系列教程(七)完结篇-解读代码
在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...
随机推荐
- 第一个Java文件
HelloWorld 1.新建一个文件夹,用来存放java文件的 2.用subline来编辑第一个Java文件 要注意的是java的文件名为.java 我们自定义的文件名是Hello 3.编写第一个j ...
- oracle、postgres、mysql数据库的建库、创建用户、导人导出备份总结
本文包含的内容:使用命令操作oracle.postgres.mysql的导入导出,登录到数据,创建用户 注:我在公司使用的是Center OS操作系统,所以oracle和postgres均是在Linu ...
- vue 快速入门 系列 —— vue-cli 下
其他章节请看: vue 快速入门 系列 Vue CLI 4.x 下 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...
- SpringBoot开发三
需求介绍-SpringMVC 服务层的三层架构:表现层,业务层,数据层,浏览器访问服务器先访问表现层,期待表现层返回一些数据,表现层呢就访问业务层处理业务,而业务层在处理业务的时候会调用数据层请求数据 ...
- Java通过SSLEngine与NIO实现HTTPS访问
Java使用NIO进行HTTPS协议访问的时候,离不开SSLContext和SSLEngine两个类.我们只需要在Connect操作.Connected操作.Read和Write操作中加入SSL相关的 ...
- Oracle 11g数据库下载安装教程
今天重装系统之后发现甲骨文的网站变化较大,下载安装废了一点时间,留下个笔记为以后再装留作参考.本教程是win10,64位系统环境下 1.下载 下载的时候需要登陆甲骨文账号,如果没有的话申请一个也挺快. ...
- 模拟7 T3 寿司题解
题目要求可以转化成一个01串,让通过最少次数把序列变成中间是0,两端是1: 首先我们可以考虑一些性质: 最优解一定是每次操作都把0和1交换 这个很好理解,如果你交换同一种东西,跟没换一样 这个题卡就卡 ...
- 百度地图开发-引入地图SDK并配置 02
百度地图开发-引入地图SDK并配置 02 通过上一篇文章的介绍,基本了解百度地图的基本信息,接下来就让我们一起来实际在项目中操作,显示出地图. 01 引入地图SDK 首先需要新建一个空白的Androi ...
- MySQL:互联网公司常用分库分表方案汇总!
转载别人 一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连接可用 ...
- mzy对于反射的复习
反射其实就是指在超脱规则的束缚,从强引用到弱相关,在上帝视角做事情,对于写配置文件,和一些框架的源码,得到调用上至关重要,java带有解释器的语法特性,使得泛型一类的语法糖和反射配合之后更如鱼得水! ...