YAML anchorとは? YAMLブロックの再利用の解説
YAML anchorはYAMLのブロックに名前を付け、aliasを介して別の場所で再利用できるようにするもので、同じ設定を繰り返すのを避けられます。
anchorはYAMLの"繰り返すな"への答えです。設定の一部を一度定義し、それに名前を付け、他の場所でその名前を参照できます。繰り返しの多いパイプライン設定 - 共有されるjob設定や繰り返されるstepブロック - に対して、anchorは多くの重複を削減できますが、すべてのツールがサポートしているわけではありません。
anchorとalias
値の上にアンパサンドと名前を付けてanchorを定義し、後でアスタリスクと同じ名前でそれを参照します。YAMLが解析されるとき、aliasはanchorされた値に置き換えられます。これにより、1つの定義が同じファイル内の多くの場所に供給できます。
merge key
merge key(二重の小なり記号の特別なキー)を使うと、anchorされたmapのすべてのフィールドを別のmapに引き込み、フィールドを上書きしたり追加したりできます。これが、設定のベースブロックを構築し、すべてのフィールドをコピー&ペーストせずにそのバリエーションを作る方法です。
anchorはファイルローカル
anchorは、それを定義する単一のドキュメント内にのみ存在します。別々のファイルをまたいでanchorを参照することはできず、parserはロード時にaliasを展開するため、設定を利用するツールはanchorを決して見ません - 完全に展開された結果だけを見ます。
CI設定におけるanchor
GitLab CIとCircleCIは、jobやstepの定義を共有するためにYAML anchorをサポートします。対照的にGitHub Actionsはworkflowファイルでanchorを展開しません - 代わりにcomposite actionやreusable workflowを使います。どのプラットフォームがサポートするかを知っておくと、"anchorが無視された"という混乱する驚きを防げます。
# GitLab CI reusing a block with an anchor
.default_job: &default_job
image: node:20
tags: [docker]
build:
<<: *default_job
script: npm run buildいつ使うか
anchorは、サポートするプラットフォーム上で1つのファイル内で本当に繰り返される設定に最適です。ファイルをまたいだ再利用やGitHub Actionsでは、anchorより強力で移植性の高いreusable workflowやcomposite actionを優先してください。
重要なポイント
- YAML anchorはブロックに名前を付け、別の場所のaliasがそれを再利用できるようにして、重複を減らします。
- merge keyを使うと、anchorされたmapを継承し、特定のフィールドを上書きできます。
- GitLab CIとCircleCIはanchorをサポートしますが、GitHub Actionsはサポートしないため、そこではreusable workflowを使います。