有効非巡回グラフ

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

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

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

モノレポを次のように考えます:

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

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

ビルド テスト デプロイ
ビルド test_a デプロイ_a
ビルドビー test_b デプロイ
ビルド test_c デプロイ
ビルド_d test_d デプロイ_d

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

ユースケース

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

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

使用方法

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

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

制限事項

有向非巡回グラフは複雑な機能であり、初期のMVCの時点では、特定のユースケースを回避する必要があるかもしれません。 詳細については、こちらをご覧ください:

DAGの可視化

  • GitLab 13.1でベータ機能として導入されました
  • フィーチャーフラグで有効・無効を切り替えることができ、デフォルトでは無効になっています。
  • GitLab.comで有効になっています。
  • 本番での使用はお勧めできません。
  • GitLabセルフマネージドインスタンスでは、GitLab管理者が有効にすることができます。

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

DAG visualization example

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

DAG visualization with path highlight

DAG可視化の有効化または無効化

DAGビジュアライゼーションは開発中であり、より多くのテストが必要ですが、ユーザーがその制限や用途を確認できるよう、ベータ機能として提供しています。

GitLab RailsコンソールにアクセスできるGitLab管理者は、インスタンスでこの機能を有効にすることができます:

# Instance-wide
Feature.enable(:dag_pipeline_tab)
# or by project
Feature.enable(:dag_pipeline_tab, Project.find(<project id>))