如何避免GitLab分配Merge Request用户时触发Jenkins构建?
解决GitLab Merge Request分配用户时触发Jenkins重复构建的问题
有几个可行的办法能解决这个问题:
精准限定GitLab Webhook的触发事件
默认情况下GitLab的Merge Request Webhook会监听所有MR相关操作(包括创建、更新、分配用户等),你可以在GitLab项目的「Settings > Webhooks」里,找到Merge Request events的选项,展开后只勾选Merge request created,把其他比如「Merge request updated」这类选项都取消掉。这样只有当MR刚创建的时候才会触发Webhook,后续分配用户、添加评论这类更新操作就不会触发了。在Jenkins里加条件判断过滤非必要触发
如果没法调整Webhook的触发事件,那就直接在Jenkins里做判断。GitLab发送的Webhook payload里会有object_attributes.action字段,创建MR时这个值是open,分配用户这类更新操作时是update。你可以在构建流程里先判断这个字段,不符合就跳过构建:- 要是用Jenkins Pipeline,脚本可以这么写:
def gitlabPayload = readJSON text: env.gitlabPayload if (gitlabPayload.object_attributes.action != 'open') { echo "跳过构建:当前MR动作是${gitlabPayload.object_attributes.action},不是创建动作" return } // 这里写正常的构建步骤 - 要是用Freestyle项目,可以加一个「Execute shell」步骤,用jq解析payload:
if [ "$(echo $gitlabPayload | jq -r '.object_attributes.action')" != "open" ]; then echo "非MR创建动作,跳过构建" exit 0 fi
- 要是用Jenkins Pipeline,脚本可以这么写:
改用GitLab CI规则触发Jenkins(备选方案)
你也可以直接在GitLab的.gitlab-ci.yml里限定只有MR创建时触发流水线,再让Jenkins对接这个流水线事件:workflow: rules: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_EVENT_TYPE == 'opened' when: always - when: never这样只有MR创建时GitLab才会触发流水线,Jenkins也就只会收到这一次触发请求。
内容的提问来源于stack exchange,提问作者jessefournier
相关产品推荐
相关产品推荐

