GitLab-CI 如何全局定义执行规则并在对应阶段本地覆写
问题解答
完全可以,GitLab CI原生支持规则复用能力,你可以全局预定义各场景的通用触发规则,仅当作业有特殊规则需求时再单独定义覆盖即可,能大幅减少配置重复代码。
常用实现方案
方案1:使用extends继承规则模板(官方推荐)
该方案可读性更强,是GitLab CI官方推荐的配置复用方式:
# 全局定义通用规则模板(前缀带.的为隐藏模板,不会作为独立作业执行) .push_always: rules: - if: '$CI_PIPELINE_SOURCE == "push"' when: always - when: never .web_on_success: rules: - if: '$CI_PIPELINE_SOURCE == "web"' when: on_success - when: never # 作业直接继承对应模板即可复用规则 linter1: extends: .push_always linter2: extends: .push_always validate: extends: .web_on_success deploy: extends: .web_on_success
方案2:使用YAML锚点&别名复用
属于YAML原生的语法能力,适合轻量复用场景:
# 全局定义规则锚点 .rules:push_always: &rules_push_always rules: - if: '$CI_PIPELINE_SOURCE == "push"' when: always - when: never .rules:web_on_success: &rules_web_on_success rules: - if: '$CI_PIPELINE_SOURCE == "web"' when: on_success - when: never # 作业引用锚点复用规则 linter1: <<: *rules_push_always linter2: <<: *rules_push_always validate: <<: *rules_web_on_success deploy: <<: *rules_web_on_success
差异化规则处理
如果某一个作业需要特殊规则,直接在作业内重写rules字段即可,会自动覆盖继承的全局规则:
# 示例:linter3需要额外支持合并请求事件触发 linter3: extends: .push_always # 重写规则覆盖模板配置 rules: - if: '$CI_PIPELINE_SOURCE == "push"' when: always - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: always - when: never
更灵活的单条规则复用(GitLab 14.3+支持)
你还可以用!reference标签单独复用某一条规则条目,不用整段复用:
.rules: push_trigger: - if: '$CI_PIPELINE_SOURCE == "push"' when: always never_fallback: - when: never linter1: rules: - !reference [.rules, push_trigger] - if: '$CI_COMMIT_BRANCH == "dev"' when: always - !reference [.rules, never_fallback]
内容的提问来源于stack exchange,提问作者user5580578
相关产品推荐
相关产品推荐

