3. 跨项目流水线概述:父子流水线、多项目流水线、触发方式对比

在微服务与多仓库架构中,单一 .gitlab-ci.yml 已无法满足复杂交付场景。GitLab 提供了两种跨项目流水线编排机制——父子流水线(Parent-Child Pipeline)与多项目流水线(Multi-Project Pipeline),分别解决“同一仓库内职责拆分”与“跨仓库协同触发”的问题。本章从概念、适用场景、触发方式三个维度进行系统对比。

3.1 父子流水线(Parent-Child Pipeline)

父子流水线允许在同一个项目仓库内,由父流水线动态生成多个子流水线。子流水线继承父流水线的上下文(如变量、制品),但拥有独立的阶段执行空间。

核心特征:单一仓库、动态生成、子流水线可并行/串行、共享制品与变量。

3.1.1 典型结构

  • 父流水线:负责触发条件判断、参数组装、调用子流水线。
  • 子流水线:各自定义独立的 .gitlab-ci.yml(通常存放在子目录中),专注单一职责(如编译、测试、安全扫描)。
  • 触发方式:使用 trigger 关键字,指向子流水线的 YAML 文件路径。
# 父流水线 .gitlab-ci.yml
stages:
  - triggers

build-service-a:
  stage: triggers
  trigger:
    include: services/service-a/.gitlab-ci.yml
    strategy: depend
  variables:
    SERVICE_NAME: "service-a"

build-service-b:
  stage: triggers
  trigger:
    include: services/service-b/.gitlab-ci.yml
    strategy: depend
  variables:
    SERVICE_NAME: "service-b"

3.1.2 适用场景

场景 说明
Monorepo 拆分 一个仓库包含多个微服务或模块,每个模块独立流水线
阶段解耦 将构建、测试、部署拆成独立子流水线,提升可读性
动态生成 根据代码变更动态决定生成哪些子流水线(如仅变更目录触发)
父子流水线结构示意 父流水线 子流水线 A 子流水线 B 子流水线 C 说明: • 子流水线可并行执行,也可通过 strategy: depend 实现串行等待 • 父流水线可向子流水线传递变量,子流水线可返回制品

3.2 多项目流水线(Multi-Project Pipeline)

多项目流水线用于跨不同 GitLab 项目的流水线联动。上游项目完成后,自动触发下游项目的流水线,形成跨仓库的交付链。

关键区别:父子流水线在同一仓库内;多项目流水线在不同仓库之间。

3.2.1 典型结构

  • 上游项目:在 job 中使用 trigger 关键字,指定下游项目的完整路径(如 group/project)。
  • 下游项目:被触发后独立运行自己的 .gitlab-ci.yml,不共享上游的制品(除非通过 API 或 artifacts 传递)。
  • 触发方式:支持跨组、跨命名空间触发,需配置 CI/CD 或使用项目访问令牌。
# 上游项目 .gitlab-ci.yml
stages:
  - trigger-downstream

deploy-to-staging:
  stage: trigger-downstream
  trigger:
    project: my-group/my-downstream-project
    branch: main
    strategy: depend
  variables:
    DEPLOY_TAG: "$CI_COMMIT_TAG"

3.2.2 适用场景

场景 说明
微服务编排 API 网关更新后,触发下游多个微服务重新部署
基础设施即代码 应用仓库触发基础设施仓库的 Terraform 流水线
端到端测试 前端构建完成后,触发后端集成测试项目
多项目流水线结构示意 上游项目 A 下游项目 B 下游项目 C 下游项目 D 说明: • 虚线表示跨仓库触发,下游项目独立运行自己的流水线 • 可通过 artifacts 或 API 实现跨项目数据传递

3.3 触发方式对比

两种流水线模式在触发机制、变量传递、制品共享、权限控制等方面存在显著差异。下表从 8 个关键维度进行对比:

对比维度 父子流水线 多项目流水线
仓库范围 同一仓库 不同仓库
触发语法 trigger: include: path trigger: project: path
变量传递 自动继承父流水线变量 需显式传递,支持变量映射
制品共享 子流水线可直接访问父流水线制品 需通过 artifacts 或 API 手动传递
动态生成 支持(通过 rules 或 CI/CD 变量控制) 不支持动态生成,需预定义
并行能力 支持多个子流水线并行 支持多个下游项目并行
权限模型 继承父流水线权限 需下游项目授权 CI/CD
调试复杂度 较低(同一仓库日志集中) 较高(需跨仓库查看日志)

3.4 触发策略选择指南

常见误区:不要将多项目流水线用于同一仓库内的模块拆分,这会导致不必要的跨仓库权限管理和日志分散。反之,不要将父子流水线用于跨团队、跨仓库的协同,因为父子流水线无法跨项目触发。

3.4.1 选择决策树

  1. 是否在同一仓库?
    • 是 → 使用父子流水线
    • 否 → 使用多项目流水线
  2. 是否需要动态生成子流水线?
    • 是 → 父子流水线(支持 rules 动态 include)
    • 否 → 两种均可,按仓库边界选择
  3. 是否需要跨团队权限隔离?
    • 是 → 多项目流水线(每个项目独立权限)
    • 否 → 父子流水线(权限统一管理)

3.4.2 混合使用模式

在实际生产环境中,两种模式可以组合使用:

# 父流水线同时触发子流水线和跨项目流水线
stages:
  - child
  - cross-project

trigger-child:
  stage: child
  trigger:
    include: modules/module-a/.gitlab-ci.yml

trigger-downstream:
  stage: cross-project
  trigger:
    project: ops/deploy-platform
    branch: main
最佳实践:在服务目录架构中,建议将“构建与单元测试”放在父子流水线中(同一仓库),将“部署与集成测试”放在多项目流水线中(跨仓库协同),实现职责清晰、权限可控。