CICD | Jenkins & Gitlab集成:WebHook触发构建
在上一篇博客中,我们学习了Jenkins的搭建和插件+流水线的基本使用方法,Jenkins极大地提升了部署效率。
最近想学习一下如何集成GitLab webhook,实现进一步解放双手,目标:
- 推送(
git push)触发构建 - 推送到指定分支触发构建
- 根据
commit的文件,结合mvn -pl指令,实现部分增量构建,并记录commit信息
推送事件也可以换成Tag push events、Merge request events等其他触发条件,根据需要自由选择。
基础实现
使用Gitlab Hook Plugin,并在Jenkins和GitLab中分别配置。
下载并配置插件


在GitLab中配置




至此,目标中的前两条,推送构建和推送到指定分支构建实现!
进阶实现
从上述过程,我们也可以看出,WebHook的本质就是从GitLab发了一条请求,Jenkins配置了一个终端地址(endpoint)来接收,从而实现了两个步骤的串联。
这个请求实质上就是一条HTTP POST请求。
相信接触过服务互相调用的小伙伴们都不陌生。有了请求体,我们自然可以拿到自己想要的东西,进行进一步的处理了。

Jenkins插件:Generic WebHook Trigger Pugin

从插件简介来看,支持接收任何一个HTTP请求,当然也包括接收GitLab发送的请求。
在Jenkins Job中配置接收地址

配置鉴权token

我直接使用admin帐号创建,在发送请求时需要携带此token。
GitLab配置
在Gitlab中的配置与上文相同,格式为:
http://admin:${token}@${JENKINS_IP}:${PORT}/generic-webhook-trigger/invoke
填上刚刚配置生成的token和自己的Jenkins地址和端口即可。
同样可以使用自带的测试来测试连接,返回200成功。
- 如果返回
404,看配置的地址是否有误 - 返回
403,查看权限配置是否有误
至此,连接建立成功!
编写流水线脚本
关于如何使用声明式流水线,上一次的博客已有所介绍。这里主要说明如何加入触发器语法。
流水线触发器语法

要从请求体中拿到所需要的参数,可以通过配置获取JSONPath参数实现。
在流水线中加入下列语句,即可当作变量在流水线脚本中使用。
triggers {
GenericTrigger(
genericVariables: [
[key: 'branch', value: '$.ref'],
[key:'commitText', value:'$.commits']
],
causeString: 'Triggered on $branch' ,
printContributedVariables: false,
printPostContent: false
)
}
- 序列化JSON
要想在pipeline脚本中将字符串反序列化成JSON对象,可以引入Pipeline Utility Step插件,该插件提供了一些工具方法。

def commits = readJSON text: commitText
流水线脚本使用
Groovy语言,该语言基于Java编写,也集成了一些有趣的特性。在IDEA中编写只需要配置Groovy Library即可。
核心方法
- 根据commits,定义patternMap,匹配到指定正则文件格式,构建指定组件。
def modifiedFile = [];
for (commit in commits) {
modifiedFile.addAll(commit.getAt("added").findAll())
modifiedFile.addAll(commit.getAt("modified").findAll())
modifiedFile.addAll(commit.getAt("removed").findAll())
}
def buildComponents = new HashSet();
def patternMap = ['mark-engine-manager/.*': 'manager', 'mark-tools/.*': 'web','mark-engine-dm/.*':'dm','mark-engine-web/.*':'web',
'mark-engine-uc/.*':'uc','mark-engine-gateway/.*':'gateway'];
//遍历所有修改了的文件
for (file in modifiedFile) {
for(entry in patternMap.entrySet()){
if (file ==~ entry.key) {
buildComponents << entry.value;
}
}
}
- 根据需要构建的组件,拼接
maven构建指令。
String mvnCmd = 'mvn clean install -Dmaven.test.skip=true'
for(component in buildComponents){
mvnCmd = mvnCmd + ' -pl mark-engine-'+component+',';
}
经过调试和测试push,三个目标全部完成。
总结
一切都是代码,CICD当然也可以使用代码实现。经过实践我们可以探索出Jenkins更多有趣的玩法。
CICD | Jenkins & Gitlab集成:WebHook触发构建的更多相关文章
- Jenkins+Gitlab配置Webhook实现提交自动部署
一.概述 在上一篇文章,链接如下: https://www.cnblogs.com/xiao987334176/p/11434849.html 已经实现了 Jenkins+harbor+gitlab+ ...
- Jenkins + GitLab 通过 Webhook 自动触发构建爬坑记录
前言 在局域网搭建了一个Jenkins服务,用于自动构建和发布,在调通了构建程序之后,想使用内网的GitLab的Webhook功能触发代码推送事件,然后进行自动构建.后来发现在GitLab上做测试 ...
- gitlab实现webhook触发jenkins 自动,构建,测试,push webhook构子 总结
最新一直在学习 工作 + 学习 去掉 90% 所以blog 一直没更 真是很不好! exsi ceph gitlab jenkins harbor k8s docker-compose ap ...
- centos7 在docker swarm中运行Jenkins,利用gitlab的webhook触发自动部署脚本
1.宿主机中创建目录 mkdir -p /jenkins_home 2.编辑compose文件,文件名jenkins.yml version: '3.4' services: jenkins-upgr ...
- jenkins持续集成:定时构建语法
构建位置:选择或创建工程_设置_构建触发器 1. 定时构建语法:* * * * * (五颗星,多个时间点,中间用逗号隔开)第一个*表示分钟,取值0~59第二个*表示小时,取值0~23第三个*表示一个月 ...
- git+jenkins持续集成三-定时构建语法
构建位置:选择或创建工程_设置_构建触发器 1. 定时构建语法:* * * * * (五颗星,多个时间点,中间用逗号隔开)第一个*表示分钟,取值0~59第二个*表示小时,取值0~23第三个*表示一个月 ...
- SpringCloud+Docker+Jenkins+GitLab+Maven实现自动化构建与部署实战
1.前言与初衷 本文章会涉及Docker常见命令基础知识点结合不同场景实操一起使用. 本文章会涉及结合工作过程中部署不同环境服务器的项目案例场景为初心进行实际细讲. 本文章主要讲述Docker.Jen ...
- 使用gitlab, jenkins搭建CI(持续集成)系统(2) -- 配置webhook触发构建
1. 在gitlab上配置192.168.1.30的ssh秘钥,使jenkins可以操作gitlab上的project 进入gitlab,点击右上角 点击 Settings -> SSH key ...
- 通过gitlab的webhook触发Jenkins自动构建设置
1.Jenkins job中勾选Build when a change is pushed to GitLab 2.Gitlab project 页面setting选择Integrations,配置w ...
随机推荐
- ScheduleMaster新特性之延时任务初体验
ScheduleMaster在上个月底更新到了2.0版本,在功能和代码以及文档上都往前跨了很大一步,详细信息可以参考这篇文章:https://www.cnblogs.com/hohoa/p/12772 ...
- Java并发编程:线程池ThreadPoolExecutor
多线程的程序的确能发挥多核处理器的性能.虽然与进程相比,线程轻量化了很多,但是其创建和关闭同样需要花费时间.而且线程多了以后,也会抢占内存资源.如果不对线程加以管理的话,是一个非常大的隐患.而线程池的 ...
- 转帖 支撑4.5亿活跃用户的WhatsApp架构概览
http://www.csdn.net/article/2014-02-27/2818559-an-overview-at-whatsapp's-19b-architecture/2 写的很好,确实牛 ...
- 2.2 Go变量类型
内置类型 值类型: bool 布尔类型 int(32 or 64), int8, int16, int32, int64 整数类型 uint(32 or 64), uint8(byte), uint1 ...
- 苏浪浪 201771010120 面向对象程序设计(Java)第13周
/实验十三 图形界面事件处理技术 1.实验目的与要求 (1) 掌握事件处理的基本原理,理解其用途: (2) 掌握AWT事件模型的工作机制: (3) 掌握事件处理的基本编程模型: (4) 了解GUI界 ...
- sqoop-介绍及安装
1.sqoop概述 sqoop是Apache旗下一款hadoop和关系数据库服务器之间传送数据的工具: 核心的功能: 导入,迁入(从关系型数据库-->hdfs hive hbase) 导出,迁出 ...
- Docker虚拟机配置手札(centos)
一.Docker只支持CentOS7及以上系统,不支持6.x系统 二.yum安装Docker 1.安装相关环境和设置仓库 yum install -y yum-utils device-mapper- ...
- [ES6系列-05]字符串相关操作更方便
[原创] 码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs 今天的内容是,关于 ES6 JavaScript ...
- Springboot 内置tomcat 基本配置收集整理
配置一: server:# tomcat 配置 tomcat: # 接收队列长度 accept-count: 1000 # 最小空闲线程数 min-spare-threads ...
- JVM系列.JDK演进历史
Java程序员为什么要了解虚拟机相关的知识 Java程序在设计之初就号称"一次编译,到处运行".Java之所以能做到"一次编译,处处运行"是因为Java虚拟机隐 ...