CICD | Jenkins & Gitlab集成:WebHook触发构建
2020-06-04 22:33
134 查看
在上一篇博客:CICD:Jenkins入门和使用中,我们学习了
Jenkins的搭建和插件+流水线的基本使用方法,
Jenkins极大地提升了部署效率。 最近想学习一下如何集成
GitLab webhook,实现进一步解放双手,目标:
- 推送(
git push
)触发构建 - 推送到指定分支触发构建
- 根据
commit
的文件,结合mvn -pl
指令,实现部分增量构建,并记录commit
信息
推送事件也可以换成
Tag push events、
Merge request events等其他触发条件,根据需要自由选择。
基础实现
使用
Gitlab Hook Plugin,并在Jenkins和GitLab中分别配置。
下载并配置插件
在Jenkins 插件管理中搜索并安装插件: 在Jenkins Job中配置:
在GitLab
中配置
在GitLab中配置: 规避鉴权可以直接在Jenkins中配置允许访问,将图示勾选方框里的勾去掉即可: 配置完成后,可以在GitLab中测试 接口返回200,出现如图所示提醒,配置成功! 到Jenkins里查看,可以看到该Job已经开始构建了。
至此,目标中的前两条,推送构建和推送到指定分支构建实现!
进阶实现
从上述过程,我们也可以看出,
WebHook的本质就是从
GitLab发了一条请求,
Jenkins配置了一个终端地址(
endpoint)来接收,从而实现了两个步骤的串联。 这个请求实质上就是一条
HTTP POST请求。 相信接触过服务互相调用的小伙伴们都不陌生。有了请求体,我们自然可以拿到自己想要的东西,进行进一步的处理了。 请求体内容:
Jenkins插件:Generic WebHook Trigger Pugin
下载并配置Generic WebHook Trigger Pugin 从插件简介来看,支持接收任何一个
HTTP请求,当然也包括接收
GitLab发送的请求。
在Jenkins Job
中配置接收地址
构建触发器配置
配置鉴权token
在Jenkins用户管理中配置鉴权token
我直接使用
admin帐号创建,在发送请求时需要携带此token。
GitLab配置
在Gitlab中的配置与上文相同,格式为:
http://admin:${token}@${JENKINS_IP}:${PORT}/generic-webhook-trigger/invoke填上刚刚配置生成的
token和自己的
Jenkins地址和端口即可。 同样可以使用自带的测试来测试连接,返回200成功。
- 如果返回
404
,看配置的地址是否有误 - 返回
403
,查看权限配置是否有误 至此,连接建立成功!
编写流水线脚本
关于如何使用声明式流水线,上一次的博客已有所介绍。这里主要说明如何加入触发器语法。
流水线触发器语法
从JSONPath中获取参数: 要从请求体中拿到所需要的参数,可以通过配置获取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
插件,该插件提供了一些工具方法。 下载并安装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触发代码提交自动构建任务
- 使用gitlab, jenkins搭建CI(持续集成)系统(2) -- 配置webhook触发构建
- gitlab push代码通过webhooks自动触发jenkins构建设置
- 持续集成之④:GitLab触发jenkins构建项目
- 持续集成之GitLab触发Jenkins构建项目
- Gitlab利用Webhook实现Push代码后的jenkins自动构建
- webhook实现提交代码自动触发Jenkins构建任务(三)
- 持续集成:Jmeter+Maven+Jenkins自动化框架搭建(四):GitLab代码更新触发Jenkins自动构建
- 码云Webhook触发Jenkins自动构建 - Jenkins演练(一)
- 安装配置jenkisn是的gitlab上可以通过webhook自动触发构建
- Gitlab利用Webhook实现Push代码后的jenkins自动构建
- Jenkins持续集成 之 hook自动触发构建
- gitlab利用webhook通知jenkins进行构建
- 配置gitlab的web hook,当git库的某个分支有提交时,自动触发jenkins的job
- 持续集成之④:GitLab触发jenkins构建项目
- centos7 在docker swarm中运行Jenkins,利用gitlab的webhook触发自动部署脚本
- Gitlab利用Webhook实现Push代码后的jenkins自动构建
- 持续集成之④:GitLab触发jenkins构建项目
- Jenkins+GitLab+webhook自动构建代码