在上一篇博客中,我们学习了Jenkins的搭建和插件+流水线的基本使用方法,Jenkins极大地提升了部署效率。

最近想学习一下如何集成GitLab webhook,实现进一步解放双手,目标:

  • 推送(git push)触发构建
  • 推送到指定分支触发构建
  • 根据commit的文件,结合mvn -pl 指令,实现部分增量构建,并记录commit信息

推送事件也可以换成Tag push eventsMerge 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触发构建的更多相关文章

  1. Jenkins+Gitlab配置Webhook实现提交自动部署

    一.概述 在上一篇文章,链接如下: https://www.cnblogs.com/xiao987334176/p/11434849.html 已经实现了 Jenkins+harbor+gitlab+ ...

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

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

  3. gitlab实现webhook触发jenkins 自动,构建,测试,push webhook构子 总结

    最新一直在学习 工作 + 学习 去掉 90%   所以blog  一直没更 真是很不好!  exsi ceph gitlab jenkins harbor k8s  docker-compose ap ...

  4. centos7 在docker swarm中运行Jenkins,利用gitlab的webhook触发自动部署脚本

    1.宿主机中创建目录 mkdir -p /jenkins_home 2.编辑compose文件,文件名jenkins.yml version: '3.4' services: jenkins-upgr ...

  5. jenkins持续集成:定时构建语法

    构建位置:选择或创建工程_设置_构建触发器 1. 定时构建语法:* * * * * (五颗星,多个时间点,中间用逗号隔开)第一个*表示分钟,取值0~59第二个*表示小时,取值0~23第三个*表示一个月 ...

  6. git+jenkins持续集成三-定时构建语法

    构建位置:选择或创建工程_设置_构建触发器 1. 定时构建语法:* * * * * (五颗星,多个时间点,中间用逗号隔开)第一个*表示分钟,取值0~59第二个*表示小时,取值0~23第三个*表示一个月 ...

  7. SpringCloud+Docker+Jenkins+GitLab+Maven实现自动化构建与部署实战

    1.前言与初衷 本文章会涉及Docker常见命令基础知识点结合不同场景实操一起使用. 本文章会涉及结合工作过程中部署不同环境服务器的项目案例场景为初心进行实际细讲. 本文章主要讲述Docker.Jen ...

  8. 使用gitlab, jenkins搭建CI(持续集成)系统(2) -- 配置webhook触发构建

    1. 在gitlab上配置192.168.1.30的ssh秘钥,使jenkins可以操作gitlab上的project 进入gitlab,点击右上角 点击 Settings -> SSH key ...

  9. 通过gitlab的webhook触发Jenkins自动构建设置

    1.Jenkins job中勾选Build when a change is pushed to GitLab 2.Gitlab project 页面setting选择Integrations,配置w ...

随机推荐

  1. 《学习笔记》.NET Core API搭建

    1.创建 ASP.NET Core Web程序,记住取消HTTPS配置 2.此时一个简单的.NET Core API 架子搭建好了,细心的人可以发现Properties下面不是CS文件,确是launc ...

  2. Node教程——API接口开发(Node版的CRUD通用接口的搭建)(MangoDB+Express_Version2)

    1. 概述 时间跨度有点大,之前就跟大家唠嗑过一些知识点,也开启了一个Node书写一个后台api项目的开始,出于各种原因,迟迟没有更新博文.现在我把这个坑填上,如果你还有阅读过我之前的文章,我建议你先 ...

  3. PAT 1011 World Cup Betting (20分) 比较大小难度级别

    题目 With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly exc ...

  4. 【比较】遗传算法GA和遗传编程GP有什么不同?

    遗传算法GA 本质上有一个固定的长度,这意味着所产生的功能有限的复杂性 通常会产生无效状态,因此需要以非破坏性方式处理这些状态 通常依赖于运算符优先级(例如,在我们的例子中,乘法发生在减法之前),这可 ...

  5. Redis学习笔记(十四)Sentinel(哨兵)(上)

    最近谈到Redis就会听到哨兵模式,工作期间同事也分享过关于哨兵模式的知识,但由于工作忙(给自己找个借口)没有没认真看,现在恶补下,老样子还是分上篇应用,下篇看实现过程,下面我们来看下哨兵到底是啥? ...

  6. HDU6040 Hints of sd0061

    题目链接:https://vjudge.net/problem/HDU-6040 题目大意: 给出 \(n\) 个数,有 \(m\) 次询问,每次询问这 \(n\) 个数中第 \(k+1\) 大的数是 ...

  7. Cypress系列(1)- Window下安装 Cypress 并打开

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 系统要求 Cypress 是一个被安装在 ...

  8. Spring MVC基于注解@Controller和@RequestMapping开发的一个例子

    1.创建web项目 2.在springmvc的配置文件中指定注解驱动,配置扫描器 在 Spring MVC 中使用扫描机制找到应用中所有基于注解的控制器类,所以,为了让控制器类被 Spring MVC ...

  9. 11.Java连接Redis_Jedis_测试联通

    使用Java开发项目的时候使用Redis的话,目前有一些开源API可以使用. 最常用的就是jedis,它提供了许多基于Java的对象和方法来调用Redis的指令. jedis的jar包下载地址http ...

  10. [基础-001]C++字符串转换(char*,const char*,string)

    1. string转const char* string str ="abc"; const char* charArr = str.c_str(); 2. const char* ...