template 语法

云效 Flow 流水线支持使用 template 语法来动态渲染流水线 YAML,满足多个相同或类似逻辑 Job 批量配置场景,满足多 Job 按需动态生成场景,帮助降低流水线 YAML 重复代码,灵活编排多任务。

前提条件

通过首行注释template=true指定 template 模式,支持使用{{ }}定义模板,遵循go template原生语法;支持使用variables定义的变量作为参数渲染流水线。典型适用场景如下:

典型场景1:多操作系统、多SDK版本兼容性测试场景

# template=true
variables:
  - key: osList
    type: Object
    value: ["linux", "windows"]
  - key: jdkVersionList
    type: Object
    value: ["10", "11", "17"]

stages:
  build_stage:
    name: 兼容性测试
    jobs:                             # 双层循环,生成 2*3 个Job
      {{ range $os := .osList}}
        {{ range $jdk := $.jdkVersionList}}
        {{ $os }}_JDK{{ $jdk }}_job:
                   name: 测试-{{ $os }}-JDK{{ $jdk }}
                   my_step:
                     name: 执行命令
                     step: Command
                     with:
                       run: |
                         echo 'test on {{ $os }}-JDK{{ $jdk }}"
        {{ end }}
        {{ end }} 

上述示例遍历["linux", "windows"]2个操作系统、遍历["10", "11", "17"]3个 JDK版本,使用template的range循环,生成 6 个相同逻辑的 Job。流水线运行效果如下:

image

典型场景2:多应用动态按需构建部署

# template=true
variables:
  - key: appnames
    type: Object
    value: ["app1", "app2", "app3"]

sources:
  {{ range $app := .appnames }}
  repo_{{ $app }}:
    type: codeup
    name: 代码源名称-{{ $app }}
    endpoint: https://codeup.aliyun.com/07880db8-fd8d-4769-81e5-04093aaf7b2b/c{{ $app }}.git
    branch: master
    certificate:
      type: serviceConnection
      serviceConnection: wwnbrqpihykbiko4
  {{ end }}

defaultWorkspace: repo_app1

stages:
  build_stage:
    name: 构建阶段
    jobs:
      {{ range $app := .appnames }}
      build_job_{{ $app }}:
        name: 构建任务-{{ $app }}
        sourceOption: ['repo_{{ $app }}']
        steps:
          build_{{ $app }}:
            step: Command
            name: 构建-{{ $app }}
            with:
              run: "echo start build {{ $app }}\n"
      {{ end }}
  deploy_stage:
    name: 部署阶段
    jobs:
      {{ range $app := .appnames }}
      deploy_job_{{ $app }}:
        name: 部署任务-{{ $app }}
        needs: build_stage.build_job_{{ $app }}
        steps:
          build_{{ $app }}:
            step: Command
            name: 部署-{{ $app }}
            with:
              run: "echo start deploy {{ $app }}\n"
      {{ end }}

上述示例根据应用配置多个应用代码源、多个应用构建任务、多个应用部署任务,可根据运行时输入环境变量appnames动态决定部署几个应用。流水线运行效果如下:

image

详细说明

首行注释template=true指定渲染引擎

首行注释指定 go template 渲染引擎,切换至 template 模式。切换至 template 模式后,支持{{ }}模板语言定义流水线。

# template=true

image

使用variables定义的环境变量作为渲染参数

  • 使用 variables 定义的环境变量作为 template 渲染参数,支持字符串 String、数字 Number、布尔值 Boolean、支持对象 Object等多种环境变量类型,详见 环境变量variables。支持运行时同名环境变量覆盖。

  • 此外,还支持使用以下四个系统预置环境变量作为渲染参数:PIPELINE_IDPIPELINE_NAMETIMESTAMPDATETIME

遵循go template原生语法

云效 Flow 流水线 template 模式遵循原生go template语法,详见:https://pkg.go.dev/text/template 。常用语法如下:

{{/* a comment */}}  // 注释
{{pipeline}}         // 引用
{{if pipeline}} T1 {{end}}   // 条件判断
{{if pipeline}} T1 {{else}} T0 {{end}}
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}
{{range pipeline}} T1 {{end}}          // 循环
{{range pipeline}} T1 {{else}} T0 {{end}}
{{break}}
{{continue}}

扩展 template 函数

云效 Flow 流水线 template 语法提供以下扩展函数:

# add:整数相加函数,参数接收两个及两个以上 Integer
{{ add 1 2 }} // 示例返回:3
{{ add 1 2 2 }} // 示例返回:5

# addf:浮点数相加函数,参数接收两个及两个以上 Number
{{ add 1.2 2.3 }} // 示例返回:3.5
{{ add 1.2 2.3 5 }} // 示例返回:8.5

# replace:字符串替换函数,接收三个参数:源字符串、待替换字符串、替换为字符串
{{ "Hallo World" | replace "a" "e" }}  // 示例返回:Hello World
{{ "I Am Henry VIII" | replace " " "-" }}  // 示例返回:I-Am-Henry-VIII

预览校验

支持使用变量进行预渲染和校验,查看运行前生成的完整 YAML。

image

渲染运行逻辑

  • template 模式的流水线渲染运行逻辑如下:

    • 第一步:流水线运行前,使用variables定义的环境变量作为参数(支持运行时同名环境变量覆盖),遵循 go template 语法,渲染模板{{ }},生成流水线完整 YAML。

    • 第二步:流水线 Job 运行前,对 YAML 中的${}变量引用进行替换;变量替换完成后执行流水线 Job。

  • 如:上述典型场景1,运行时环境变量修改 JDK 版本为 ["17","21"] ,操作系统保持 ["linux", "windows"],则动态生成 4 个Job。

    image

    image