项目场景:
Jenkins 版本:Jenkins 2.263.1
触发器:Generic Webhook Trigger Plugin(问题就出在这里)
SCM:Gitlab
问题描述:
Gitlab 的 Merge 事件无法触发 Jenkins 的自动构建。
triggers {
GenericTrigger(
genericVariables: [
[key: 'ref', value: '$.ref', regexpFilter:'refs/heads/'], // 此处导致了问题
[key: 'action', value: '$.object_kind'],
],
causeString: 'Triggered on $ref',
token: 'test',
printContributedVariables: true,
printPostContent: true,
silentResponse: false, // 静默响应,只返回状态码
regexpFilterText: '$ref',
regexpFilterExpression: '^(master|((dev(2|3|4|5)|release|hotfix)/.*))$'
)
}
原因分析:
不得不吐槽一下 Jenkins,调试 pipeline 只能通过不停地提交代码来验证。调都调不了,***我都烦死了。
在调试过程中发现 Push 事件能正常触发构建,但是 Merge 始终不行,开始定位问题。
- 确认 Webhook 是否触发。
查看 Gitlab 的 Webhook 的请求日志。可以在 Gitlab 项目仓库中Setting => Integrations => 进入定义的 Webhook 详情 => Recent Deliveries
查看。发现相关的 Merge 事件的确向 Jenkins 发送了请求。 - 检查
post body
是否满足触发条件。
对比 Push 事件和 Merge 事件的body
,发现 Merge 事件的 body 中缺少了ref
属性。而 Jenkinsfile 中就是提取该字段来过滤触发事件的,由此定位问题所在。由此反省出一个道理,问题很可能出现在你觉得不可能出现的地方。
解决方案:
提取触发任务的 branch
时不能单纯地从 ref 属性提取,由于 Merge 事件的 branch
保存在 object_attributes.target_branch
中,可以多使用一个变量,将其保存,提高容错性。
triggers {
GenericTrigger(
genericVariables: [
[key: 'ref', value: '$.ref', regexpFilter:'refs/heads/', defaultValue: 'null'],
[key: 'target_branch', value: '$.object_attributes.target_branch', defaultValue: 'null'],
[key: 'action', value: '$.object_kind'],
],
token: 'test',
printContributedVariables: true,
printPostContent: true,
silentResponse: false, // 静默响应,只返回状态码
// 对多个变量进行过滤,我用端横线‘-’连接起来
regexpFilterText: '$ref-$target_branch',
// 由于上面为二者添加了默认值'null',所以此处使用'null'进行匹配
regexpFilterExpression: '(^(master|((dev(2|3|4|5)|release|hotfix)/.*))-null$)|(^null-(master|((dev(2|3|4|5)|release|hotfix)/.*))$)'
)
}