jenkins + gitlab 配置webhook
应用场景
jenkins 发版任务在测试环境中由于需要经常发版调试,而且不像生产环境存在业务持续稳定性需求,所以可以把测试环境发版权限放开给开发人员或者配置webhook 实现推送代码后的自动发版。
Jenkins 端配置
Build Triggers 模块下配置触发器,webhook 相关的触发有如下三种:
1、Trigger builds remotely (e.g., from scripts) 2、Build when a change is pushed to GitLab. GitLab CI Service URL: http://x.x.x.x:8888/project/project-name 3、Generic Webhook Trigger
Generic Webhook Trigger 功能强大,此处介绍它的使用配置,前提是安装相关的插件,才能使用,此处默认已经安装了。
1、触发发版的url
2、Post content parameters
就是发送发版的请求的请求体中的内容,可以通过勾选后面的Print post content 在发版的时候打印请求的请求体内容就会知道都有哪些数据被发送过来,一个完整的请求体以json格式展示如下
{"object_kind":"tag_push", #触发类型,有tag推送或者分支推送等
"before":"0000000000000000000000000000000000000000", #推送前的id ,如果为00..表示新建
"after":"c4365c6029f00aeddf33dab026c2590312ed6743", #新建tag 后的id
"ref":"refs/tags/v0.7dev", #推送的tag。通过$.ref 来提取
"checkout_sha":"c4365c6029f00aeddf33dab026c2590312ed6743",
"message":null, #message表示打tag 的时候标注的备注信息,例如git tag v1.1 -m "备注信息"
"user_id":435,
"user_name":"kzf",
"user_email":"kzf-pbj@asdf.com","project_id":796,
"repository":{"name":"practice", #仓库信息如下
"url":"git@x.x.x.x:kzf/practice.git",
"description":"个人练习使用",
"homepage":"http://git@x.x.x.x:kzf/practice",
"git_http_url":"http://x.x.x.x/kzf/practice.git",
"git_ssh_url":"git@x.x.x.x:kzf/practice.git",
"visibility_level":10},
"commits":[{"id":"c4365c6029f00aeddf33dab026c2590312ed6743", #commits里面是列表,通过$..commits[0]表示提取它的第一个列表所有内容
"message":"del dev1\n", #提交的时候的commit 信息,例如git commit -m "提交信息",
"timestamp":"2020-04-12T18:17:16+08:00", #$..commit[0].timestamp 表示提取此字段
"url":"http://x.x.x.x/kzf/practice/commit/c4365c6029f00aeddf33dab026c2590312ed6743",
"author":{"name":"feefsdf","email":"feefsdf@asdf.com"}}],
"total_commits_count":1}
具体配置示例
3、请求的验证token
当发版的请求过来后jenkins 要通过token验证请求,可以把每个项目的项目名称作为token配置此处,这样每个项目都是唯一的,例如gitlab 端发送请求 http://JENKINS_URL/generic-webhook-trigger/invoke?token=test1 过来后,这样每个项目能够区别开来不可用相同的token 那样就会把相同token 项目都发版了。
4、Optional filter
此处作用是条件判断,只有符合Expression中定义的正则的变量Text ,才会触发发版否则不会发版。Text处的变量是通过前面Post content parameters 区域提取的变量,message 。
下面就是在post content parameters 处提取的变量message ,这个变量名Variable 随便定义,Expression 中都是请求头里面存在的json格式的key。
其他配置可以默认或者不配置即可。
gitlab 端的配置
找到发版任务对应的git 仓库项目,编辑>webhooks,添加触发发版的url接口。
实际使用中经验总结
多项目使用同一个git 仓库
这种情况,如果每次gitlab 都触发所有项目发版那么没问题,但是如果只是想触发其中一个项目发版,其他项目不发布,这个怎么去处理呢。?
解决:
1、首先可以通过tag 形式去发版,每次推送tag 到仓库触发发版。
2、打tag 的时候配置注释信息来说明要发布的项目名称:git tag v1.1 -m "project:app-server"
3、在Jenkins端配置generic webhook trigger 的时候在Post content parameters 区域提取注释信息,存储此信息的字段是message,接着在Optional filter 区域进行过滤判断,message中的信息满足正则条件中项目名称时则发布,不满 足表示为其他项目就不发布。