父子流水线是什么
父子流水线(Parent-child pipelines)是 GitLab 的组织机制:父管道通过 trigger 关键字触发一个独立的子管道,子管道使用自己的一份配置。配置来源可以是同仓库文件(include: local)、由前置作业动态生成的文件(include: artifact)、另一仓库的配置(include: project)或官方模板(include: template)。子管道是一条独立的流水线,有自己的 ID、阶段与作业,在父管道页面下折叠展示。它解决两个问题:超大 .gitlab-ci.yml 的拆分,与按变更内容动态决定跑什么。
基本信息
| 适用平台 | GitLab CI/CD |
|---|---|
| 触发语法 | trigger + include(local/artifact/project/template) |
| 等待语义 | strategy: depend 时父作业等待子管道并镜像状态;默认不等待 |
| 制品边界 | 父子管道之间不自动共享 artifacts,需显式传递或各自生成 |
| 可见性 | 子管道在父管道页面下折叠展示,排障入口分散 |
典型使用场景
- 单仓多项目(monorepo):每个子项目一份子管道配置,父管道按变更路径决定触发哪个。
- 动态生成配置:前置作业用脚本按本次改动生成子管道 YAML,再由 trigger 拉起。
- 团队自治:各团队维护自己目录下的流水线文件,独立评审、独立演进。
- 拆分巨型配置:把超长 .gitlab-ci.yml 按领域拆成多份,降低单文件维护成本。
- 跨仓复用:用 include: project 引用公共流水线仓库的配置模板,统一规范。
固定拆分与动态生成
固定拆分与动态生成
# 同仓库固定文件触发
web:
trigger:
include: web/.gitlab-ci.yml
strategy: depend
# 动态生成子管道配置
generate:
stage: build
script: ./ci/gen-child.sh > child.yml
artifacts:
paths: [child.yml]
dynamic:
trigger:
include:
artifact: child.yml
job: generate
strategy: depend配置来源对比
| 方式 | 写法 | 适用 |
|---|---|---|
| 同仓库文件 | include: local | 固定拆分、多项目 |
| 动态生成 | include: artifact + job | 按变更生成 |
| 他仓配置 | include: project | 跨仓模板复用 |
| 官方模板 | include: template | 通用规范片段 |
父子管道之间不自动共享制品:父作业的产物子管道拿不到,需要显式传递或各跑各的,规划时先想清数据流。
子管道排障要先定位是父还是子:父管道页面折叠展示子管道链接,失败时从子管道页面看具体作业日志。