首页/开发/CI/CD 与发布速查/GitLab CI workflow 规则
工具链要点63 条

GitLab CI workflow 规则

在作业规则之外控制「整条流水线是否创建」:用 workflow:rules 避免分支推送与 MR 事件各触发一条流水线的重复问题。

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

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 规则不匹配任何条件时流水线不创建:调试时先看规则命中情况。
规则自上而下匹配:第一条命中即决定,顺序调整会改变行为。
条件表达式可以调试:用平台的流水线调试能力逐条验证,别靠猜。

易错点

  • 只改作业规则不改 workflow:同一次提交仍然创建两条流水线
  • workflow 规则过于严格:手动运行与定时流水线被一并拦掉
  • 迁移姿势过猛:从 only/except 一次全换 rules,分批迁移并对照行为
  • 忽略合并结果场景:持续合并的 MR 需要 merged results 另配
  • 依赖的变量语义变化:升级后规则不再命中,升级时做回归
  • 把 workflow 当作业规则用:想控制单个作业却改了全局,两层职责要分清

数据来源与参考

  • GitLab Docs《Avoid duplicate pipelines》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌