首页 > 其他分享 >流水线 YAML 高级用法来了!大幅降低重复代码、灵活编排多任务

流水线 YAML 高级用法来了!大幅降低重复代码、灵活编排多任务

时间:2024-05-16 16:57:12浏览次数:24  
标签:场景 app YAML Job template 流水线 多任务

作者:木烟

在 YAML 化配置流水线时,你是否会遇到以下问题?

  • 单流水线中批量执行类似任务场景时,YAML 中需要定义多个类似逻辑的 Job,Job 越多,流水线 YAML 配置的越长,YAML 中的重复代码越多,代码复用性低,可读性差;
  • 管理员统一管理多流水线,多应用技术架构和研发流程类似,仅些许构建、部署参数不一致时,每条流水线都需要单独修改差异化参数,配置成本高;各流水线独立配置时,又无法统一管控,可维护性差;
  • 流水线 YAML 为静态文件,流水线保存时任务执行逻辑已固定,但部分研发场景流水线执行流程需要等到运行时才能明确,无法提前配置。该场景普通的流水线 YAML 无法满足。

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

什么是 template 语法

template 是一种用于定义和渲染文本的模板语言,它可以结合变量、条件语句、循环结构等,使得 YAML 文件能够根据上下文或外部数据源生成多样化的配置输出,运行时动态渲染生成流水线 YAML。

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

template 语法核心使用场景

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

在某些兼容性测试场景,如你需要在 n 个不同的操作系统、m 个不同 SDK 版本测试你的代码,那么你的流水线里需要定义 n * m 个 Job,每个 Job 的执行逻辑其实是一样的。该场景下,当需要兼容测试的场景很多时,流水线 YAML 将非常长,有大量重复代码,难以维护;且当 Job 执行逻辑有一处修改时,则要修改 n * m 次。

引入 template 语法后,可将兼容性场景抽取成变量,使用 range 语法循环遍历场景,批量生成多个 Job,大大降低 YAML 代码量;当 Job 执行逻辑有修改时也仅需一处修改即可。

例如,在下面的代码中,我们遍历了 ["linux", "windows"] 2 个操作系统、["10", "11", "17"] 3 个 JDK 版本,使用 template 的 range 循环,很方便地就生成了 6 个相同逻辑的 Job。

# 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 }}

流水线的运行效果如下:

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

一个系统下多应用联合发布场景,一次业务需求的修改仅会涉及系统下的部分应用,每次发布上线仅需触发部分应用的构建部署。这种情况下,使用静态 YAML 文件配置方式无法满足动态生成应用构建、部署 Job 场景。

引入 template 语法后,可将应用抽取成变量,使用 range 语法循环遍历配置,根据流水线运行时输入的应用列表,动态按需生成多个应用构建、部署任务。

如下述示例所示,我们根据应用配置了多个应用代码源、多个应用构建任务、多个应用部署任务,可根据运行时输入环境变量 appnames 动态决定部署几个应用。

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

sources:
  {{ range $app := .appnames }}
  repo_{{ $app }}:
    type: codeup
    name: 代码源名称-{{ $app }}
    endpoint: https://yunxiao-test.devops.aliyun.com/codeup/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 }}

流水线运行效果如下:

如何在云效内使用 template 语法

1)进入流水线 YAML 编辑页,通过首行注释 # template=true,切换至 template 模式。

2)切换至 template 模式后,支持 {{ }} 模板语言定义流水线。

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

  • 遵循 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}}
  • 此外,云效 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

3)配置流水线运行时的环境变量,用于流水线运行前动态渲染 YAML。

4)点击「预览模式」,支持使用变量进行预渲染校验流水线是否符合预期。

5)确认无误后,保存并触发流水线运行。可按需修改运行时变量,根据运行时环境变量动态渲染流水线 YAML,动态生成 Job。如修改 JDK 版本为 ["17","21"] ,操作系统保持 ["linux", "windows"],则动态生成 4 个 Job。

点击此处,免费使用云效流水线 Flow 或了解更多信息。

标签:场景,app,YAML,Job,template,流水线,多任务
From: https://www.cnblogs.com/yyds114/p/18196273

相关文章

  • Jenkins: Webhook触发多分支流水线项目构建
    总共发现了两种配置方法,分别是通过不同的插件实现GenericWebhookTrigger安装插件:GenericWebhookTrigger在Jenkinsfile中,添加配置:triggers{GenericTrigger(//构建时的标题causeString:'Triggeredby$ref',//获取POST参......
  • k8s中查看pod的yaml文件的案例
    在Kubernetes(K8s)中,Pod的YAML文件定义了Pod的配置和规格。当你想要查看Pod的YAML文件参数参考时,通常是为了了解可以配置哪些字段以及这些字段的含义。以下是一些方法来查看PodYAML文件的参数参考:官方文档:Kubernetes官方文档提供了关于所有资源的详细API参......
  • yaml(yml)与properties文件的区别
    SpringBoot支持两种格式的配置文件,一种是yml,而另一种就是properties,默认的文件名为application.yml或者.propertiesproperties配置文件:key=value;yml配置文件key:value;yml更好的配置多种数据类型配置对象数据类型:student:id:1name:zhangsanage:18......
  • [HDCTF 2023]YamiYami python中的另一种反序列化--yaml
    今天做了到新颖的题,关于python中的yaml反序列化的题目,直接上题吧。发现第一个链接的参数是?url=XXXX,一眼利用点。嗯?直接出了flag,应该是非预期解。再看看有app.py,那就试试。发现app.*被过滤了,二次编码绕过试试。点击查看代码@app.route('/')defindex():session['pas......
  • K8S之yaml 文件详解pod、deployment、service(转)
    原文:https://blog.csdn.net/footless_bird/article/details/125946101作者:墨鸦_Cormorant来源:CSDN K8S中的yaml文件yaml语法学习 Kubernetes支持YAML和JSON格式管理资源对象 JSON格式:主要用于api接口之间消息的传递 YAML格式:用于配置和管理,YAML是一种简......
  • yq工具处理yaml文件
    1.yq介绍一个轻量级、可移植的命令行YAML、JSON和XML处理器。yq使用类似jq的语法,但可以处理yaml文件以及json、xml、properties、csv和tsv。它还不支持所有jq功能-但它确实支持最常见的操作和功能,并且正在不断添加更多功能 2.github地址https://github.com/mike......
  • Kubernetes Dashboard部署安装recommended.yaml
    ```yml#Copyright2017TheKubernetesAuthors.##LicensedundertheApacheLicense,Version2.0(the"License");#youmaynotusethisfileexceptincompliancewiththeLicense.#YoumayobtainacopyoftheLicenseat##http://www.apache.......
  • dbt fromyaml 上下文方法简单说明
    fromyaml上下文方法可以用来加载yaml内容,属于一个工具类,比如automate-dv就使用了不少方法参考使用{%-setinfo-%}source_model:raw_staging:"raw_customer"derived_columns:SOURCE:"!1"LOAD_DATETIME:"CRM_DATA_INGESTION_TIME"E......
  • pytest + yaml 框架 -69.新增depend 关键字,导入其它yaml用例
    前言有小伙伴提到,test_a.yml中已经写了几个流程,test_b.yml中希望能接着test_a.yml去写用例,于是就需要先导入test_a.yml用例。为了满足此需求,v1.6.3版本在config中新增depend关键字。需求场景test_a.yml中已经写了一些用例config:variables:x:helloy:wo......
  • Springboot - [06] yaml语法讲解
    Yaml是一种标记语言,Yaml也不是一种标记语言。 一、yaml写法示例application.yaml#普通的key-valuename:harleyserver.port:8081#对象student:name:harleyage:25#对象的行内写法student:{name:harley,age:25}#数组pets:-cat-......