首页 技术 正文
技术 2022年11月18日
0 收藏 632 点赞 4,591 浏览 2125 个字

在上一篇博客中,我们学习了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更多有趣的玩法。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,077
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,552
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,401
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,176
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,813
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,897