如何在GitLab CI中配置两种不同触发规则的工作流?
GitLab CI 配置双触发规则流水线方案
要实现普通推送触发流水线和仅提交标题以-deploy结尾时触发流水线的需求,需修正原配置中的语法错误,并规避GitLab CI的workflow全局唯一性限制。以下是可行的配置方案:
方案一:给每个Job单独设置触发规则(推荐)
这种方式更灵活,避免全局配置冲突,确保符合条件的Job才会执行。
主配置文件 .gitlab-ci.yml
stages: - pre - build include: - local: ci/a.gitlab-ci.yml - local: ci/b.gitlab-ci.yml
部署专用流水线 ci/a.gitlab-ci.yml
仅在提交标题以-deploy结尾时触发:
test-job1-deploy: stage: pre script: - echo "部署流水线执行pre阶段" tags: - x86 rules: - if: '$CI_COMMIT_TITLE =~ /-deploy$/' test-job2-deploy: stage: build script: - echo "部署流水线执行build阶段" tags: - x86 rules: - if: '$CI_COMMIT_TITLE =~ /-deploy$/'
通用流水线 ci/b.gitlab-ci.yml
所有推送均触发(排除部署类提交):
test-job1-regular: stage: pre script: - echo "通用流水线执行pre阶段" tags: - x86 rules: - if: '$CI_COMMIT_TITLE !~ /-deploy$/' test-job2-regular: stage: build script: - echo "通用流水线执行build阶段" tags: - x86 rules: - if: '$CI_COMMIT_TITLE !~ /-deploy$/'
方案二:通过全局Workflow控制文件引入
利用workflow定义全局变量,仅引入符合条件的流水线配置文件:
主配置文件 .gitlab-ci.yml
workflow: rules: # 标记部署类提交 - if: '$CI_COMMIT_TITLE =~ /-deploy$/' variables: PIPELINE_TYPE: "deploy" # 标记普通提交 - if: '$CI_COMMIT_TITLE !~ /-deploy$/' variables: PIPELINE_TYPE: "regular" stages: - pre - build # 仅在对应流水线类型下引入配置文件 include: - local: ci/a.gitlab-ci.yml rules: - if: '$PIPELINE_TYPE == "deploy"' - local: ci/b.gitlab-ci.yml rules: - if: '$PIPELINE_TYPE == "regular"'
部署专用流水线 ci/a.gitlab-ci.yml
无需额外规则,仅在被引入时执行:
test-job1: stage: pre script: - echo "部署流水线执行pre阶段" tags: - x86 test-job2: stage: build script: - echo "部署流水线执行build阶段" tags: - x86
通用流水线 ci/b.gitlab-ci.yml
无需额外规则,仅在被引入时执行:
test-job1: stage: pre script: - echo "通用流水线执行pre阶段" tags: - x86 test-job2: stage: build script: - echo "通用流水线执行build阶段" tags: - x86
关键修正说明
- 正则匹配语法:原配置中用
==匹配正则是错误的,GitLab CI中需用:=~:表示正则匹配(判断字符串符合正则规则)!~:表示正则不匹配(判断字符串不符合正则规则)
- 避免Workflow冲突:GitLab CI中全局
workflow只能定义一份,多文件定义会导致覆盖失效,因此推荐方案一的Job级规则配置,或方案二的条件引入方式。 - Job名称唯一性:方案一中需为两个流水线的Job设置不同名称(如
test-job1-deploy和test-job1-regular),防止重名覆盖配置。
内容的提问来源于stack exchange,提问作者Gian Alessio
相关产品推荐
相关产品推荐

