如何配置避免Jenkins在GitLab合并请求获批时触发任务?
解决Jenkins过滤GitLab合并请求获批触发的问题
核心原因
GitLab社区版的Merge request events webhook会包含获批动作,即使你在Jenkins任务中未勾选EE专属的Approved Merge Requests,插件仍可能收到该事件并触发构建,需要手动通过条件判断过滤。
具体解决方案
1. Pipeline任务方案
直接在Pipeline中添加触发条件判断,过滤approved动作:
pipeline { agent any triggers { gitlab( triggerOnMergeRequest: true, triggerOpenMergeRequestOnPush: 'source', openMergeRequestEvents: ['opened', 'updated', 'reopened'] // 明确只监听需要的事件 ) } when { expression { // 解析GitLab发送的webhook payload def mrPayload = readJSON text: params.gitlabPayload // 排除获批动作的触发 return mrPayload.object_attributes.action != 'approved' } } stages { stage('Build') { steps { // 你的构建步骤 echo 'Running build...' } } } }
如果你的Jenkins GitLab插件版本已暴露gitlabMergeRequestAction环境变量,可简化判断:
when { not { equals expected: 'approved', actual: env.gitlabMergeRequestAction } }
2. 自由风格任务方案
通过Conditional BuildStep插件实现前置判断:
- 先安装Conditional BuildStep插件
- 在任务中添加「Execute shell」步骤(需Jenkins服务器安装
jq工具),作为构建前置条件:
# 解析webhook payload中的动作类型 MR_ACTION=$(echo "$gitlabPayload" | jq -r '.object_attributes.action') # 如果是获批动作,终止构建 if [ "$MR_ACTION" = "approved" ]; then echo "Merge request approved, aborting build..." exit 1 fi
- 配置该步骤为「只有当条件满足时才执行」(实际是反向判断,若为approved则退出,阻止后续步骤执行)
额外检查
- 确认GitLab webhook仅勾选
Merge request events,无需额外勾选其他事件 - 检查Jenkins GitLab插件版本,尽量使用最新稳定版,避免旧版本的事件过滤bug
内容的提问来源于stack exchange,提问作者Nicolas Baumann
相关产品推荐
相关产品推荐

