GitLab CI配置:MR流水线运行全任务且避免分支与MR流水线重复执行
GitLab CI 流水线配置方案
先明确术语:
- branch pipeline:推送代码到分支时触发的流水线。
- MR pipeline:创建合并请求或推送代码至合并请求关联分支时触发的流水线。
直接上可行的.gitlab-ci.yml配置,完美匹配你的需求:
workflow: rules: # 有合并请求时,只触发MR流水线 - if: $CI_MERGE_REQUEST_IID # 没合并请求时,触发分支流水线(可根据需求调整分支范围) - if: $CI_COMMIT_BRANCH && !$CI_MERGE_REQUEST_IID job_A: script: - echo "Job A 在所有流水线里运行" # 无需添加任何rules,默认会在所有符合workflow规则的流水线中执行 job_B: script: - echo "Job B 仅在MR流水线运行" rules: - if: $CI_MERGE_REQUEST_IID
配置说明
- workflow规则是核心:
- 第一条规则通过
$CI_MERGE_REQUEST_IID判断是否存在打开的合并请求,存在则仅触发MR流水线,直接跳过分支流水线的触发逻辑,解决了之前同时触发两种流水线的问题。 - 第二条规则仅当存在分支且无合并请求时,才触发分支流水线,保证无MR场景下的正常分支流水线执行。
- 第一条规则通过
- job_A无需额外规则:
GitLab CI 默认会让未配置rules的job在所有符合workflow触发条件的流水线中运行,不管是MR流水线还是分支流水线,job_A都会自动执行,完全不用添加merge_request_event规则。 - job_B精准限制:
通过rules判断$CI_MERGE_REQUEST_IID,确保只有MR流水线才会执行job_B。
效果验证
- 打开MR后推送代码:仅触发MR流水线,job_A和job_B均运行。
- 直接推代码到无MR的分支:仅触发分支流水线,仅job_A运行。
内容的提问来源于stack exchange,提问作者buratino
相关产品推荐
相关产品推荐

