如何配置GitLab作业:默认手动,仅合并列车流水线自动执行?
问题
我们正尝试在企业GitLab中搭建完善的Merge Train(合并列车)配置。当前流水线中有若干执行资源消耗较大的fuzzy tests(模糊测试)作业,这些作业无需在每次推送时运行,但需在合并前执行,且支持手动触发。
目前这些作业在通用流水线中标记为手动,配置如下:
fuzzy-tests: rules: - if: $CI_PIPELINE_SOURCE == "schedule" when: never - if: > $CI_COMMIT_TAG || $CI_COMMIT_BRANCH == 'main' || $CI_COMMIT_BRANCH == 'release/*' || $PUBLISH_DEV_VERSION when: on_success - when: manual
我们希望这些作业在Merge Train流水线中自动运行,无需手动触发。请问能否通过rules判断当前作业是否处于Merge Train流水线环境?若无法实现,是否有合适方案确保fuzzy-tests作业在每次合并前至少运行一次、可按需触发,且不会在合并请求每次变更时执行?
解决方案
直接通过GitLab环境变量识别Merge Train
GitLab 14.5及以上版本提供了$CI_MERGE_REQUEST_EVENT_TYPE环境变量,当流水线由Merge Train触发时,该变量值为merge_train。可以直接在作业规则中加入该判断,让fuzzy-tests在Merge Train中自动执行:
fuzzy-tests: rules: - if: $CI_PIPELINE_SOURCE == "schedule" when: never - if: > $CI_COMMIT_TAG || $CI_COMMIT_BRANCH == 'main' || $CI_COMMIT_BRANCH == 'release/*' || $PUBLISH_DEV_VERSION || $CI_MERGE_REQUEST_EVENT_TYPE == "merge_train" # 新增Merge Train自动执行条件 when: on_success - when: manual
低版本GitLab替代方案
如果你的GitLab版本低于14.5,不支持上述变量,可以用以下两种方式:
- 匹配Merge Train临时分支:Merge Train生成的临时分支默认以
merge-train/开头,可通过分支名规则识别:
fuzzy-tests: rules: - if: $CI_PIPELINE_SOURCE == "schedule" when: never - if: > $CI_COMMIT_TAG || $CI_COMMIT_BRANCH == 'main' || $CI_COMMIT_BRANCH == 'release/*' || $PUBLISH_DEV_VERSION || $CI_COMMIT_BRANCH =~ /^merge-train\// # 匹配Merge Train临时分支前缀 when: on_success - when: manual
- 结合合并请求审批规则强制校验:在项目设置的「合并请求」-「审批规则」中,添加“需要通过特定作业”的规则,指定
fuzzy-tests必须成功完成。这样即使普通MR流水线中作业是手动触发的,也必须手动运行一次并通过后才能合并,同时Merge Train中自动执行的作业也会满足审批要求,确保合并前至少运行一次。
额外优化:拆分作业逻辑
如果需要更清晰的职责划分,可以将模糊测试拆分为两个作业:一个保留手动触发逻辑,另一个仅在Merge Train中自动执行:
# 复用基础配置的模板 .fuzzy-tests-base: script: - # 模糊测试执行命令 # 手动触发的模糊测试作业(供普通MR按需运行) fuzzy-tests-manual: extends: .fuzzy-tests-base rules: - if: $CI_PIPELINE_SOURCE == "schedule" when: never - if: > $CI_COMMIT_TAG || $CI_COMMIT_BRANCH == 'main' || $CI_COMMIT_BRANCH == 'release/*' || $PUBLISH_DEV_VERSION when: on_success - when: manual # Merge Train专属自动执行的模糊测试作业 fuzzy-tests-merge-train: extends: .fuzzy-tests-base rules: - if: $CI_MERGE_REQUEST_EVENT_TYPE == "merge_train" when: on_success - when: never
内容的提问来源于stack exchange,提问作者Anaphory
相关产品推荐
相关产品推荐

