GitLab workflow 规则是什么
在作业规则之外控制「整条流水线是否创建」:workflow:rules 避免分支推送与 MR 事件各触发一条流水线的重复问题。它管流水线级准入,作业级 rules 管作业是否运行,两层配合使用。重复问题最常见于「开了 MR 又推分支」的场景。
基本信息
| 作用域 | 整条流水线的创建条件 |
|---|---|
| 常见目标 | 分支与 MR 场景只保留一条流水线 |
| 配合 | 配合 rules 控制作业级运行 |
| 变量 | workflow:rules 中可用 CI_OPEN_MERGE_REQUESTS 等 |
| 顺序 | 自上而下匹配,命中即生效 |
典型使用场景
- 消除重复:分支流水线与 MR 流水线二选一
- 控制来源:限定只有 MR 或特定分支触发流水线
- 草稿阶段:draft MR 只跑轻量作业或跳过
- 定时与手动:为 schedule 与手动触发单独留通道
- 多项目统一:用 include 模板把规则同步到所有仓库
- 草稿处理:draft 状态跳过重活,标记 ready 再全量跑
实践要点
- 官方模式:照文档推荐写法处理双触发
- 显式拦截:when: never 比漏配安全
- 变量可用:workflow:rules 里能读 CI_OPEN_MERGE_REQUESTS
- 评审规则:流水线条件改动同样要评审
- 日志验证:改完看同一提交只产生一条流水线
- 集中管理:workflow 规则放模板统一维护,项目引用
- 样板对照:先复制官方示例再按需裁剪
- 回归检查:改动后连续提交若干次,确认只建一条流水线
避免重复流水线
避免重复流水线
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
when: never
- if: '$CI_COMMIT_BRANCH'两层规则
| 层级 | 控制什么 | 典型写法 |
|---|---|---|
| workflow:rules | 流水线是否创建 | 分支与 MR 二选一 |
| jobs rules | 作业是否运行 | 按分支与环境 |
| only/except | 旧式条件 | 迁移到 rules |
分支流水线与 MR 流水线并存会造成重复构建:用官方推荐模式二选一。
workflow 规则不匹配任何条件时流水线不创建:调试时先看规则命中情况。
规则自上而下匹配:第一条命中即决定,顺序调整会改变行为。
条件表达式可以调试:用平台的流水线调试能力逐条验证,别靠猜。