如何避免合并MR时GitLab CI的job1重复执行?
解决GitLab CI合并MR时job1重复运行的问题
你的问题出在合并MR时生成的合并提交,其提交信息大概率包含了JOB1(比如默认会带上MR标题),触发了原规则里的CI_COMMIT_MESSAGE匹配条件,导致job1重复执行。
只需调整rules规则,精准限定运行场景并排除合并提交的情况,修改后的配置如下:
job1: extends: .parentJob rules: # 场景3:定时流水线(已设置CI_COMMIT_MESSAGE为JOB1) - if: '$CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_MESSAGE =~ /.*JOB1.*/' # 场景2:创建/更新标题含JOB1的MR(仅在MR专属流水线中触发) - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TITLE =~ /.*JOB1.*/' # 场景1:推送含JOB1的分支提交,排除合并提交 - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_MESSAGE =~ /.*JOB1.*/ && $CI_COMMIT_IS_MERGE_COMMIT != "true"'
规则说明:
- 定时流水线:通过
CI_PIPELINE_SOURCE == "schedule"明确限定定时触发的场景,避免和其他push场景混淆。 - MR场景:用
CI_PIPELINE_SOURCE == "merge_request_event"限定仅在MR的创建/更新流水线中触发,不会影响合并后的分支推送流水线。 - 分支推送场景:新增
CI_COMMIT_IS_MERGE_COMMIT != "true"条件,直接排除GitLab自动生成的合并提交(该变量在GitLab 13.5及以上版本可用),确保只有普通提交才会触发job1。
如果你的GitLab版本低于13.5,无法使用CI_COMMIT_IS_MERGE_COMMIT,可以改用正则排除合并提交的消息格式:
# 替换分支推送场景的规则 - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_MESSAGE =~ /.*JOB1.*/ && $CI_COMMIT_MESSAGE !~ /^Merge (branch|!.*) into .*$/'
这个正则会过滤掉类似Merge branch 'feature' into main或Merge !123 into main的合并提交消息。
内容的提问来源于stack exchange,提问作者Expiredmind
相关产品推荐
相关产品推荐

