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 拆分 | 一个仓库包含多个微服务或模块,每个模块独立流水线 |
| 阶段解耦 | 将构建、测试、部署拆成独立子流水线,提升可读性 |
| 动态生成 | 根据代码变更动态决定生成哪些子流水线(如仅变更目录触发) |
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 流水线 |
| 端到端测试 | 前端构建完成后,触发后端集成测试项目 |
3.3 触发方式对比
两种流水线模式在触发机制、变量传递、制品共享、权限控制等方面存在显著差异。下表从 8 个关键维度进行对比:
| 对比维度 | 父子流水线 | 多项目流水线 |
|---|---|---|
| 仓库范围 | 同一仓库 | 不同仓库 |
| 触发语法 | trigger: include: path |
trigger: project: path |
| 变量传递 | 自动继承父流水线变量 | 需显式传递,支持变量映射 |
| 制品共享 | 子流水线可直接访问父流水线制品 | 需通过 artifacts 或 API 手动传递 |
| 动态生成 | 支持(通过 rules 或 CI/CD 变量控制) | 不支持动态生成,需预定义 |
| 并行能力 | 支持多个子流水线并行 | 支持多个下游项目并行 |
| 权限模型 | 继承父流水线权限 | 需下游项目授权 CI/CD |
| 调试复杂度 | 较低(同一仓库日志集中) | 较高(需跨仓库查看日志) |
3.4 触发策略选择指南
常见误区:不要将多项目流水线用于同一仓库内的模块拆分,这会导致不必要的跨仓库权限管理和日志分散。反之,不要将父子流水线用于跨团队、跨仓库的协同,因为父子流水线无法跨项目触发。
3.4.1 选择决策树
- 是否在同一仓库?
- 是 → 使用父子流水线
- 否 → 使用多项目流水线
- 是否需要动态生成子流水线?
- 是 → 父子流水线(支持 rules 动态 include)
- 否 → 两种均可,按仓库边界选择
- 是否需要跨团队权限隔离?
- 是 → 多项目流水线(每个项目独立权限)
- 否 → 父子流水线(权限统一管理)
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
最佳实践:在服务目录架构中,建议将“构建与单元测试”放在父子流水线中(同一仓库),将“部署与集成测试”放在多项目流水线中(跨仓库协同),实现职责清晰、权限可控。