マージリクエストの依存関係
- プラン: Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
単一の機能が複数のマージリクエストにまたがり、複数のプロジェクトに分散することがあり、作業がマージされる順序は重要になる場合があります。マージリクエスト依存関係を設定すると、Merge request dependencies must be mergedのマージチェックが満たされるまで、依存するマージリクエストはマージできません。
マージリクエストの依存関係は、以下の点で役立ちます:
- 必須ライブラリへの変更が、そのライブラリをインポートするプロジェクトへの変更よりも先にマージされるようにします。
- ドキュメントのみのマージリクエストが、機能の作業自体がマージされる前にマージされるのを防ぎます。
- 権限マトリックスを更新するマージリクエストをマージするよう要求し、正しい権限をまだ持っていないユーザーからの作業がマージされるのを防ぎます。
プロジェクトme/myexampleがmyfriend/libraryからライブラリをインポートしている場合、myfriend/libraryが新しい機能をリリースしたらプロジェクトを更新する必要があります。myfriend/libraryが新しい機能を追加する前に、me/myexampleへの変更をマージすると、プロジェクトのデフォルトブランチが破損します。マージリクエスト依存関係により、作業が早すぎるタイミングでマージされるのを防ぎます:
%%{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以降では、間接的なネストされた依存関係がサポートされます。マージリクエストは最大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で提案されています。
マージリクエストはそれ自体に依存することはできませんが(自己参照)、循環依存関係を作成することは可能です。
マージリクエストの依存関係を表示する
マージリクエストが別のマージリクエストに依存している場合、マージリクエストのレポートセクションにはその依存関係に関する情報が表示されます:
マージリクエストの依存関係情報を表示するには:
- 上部のバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 左サイドバーで、コード > マージリクエストを選択し、目的のマージリクエストを特定します。
- マージリクエストレポート領域までスクロールします。依存するマージリクエストには、マージされる 1 個 のマージリクエストに依存のように、設定されている依存関係の総数に関する情報が表示されます。
- 全て展開を選択して、各依存関係のタイトル、マイルストーン、割り当て先、およびパイプラインステータスを表示します。
マージリクエストの依存関係がすべてマージされるまで、自分のマージリクエストはマージできません。
クローズされたマージリクエスト
クローズされたマージリクエストは、その計画された作業をマージせずにクローズできるため、依然として依存するマージリクエストのマージを妨げます。マージリクエストがクローズされ、その依存関係が関連しなくなった場合、その依存関係を削除して、依存するマージリクエストのブロックを解除します。
新しい依存するマージリクエストを作成する
新しいマージリクエストを作成する際、他の特定の作業がマージされるまで、そのマージリクエストがマージされるのを防ぐことができます。この依存関係は、マージリクエストが別のプロジェクトにある場合でも機能します。
前提条件:
- デベロッパー、メンテナー、またはオーナーのロールを持っているか、プロジェクトでマージリクエストを作成する権限を持っている必要があります。
- 依存するマージリクエストは、PremiumまたはUltimateプランのプロジェクトにある必要があります。
新しいマージリクエストを作成し、それを別のマージリクエストに依存するものとしてマークするには:
- 新しいマージリクエストを作成します。
- マージリクエストの依存関係に、この作業がマージされる前にマージされるべきマージリクエストへの参照または完全なURLを貼り付けます。参照は
path/to/project!merge_request_idの形式です。 - マージリクエストを作成を選択します。
マージリクエストを編集して依存関係を追加する
既存のマージリクエストを編集し、それを別のマージリクエストに依存するものとしてマークすることができます。
前提条件:
- デベロッパー、メンテナー、またはオーナーのロールを持っているか、プロジェクトでマージリクエストを編集する権限を持っている必要があります。
これを行うには、次の手順を実行します:
- 上部のバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 左サイドバーで、コード > マージリクエストを選択し、目的のマージリクエストを特定します。
- 編集を選択します。
- マージリクエストの依存関係に、この作業がマージされる前にマージされるべきマージリクエストへの参照または完全なURLを貼り付けます。参照は
path/to/project!merge_request_idの形式です。
マージリクエストから依存関係を削除する
依存するマージリクエストを編集し、依存関係を削除することができます。
前提条件:
- プロジェクトでマージリクエストを編集できるロールを持っている必要があります。
上部のバーで、検索または移動先を選択して、プロジェクトを見つけます。
左サイドバーで、コード > マージリクエストを選択し、目的のマージリクエストを特定します。
編集を選択します。
マージリクエストの依存関係までスクロールし、削除したい各依存関係の参照の横にある削除を選択します。
表示する権限のないマージリクエストの依存関係は 1 inaccessible merge request として表示されます。依存関係は引き続き削除できます。
変更を保存を選択します。
トラブルシューティング
プロジェクトのインポートまたはエクスポート時の依存関係を保持する
プロジェクトをインポートまたはエクスポートする際、依存関係は保持されません。詳細については、イシュー #12549を参照してください。
