マージリクエストの依存関係
- プラン: Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
1つの機能が複数のマージリクエストにまたがり、複数のプロジェクトに分散している場合があり、作業をマージする順序が重要になる場合があります。マージリクエストの依存関係を設定すると、Merge request dependencies must be merged(マージリクエストの依存関係がマージされている必要があります)というマージチェックが満たされるまで、依存するマージリクエストをマージできません。
マージリクエストの依存関係は、次のことに役立ちます:
- 必要なライブラリへの変更が、ライブラリをインポートするプロジェクトへの変更より先にマージされるようにします。
- ドキュメントのみのマージリクエストが、機能の作業自体がマージされる前にマージされるのを防ぎます。
- アクセス許可マトリックスを更新するマージリクエストをマージする前に、まだ正しいアクセス許可を持っていない人からの作業をマージすることを要求します。
プロジェクトme/myexampleがmyfriend/libraryからライブラリをインポートする場合、myfriend/libraryが新しい機能をリリースするときにプロジェクトを更新する必要があります。me/myexampleへの変更をmyfriend/libraryが新しい機能を追加する前にマージすると、プロジェクトのデフォルトブランチが壊れてしまいます。マージリクエストの依存関係により、作業が早すぎるマージを防ぐことができます:
%%{init: { "fontFamily": "GitLab Sans" }}%%
graph TB
accTitle: Merge request dependencies
accDescr: Shows how a merge request dependency prevents work from merging too soon.
A['me/myexample' project]
B['myfriend/library' project]
C[Merge request #1:<br>Create new version 2.5]
D[Merge request #2:<br>Add version 2.5<br>to build]
A-->|contains| D
B---->|contains| C
D-.->|depends on| C
C-.->|blocks| D
me/myexampleマージリクエストをドラフトとしてマークし、コメントで理由を説明することができます。このアプローチは手動であり、特にマージリクエストが異なるプロジェクトの他の複数のプロジェクトに依存している場合は、スケールしません。代わりに、次のことを行う必要があります:
- ドラフトまたは準備完了ステータスで、個々のマージリクエストの準備状況を追跡します。
- マージリクエストの依存関係を使用して、マージリクエストをマージする順序を強制します。
マージリクエストの依存関係はGitLab Premiumの機能ですが、GitLabはこの制限を依存するマージリクエストに対してのみ適用します:
- GitLab Premiumプロジェクトのマージリクエストは、GitLab Freeプロジェクトであっても、他のマージリクエストに依存できます。
- GitLab Freeプロジェクトのマージリクエストは、他のマージリクエストに依存できません。
ネストされた依存関係
GitLabバージョン16.7以降では、間接的なネストされた依存関係がサポートされています。1つのマージリクエストは最大10個のブロッカーを持つことができ、順番に最大10個の他のマージリクエストをブロックできます。この例では、myfriend/library!10はherfriend/another-lib!1に依存しており、次にmycorp/example!100に依存しています:
%%{init: { "fontFamily": "GitLab Sans" }}%%
graph LR;
accTitle: Merge request dependency chain
accDescr: Flowchart that shows how merge request A depends on merge request B, while merge request B depends on merge request C
A[myfriend/library!10]-->|depends on| B[herfriend/another-lib!1]
B-->|depends on| C[mycorp/example!100]
ネストされた依存関係はGitLabのUIに表示されませんが、UIのサポートはエピック5308で提案されています。
マージリクエスト自体に依存することはできません(自己参照)が、循環依存関係を作成することは可能です。
マージリクエストの依存関係を表示
マージリクエストが別のマージリクエストに依存している場合、マージリクエストレポートセクションには、依存関係に関する情報が表示されます:
マージリクエストの依存関係に関する情報を表示するには、次のようにします:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- コード > マージリクエストを選択し、マージリクエストを特定します。
- マージリクエストレポートの領域までスクロールします。依存するマージリクエストには、設定された依存関係の合計数に関する情報(Depends on 1 merge request being merged(1つのマージリクエストがマージされるのを依存する)など)が表示されます。
- 全て展開を選択して、各依存関係のタイトル、マイルストーン、担当者、およびパイプラインステータスを表示します。
マージリクエストの依存関係がすべてマージされるまで、マージリクエストをマージできません。メッセージMerge blocked: you can only merge after the above items are resolved(マージがブロックされました: 上記の項目が解決された後にのみ、マージできます)が表示されます。
クローズされたマージリクエスト
クローズされたマージリクエストは、計画された作業をマージせずにマージリクエストをクローズできるため、依存するマージリクエストがマージされないようにします。マージリクエストがクローズされ、依存関係が不要になった場合は、依存関係として削除して、依存するマージリクエストのブロックを解除します。
新しい依存するマージリクエストを作成
新しいマージリクエストを作成するときに、他の特定の作業がマージされた後にマージされないようにすることができます。この依存関係は、マージリクエストが別のプロジェクトにある場合でも機能します。
前提要件:
- デベロッパー以上のロールを持っているか、プロジェクトでマージリクエストを作成する権限が必要です。
- 依存するマージリクエストは、PremiumまたはUltimateプランのプロジェクトにある必要があります。
新しいマージリクエストを作成し、それを別のマージリクエストに依存するものとしてマークするには:
- 新しいマージリクエストを作成します。
- マージリクエストの依存関係で、この作業がマージされる前にマージする必要があるマージリクエストへの参照または完全なURLを貼り付けます。参照は、
path/to/project!merge_request_idの形式です。 - マージリクエストを作成を選択します。
マージリクエストを編集して依存関係を追加
既存のマージリクエストを編集して、別のマージリクエストに依存するものとしてマークできます。
前提要件:
- 少なくともデベロッパーロールを持っているか、プロジェクトでマージリクエストを編集する権限を持っている必要があります。
これを行うには、次の手順を実行します:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- コード > マージリクエストを選択し、マージリクエストを特定します。
- 編集を選択します。
- マージリクエストの依存関係で、この作業がマージされる前にマージする必要があるマージリクエストへの参照または完全なURLを貼り付けます。参照は、
path/to/project!merge_request_idの形式です。
マージリクエストから依存関係を削除
依存するマージリクエストを編集し、依存関係を削除できます。
前提要件:
- マージリクエストを編集できるプロジェクトのロールを持っている必要があります。
左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
コード > マージリクエストを選択し、マージリクエストを特定します。
編集を選択します。
マージリクエストの依存関係までスクロールし、削除する各依存関係の参照の横にある削除を選択します。
表示する権限のないマージリクエストの依存関係は、1 inaccessible merge request(1つのアクセスできないマージリクエスト)として表示されます。引き続き依存関係を削除できます。
変更を保存を選択します。
トラブルシューティング
プロジェクトのインポートまたはエクスポート時に依存関係を保持
プロジェクトをインポートまたはエクスポートすると、依存関係は保持されません。詳細については、イシュー #12549を参照してください。
