2022年3月8日
Continuous Integration
whenディレクティブと組み込み変数を使用すれば、ユーザーは複数のパイプラインを作成して維持せずとも、同様のユースケースに対して1つのパイプラインを使うことができます。 条件付き実行の全てを学びましょう。
whenディレクティブを使うと、パイプラインは与えられた条件によって、ステップやステージを実行すべきかどうかを決定することができます。
なぜ必要なのでしょうか。
例えば、以下のようなロジックを実行するパイプラインを構築する必要があるとします。
これは非常に一般的なユースケースです。
アプリケーションをビルド、テスト、プッシュするとき、ユーザーはしばしばビルドの種類に応じてステップやステージを実行したりスキップしたりする必要があります。機能ブランチにプッシュするとき、PRを変更するとき、タグをビルドするときなど、パイプラインのロジックにいくつかのバリエーションが必要になることがあります。
これを実現する方法として、whenディレクティブを使用します。whenディレクティブを使って、ユーザーは以下を設定できます。
例えば、以下のような条件を設定したステージは、そのステージの実行前にエラーが発生していない場合、プルリクエストのビルドに対してのみ実行されます。
パイプラインのYAMLでは、このような条件になります。
when:
pipelineStatus: Success
condition: <+codebase.build.type> == "PR"
上の例では、whenディレクティブと組み込み変数を組み合わせています。また、JEXL条件をパイプライン変数、ステージ変数、ステップ出力変数などの他の変数と併用することで、ステージ/ステップの実行タイミングを条件付きで決定することも可能です。
パイプライン、ユーザー変数、トリガー、コードベースと、複数のタイプの組み込み変数があります。
<+codebase.X>という形式の変数は、CIステージの一部として実行されたクローン操作に関連する情報を保持します。<+trigger.X> という形式の変数は、パイプラインがどのようにトリガーされたかに関連する情報を保持します。
パイプラインのトリガー方法(手動、webhookなど)やビルドタイプ(Tag、Branch、PR)によって、実行時に解決されない組み込み変数もあるかもしれません。たとえば、<+codebase.tag> はタグをビルドするときのみ、<+trigger.prTitle> はパイプラインがPull Request Gitイベントによってトリガーされた場合のみ、値が設定されます。
変数の扱いを簡単にするために、組み込み変数にはデフォルトでnullという文字列が設定されています。つまり、変数の値がnullと等しいかどうかをテストすることで、値が入力されたかどうかを確認することができるのです。
ですから、"v."のような特定のパターンで始まるタグだけを実行するステージがある場合、<+codebase.tag>に正規表現にマッチするJEXLを使えば、簡単にそれを実現することができるのです。このパイプラインはPRやブランチの構築にも使用でき、その場合は<+codebase.tag>がパターンにマッチしない文字列nullに解決されるため、このステージはスキップされます。
when:
pipelineStatus: Success
condition: <+codebase.tag> ~/v.*/
今回のブログでは、whenディレクティブと組み込み変数を使用した条件付き実行について学びました。
複数のパイプラインを作成・管理するのではなく、1つのパイプラインで類似の、しかし微妙に異なるユースケースに対応できることを示しました。
より詳しく知りたい方は、こちらをご参照ください。
この記事はHarness社のウェブサイトで公開されているものをDigital Stacksが日本語に訳したものです。無断複製を禁じます。原文はこちらです。