流水線 YAML 高級用法來了!大幅降低重複代碼、靈活編排多任務

作者:木煙

在 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 或瞭解更多信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章