变量复用

Yaml 本身支持变量复用,但不支持跨文件变量复用。

云原生构建 通过扩展 Yaml 自定义标签 reference 实现按属性路径引用变量值,可结合 include 跨文件使用。

提示

  1. 第一层同名变量会被覆盖,不会合并。本地的 .cnb.yml 会覆盖 include 中的变量,include 数组中后面的变量会覆盖前面的变量。
  2. reference 支持嵌套引用,最多 10 层。

# 示例

a.yml

.val1:
  echo1: echo hello
.val2:
  friends:
    - one:
      name: tom
      say: !reference [.val1, echo1]

.cnb.yml

include:
  - ./a.yml
.val3:
  size: 100
main:
  push:
    - stages:
        - name: echo hello
          script: !reference [.val2, friends, "0", say]
        - name: echo size
          env:
            SIZE: !reference [".val3", "size"]
          script: echo my size ${SIZE}

解析后相当于:

main:
  push:
    - stages:
        - name: echo hello
          script: echo hello
        - name: echo size
          env:
            SIZE: 100
          script: echo my size ${SIZE}

# 进阶示例

可以将流水线作为整体配置引用:

.common-pipeline:
  - stages:
      - name: echo
        script: echo hello

main:
  push: !reference [.common-pipeline]
test:
  push: !reference [.common-pipeline]

解析后相当于:

main:
  push:
    - stages:
        - name: echo
          script: echo hello
test:
  push:
    - stages:
        - name: echo
          script: echo hello

# VSCode 配置

安装 VSCode YAML 插件后, 为了在 VSCode 编写带自定义标签 referenceYaml 文件时不报错,需要如下配置:

setting.json

{
  "yaml.customTags": ["!reference sequence"]
}

提示

为避免编写时 Yaml 插件根据 Schema 把第一层变量名当做分支名, 有错误提示,reference 所在的第一层变量名可用 . 开头,如:.var