首页/开发/CI/CD 与发布速查/GitLab CI 的 rules
工具链要点63 条

GitLab CI 的 rules

替代 only/except 的条件执行机制:按 if、changes、exists 从上到下逐条匹配、命中即采用,决定作业是否运行以及以何种方式运行。

CI/CD 与发布速查开发更新于 2026-10-13

GitLab rules 是什么

替代 only/except 的条件执行机制:按 if、changes、exists 从上到下逐条匹配、命中即采用,决定作业是否运行以及以何种方式运行。条件类型:if 是 CI/CD 变量表达式,changes 匹配改动路径,exists 检查文件存在。动作通过 when 指定(on_success、never、manual、delayed 等);未命中任何规则的作业不运行,最后一条常写 when: never 作为兜底。规则顺序就是优先级:命中后不再继续匹配。

基本信息

条件if(变量表达式)、changes(路径)、exists(文件)
动作when(on_success、never、manual、delayed)
匹配顺序自上而下逐条匹配、命中即采用
默认未命中任何规则的作业不运行
兜底用 when: never 提供反例分支

典型使用场景

  • 分支差异:主干自动部署,功能分支只做验证。
  • 路径触发:只改文档不跑构建,用 changes 过滤。
  • 手动发布:when: manual 控制生产入口与放行时机。
  • 渐进迁移:把 only/except 逐作业迁到 rules,行为对齐后再删旧语法。
  • 来源区分:按流水线来源(合并请求、分支、标签)配置不同运行方式。
  • 兜底防御:显式 when: never 收尾,让未覆盖场景的行为可预测。

MR 与主分支两种运行

MR 与主分支两种运行
deploy:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      when: manual
    - if: '$CI_COMMIT_BRANCH == "main"'
      when: on_success
    - when: never
规则自上而下逐条匹配、命中即采用:把更具体的条件放前面,最后写兜底规则。
变量插值的 if 表达式依赖变量存在:变量为空时按空值参与判断,可能命中意外的分支。
changes 的比较基准随场景不同(新建分支与普通推送的基准不一样),关键验证不能只靠 changes 判断。

条件类型速查

条件判断对象常见用法
if变量表达式按来源或分支决定运行方式
changes改动文件路径文档改动不跑构建
exists文件是否存在存在才运行对应检查
workflow:rules 控制流水线是否创建,作业级 rules 控制作业是否运行:两层配合才能既省流水线数又控作业行为。

易错点

  • 同一作业混用 only/except 与 rules:语义冲突难以排查,统一迁移到 rules。
  • 变量插值的 if 表达式依赖变量存在:变量为空时判断与预期不符,重要条件加存在性检查。
  • changes 基准理解偏差:不同场景比较基准不同,关键检查只挂 changes 会出现该跑不跑。
  • 规则顺序错误:宽条件放前面会吞掉后面更具体的条件,命中即采用后不再继续匹配。
  • 忘记兜底规则:新增分支或事件类型下作业行为意外,兜底 never 让行为始终可预测。
  • 作业级规则与 workflow 规则冲突:流水线根本没创建时作业级规则无从执行,排查看两层。

数据来源与参考

  • GitLab Docs《Choose when to run jobs》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌