パイプライン YAML の高度な使用法がここにあります。重複コードを大幅に削減し、マルチタスクを柔軟に配置します。

著者: ムー・ヤン

YAML パイプラインを構成するときに次の問題が発生しますか?

  • 同様のタスク シナリオが 1 つのパイプラインでバッチで実行される場合、同様のロジックを持つ複数のジョブを YAML で定義する必要があります。ジョブの数が増えると、パイプラインの YAML 構成が長くなり、YAML 内のコードの繰り返しが多くなり、コードの再利用性が低くなります。が低く可読性が悪い。
  • 管理者は、複数のパイプラインを統合された方法で管理します。マルチアプリケーション テクノロジ アーキテクチャは、少数の構築パラメータと展開パラメータだけが矛盾している場合、各パイプラインで個別に変更する必要があり、その結果、構成コストが高くなります。各パイプラインが独立して構成されているため、統合された管理と制御が実現できず、保守性が低い。
  • パイプライン YAML は静的ファイルであり、タスクの実行ロジックはパイプラインの保存時に固定されます。ただし、一部の研究開発シナリオのパイプライン実行プロセスは実行時に明確にする必要があり、事前に構成することはできません。通常のパイプライン YAML では、このシナリオを満たすことができません。

この点に関して、Yunxiao Flow パイプライン YAML は、パイプライン YAML を動的にレンダリングするためのテンプレート言語の使用をサポートするテンプレート構文を導入しています。これにより、同じまたは類似のロジックを持つ複数のジョブのバッチ構成シナリオに対応し、動的生成に対応できます。オンデマンドで複数のジョブのシナリオを実行し、パイプライン YAML コードの重複を減らし、マルチタスクを柔軟に調整します。

テンプレート構文とは

テンプレートは、テキストの定義とレンダリングに使用されるテンプレート言語であり、変数、条件ステートメント、ループ構造などと組み合わせることができるため、コンテキストまたは外部データ ソースに基づいて YAML ファイルがさまざまな構成出力を生成できます。実行時。

Cloud Effect Pipeline はテンプレート エンジンを導入し、template=trueパイプラインの YAML コメントの最初の行でテンプレート モードを指定します。これは、{{ }}定義されたテンプレート言語の使用をサポートし、ネイティブ構文に従い、パラメーターとして定義された変数go templateの使用をサポートします。variablesレンダリングパイプライン。適用可能な代表的なシナリオは次のとおりです。

テンプレート構文のコア使用シナリオ

シナリオ 1: 複数のオペレーティング システム、複数の SDK バージョンの互換性テスト シナリオ

一部の互換性テスト シナリオでは、n 個の異なるオペレーティング システムと m 個の異なる SDK バージョンでコードをテストする必要がある場合、パイプライン内で n * m 個のジョブを定義する必要があります。各ジョブの実行ロジックは実際には同じです。このシナリオでは、互換性テストを必要とするシナリオが多数ある場合、パイプライン YAML が非常に長くなり、多くのコードが繰り返されるため、保守が困難になり、ジョブの実行ロジックが変更されると、変更する必要があります。 n * m 回。

テンプレート構文の導入後は、互換性シナリオを変数に抽出でき、範囲構文を使用してシナリオをループし、複数のジョブをバッチで生成できるため、ジョブ実行ロジックを変更するときに YAML コードの量が大幅に削減されます。必要な変更は 1 つだけです。

たとえば、次のコードでは、テンプレートの範囲ループを使用して、2 つのオペレーティング システム ["linux"、"windows"] と 3 つの JDK バージョン ["10"、"11"、"17"] をトラバースします。便利なことに、同じロジックを持つ 6 つのジョブが生成されます。

# 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: 複数のアプリケーションをオンデマンドで動的に構築およびデプロイする

1 つのシステムの下で複数のアプリケーションを共同リリースするシナリオでは、ビジネス要件の変更にはシステム内の一部のアプリケーションのみが関係し、各リリースは一部のアプリケーションの構築と展開のみをトリガーします。この場合、静的な YAML ファイル構成の使用は、アプリケーションの構築およびデプロイメント ジョブのシナリオの動的な生成に対応できません。

テンプレート構文の導入後、アプリケーションを変数に抽出し、範囲構文を使用して構成をループすることができます。パイプライン実行時に入力されたアプリケーション リストに従って、複数のアプリケーションの構築およびデプロイメント タスクを動的に生成できます。要求。

次の例に示すように、アプリケーションに応じて、複数のアプリケーション コード ソース、複数のアプリケーション構築タスク、および複数のアプリケーション デプロイメント タスクを構成しました。ランタイム入力環境変数 appname に基づいて、デプロイするアプリケーションを動的に決定できます。

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

パイプラインの実行効果は次のとおりです。

Yunxiao でテンプレート構文を使用する方法

1) パイプライン YAML 編集ページに入り、最初の行に #template=true をコメントしてテンプレート モードに切り替えます。

2) テンプレート モードに切り替えると、{{ }} テンプレート言語定義パイプラインがサポートされます。

  • 変数によって定義された環境変数をレンダリング パラメーターとして使用する: 変数によって定義された環境変数をテンプレート レンダリング パラメーターとして使用し、文字列、数値、ブール値、およびオブジェクトの複数の環境変数タイプをサポートします。実行時に同じ名前の環境変数の上書きをサポートします。

  • ネイティブの go テンプレート構文に従います。Yunxiao フロー パイプライン テンプレート モードは、ネイティブの go テンプレート構文に従います。詳細については、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}}
  • さらに、Yunxiao Flow パイプライン テンプレート構文は、より柔軟なオーケストレーション シナリオに対応する次の拡張関数をサポートしています。
# 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 を動的にレンダリングしたり、ジョブを動的に生成したりできます。 JDK バージョンが ["17"、"21"] に変更され、オペレーティング システムが ["linux"、"windows"] のままの場合、4 つのジョブが動的に生成されます。

Cloud Effect Pipeline Flow を無料で使用するか、詳細を確認するには、ここをクリックしてください。

マイクロソフトの中国AIチームは数百人を巻き込んで米国に渡ったが、 未知のオープンソースプロジェクトはどれだけの収益をもたらすことができるだろうか? 華中科技大学のオープンソースミラーステーション の立場が調整されたとファーウェイが正式に発表した。 外部ネットワークへのアクセスを正式にオープンしました。 詐欺師は TeamViewer を使用して 398 万件を転送しました。リモート デスクトップ ベンダーは何をすべきでしょうか? 初のフロントエンド視覚化ライブラリであり、Baidu の有名なオープンソース プロジェクト ECharts の創設者である - 有名なオープンソース企業の元従業員が「海に行った」というニュースを伝えた: 部下からの挑戦を受けて、技術者はリーダーは激怒し、無礼になり、妊娠中の女性従業員を解雇しました。OpenAI が AI にポルノ コンテンツを生成させることを検討したと 、Rust Foundation に報告されました。time.sleep (6) の役割を教えてください。 ?
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/3874284/blog/11141855