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 控制作业是否运行:两层配合才能既省流水线数又控作业行为。