首页/开发/CI/CD 与发布速查/GitLab CI 的 include 与 extends 复用
工具链要点63 条

GitLab CI 的 include 与 extends 复用

include 引入外部 YAML(本地文件、远程 URL、官方模板),extends 做配置继承:隐藏作业(. 开头)常作为被继承模板。

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

include 与 extends 是什么

GitLab 的复用机制分两层:include 把外部 YAML 拉进当前流水线(本地文件、远程 URL、官方模板、跨项目文件),extends 做配置继承——隐藏作业(以 . 开头,不进入流水线)常作为被继承的基类。合并规则要记牢:映射键深合并、数组整体替换、多继承时越靠后的父级优先级越高。复用能显著减少重复,但引用方式与合并规则没弄清时,调试成本反而更高。

基本信息

includelocal / remote / template / project 四类来源,project 方式可带 ref 锁定版本
extends单继承或列表多继承,列表中越靠后者优先级越高
隐藏作业以 . 开头不进入流水线,仅作模板(如 .defaults)
覆盖规则哈希深合并;数组整体替换;子作业直接写同名键即可覆盖

合并规则速查

场景结果
映射键冲突深合并,子级覆盖父级同名键
数组键冲突整体替换,不是追加
多继承同键列表中靠后的父级优先
include 撞键按引入顺序合并,用 CI Lint 核对最终结果

典型使用场景

  • 多仓库统一配置:公共 before_script、缓存与标签收敛到模板,新项目两行接入
  • 语言模板复用:先查官方 template 模板再自建,减少重复维护
  • 多继承组合能力:安全扫描、构建规范分别成基类,子作业按列表组合
  • 渐进迁移:include 新模板的同时保留旧配置,按项目逐个切换
  • 规则注入:统一的触发规则、并发控制写进模板,避免各写各的

模板复用示例

模板复用示例
# .templates.yml(可放独立模板仓库)
.defaults:
  image: registry.example.com/ci:1.9
  before_script: [setup.sh]

# .gitlab-ci.yml
include:
  - local: .templates.yml
  - project: 'platform/ci'
    ref: v1.4.2        # 跨项目模板锁版本
    file: '/templates/golang.yml'

build:
  extends: .defaults
  script: [make build]
官方提供了多种语言与场景的模板仓库:先查现有模板再自建,减少重复维护。
远程 include 用原始文件地址无法锁定版本,优先用 project 加 ref 的方式;官方 template 模板随版本变化,升级实例前先在测试项目验证。

易错点

  • 数组键不合并:子作业覆盖父模板的数组时整体替换、原命令悄悄消失,合并后用 CI Lint 核对
  • 远程 include 无版本固定:外部模板变更直接影响所有分支流水线,改用 project 加 ref
  • 基类作业去掉 . 前缀:会被当作真实作业解析,缺少 script 直接报错或空跑
  • 模板嵌套过深:三层以上 include 与 extends 叠加,排查一个字段要跨四个文件,控制层级并保留合并后视图

数据来源与参考

  • GitLab Docs《Include》
  • GitLab Docs《extends》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌