有効非巡回グラフ

有向非巡回グラフは、CI/CDパイプラインのコンテキストで、ステージがどのように設定されているかに関わらず、可能な限り最速で実行されるようなジョブ間の関係を構築するために使用できます。

例えば、メインプロジェクトの一部として構築される特定のツールや別のウェブサイトがあるかもしれません。DAGを使うことで、これらのジョブ間の関係を指定することができ、GitLabは各ステージの完了を待つのではなく、できるだけ早くジョブを実行します。

CI/CDのための他のDAGソリューションとは異なり、GitLabはどちらか一方を選択する必要はありません。一つのパイプラインの中で、DAGと従来のステージベースのオペレーションをハイブリッドに組み合わせて実装することができます。設定は非常にシンプルに保たれており、どのジョブでもキーワード一つで機能を有効にすることができます。

次のようなモノレポを考えてみましょう:

./service_a
./service_b
./service_c
./service_d

次のようなパイプラインがあります:

ビルドテストデプロイ
build_atest_adeploy_a
build_btest_bdeploy_b
build_ctest_cdeploy_c
build_dtest_ddeploy_d

DAG を使うことで、_b のジョブとは別に_a のジョブを関連づけることができます。サービスa のビルドに非常に長い時間がかかったとしても、サービスb はそれを待たずにできるだけ早く終了します。これとまったく同じパイプラインで、_c_d を放っておいて、標準的な GitLab パイプラインと同じようにステージシーケンスで一緒に実行することもできます。

ユースケース

DAGは、CI/CDパイプライン内のジョブ間のいくつかの異なる種類の関係を解決するのに役立ちます。最も一般的な例としては、ジョブのファンインやファンアウト、マージが必要な場合です(ダイヤモンド依存関係)。これは、マルチプラットフォームビルドや、複雑な依存関係のウェブを扱うときに起こります。例えば、オペレーションシステムのビルドや、独立してデプロイ可能だが関連性のあるマイクロサービスの複雑なデプロイメントグラフなどです。

さらに、DAGはパイプラインの一般的な高速化や、迅速なフィードバックの提供に役立ちます。不必要にお互いをブロックしない依存関係を作成することで、パイプラインのステージに関係なくパイプラインを可能な限り高速に実行し、出力(エラーを含む)を可能な限り迅速に開発者に提供できるようにします。

使用方法

ジョブ間の関係は、needs キーワードを使用して定義します。

needs キーワードはparallelキーワードとも連動するため、パイプライン内の並列化のための強力なオプションを提供します。

制限事項

有向非巡回グラフは複雑な機能で、初期のMVCでは、回避しなければならないユースケースがあります。詳しくは

ニーズの可視化

ニーズの可視化により、DAG内の依存するジョブ間の関係を簡単に可視化することができます。このグラフは、パイプライン内で他のジョブを必要とする、または他のジョブから必要とされているすべてのジョブを表示します。関係のないジョブはこのビューには表示されません。

ニーズの視覚化を表示するには、needs キーワードを使用するパイプラインを表示するときに、ニーズを選択します。

Needs visualization example

ノードを選択すると、そのノードが依存するすべてのジョブパスがハイライトされます。

Needs visualization with path highlight

完全なパイプライングラフでneeds の関係を見ることもできます。