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