GitLab CI实现无重复分支与MR流水线及条件化构建
GitLab CI 完整配置方案
以下是完全匹配需求的GitLab CI配置,已解决重复流水线问题并满足所有作业触发规则:
# 全局流水线触发规则:控制哪些场景会创建流水线,避免重复 workflow: rules: # 允许main分支的推送(包括直接提交和MR合并后的推送) - if: '$CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == "branch_push"' # 允许特性分支的推送(无论是否存在开放MR,排除标签推送) - if: '$CI_COMMIT_BRANCH != "main" && $CI_PIPELINE_SOURCE == "branch_push" && $CI_COMMIT_TAG == null' # 其他所有场景(标签、新建MR、定时任务等)禁止创建流水线 - if: 'true' when: never # 1. 预构建测试:始终作为首个作业执行,失败则终止流水线 pre-build tests: stage: .pre script: - # 替换为你的预构建测试命令,比如单元测试、代码检查等 - echo "Executing pre-build tests..." allow_failure: false rules: - if: 'true' # 只要流水线被触发就强制运行 # 2. 构建作业:main分支自动运行,特性分支手动触发 build: stage: build script: - # 替换为你的构建命令 - echo "Building project..." rules: # main分支流水线:预测试通过后自动执行 - if: '$CI_COMMIT_BRANCH == "main"' when: on_success # 特性分支流水线:需手动触发 - if: '$CI_COMMIT_BRANCH != "main"' when: manual allow_failure: false # 若手动触发构建,失败则阻断后续部署 # 3. 生产部署:所有场景仅手动运行,依赖构建作业 deploy to production: stage: deploy script: - # 替换为你的生产部署命令 - echo "Deploying to production..." dependencies: [build] rules: - if: 'true' when: manual allow_failure: false
关键配置说明
避免重复流水线:
通过workflow:rules禁用了merge_request_event类型的流水线,确保MR合并到main时,仅触发main分支的推送流水线,不会同时生成MR流水线和main分支流水线,彻底解决重复问题。预构建测试规则:
利用.pre阶段的优先级,确保该作业始终是流水线的第一个任务;allow_failure: false保证测试失败时直接终止后续所有作业,符合要求。构建作业分支差异化规则:
- main分支:通过
when: on_success实现预测试通过后自动执行构建 - 特性分支:通过
when: manual强制要求手动触发构建,避免不必要的自动构建消耗资源
- main分支:通过
部署作业规则:
- 全局手动触发:所有场景下都需要手动确认才能执行部署
dependencies: [build]确保只有构建成功后才能触发部署,避免无构建产物的无效部署
触发场景覆盖:
- ✅ 直接推送提交至main:触发main分支流水线
- ✅ MR合并至main:触发main分支流水线(无重复)
- ✅ 推送特性分支(无论是否有开放MR):触发对应特性分支流水线
- ❌ 新建MR:不触发流水线
- ❌ 标签推送:不触发流水线
- ❌ 其他场景(定时任务、API触发等):不触发流水线
内容的提问来源于stack exchange,提问作者JK Laiho
相关产品推荐
相关产品推荐

