株式会社ネットワールドのエンジニアがお届けする技術情報ブログです。
各製品のエキスパートたちが旬なトピックをご紹介します。

GitとCI/CDに関する知識ゼロのSEが、GitLabでマージリクエストの依存関係を設定するだけ

皆様こんにちは。SEの小池と申します。

GitLabでは、ブランチに含まれるソースコードの変更をマージ前にチェックする方法 及び それを提供する機能をマージリクエスト (略してMR) と呼んでいます。
今日はGitLabのPremium以上で利用可能なマージリクエストの依存関係の設定について紹介いたします。

本記事の対象の方

  • GitLabでマージリクエストの依存関係を設定したい方。
  • GitLabで異なるプロジェクトのマージリクエストの依存関係を設定したい方。

今回のブログのゴール

このブログのゴールはこちらです。

今回のゴール
  • Merge request dependencies 機能を使ってマージリクエストの依存関係を設定する。

このブログをお読みいただくにあたっての事前ご連絡事項

  • 本記事はSaaS版である GitLab.com の15.4.0-pre (Ultimate) における仕様をベースに記載しております。それ以外のエディションやバージョンではこの記事に記載の通りではない可能性がございます。
  • 本記事はマージリクエストに関する説明は記載しておりません。マージリクエストの仕様についてはGitLab Docs (こちら) をご参照ください。
  • 本記事のGitLabのGUIは日本語にローカライズした状態で掲載しております。それ以外の言語をご利用の方は適宜読み替えてください。

マージリクエストの依存関係とは?

GitLabにおいてマージリクエストの依存関係とは、特定のマージリクエストをマージする際、他のマージリクエストがマージされることが前提となっている状況を指します。

図を用いて簡単に説明致します。
例えば以下のような開発状態のプロジェクトがあったとします。

この図において、ブランチfeature-Aとブランチfeature-Bは両方ともターゲットブランチがmainです。
マージリクエストに設定できるソースブランチは1つだけなので、図のようにブランチが2つある場合はマージリクエストも2つあるはずです。
それぞれのマージリクエストをMR-AMR-Bとします。

この時、プロジェクトの仕様等の理由でブランチfeature-Aをブランチmainにマージさせる前に、ブランチfeature-Bをブランチmainにマージさせる必要があるとします。

つまり、マージリクエストMR-Aは、マージリクエストMR-Bのマージが完了しなければマージすることができません。
この状況はマージリクエストMR-Aが、マージリクエストMR-Bに依存している状態と言えます。

この様にマージリクエストの依存関係を考慮してマージを行う必要がある場合、コメントに依存関係を記載して運用で回避することももちろん可能ですが、依存関係をシステム的に設定できるとより安全です。
GitLabのPremium以上のティアであれば、上記のようなマージリクエストの依存関係を Merge request dependencies 機能を使って設定することができます!

Merge request dependencies 機能概要

GitLabの Merge request dependencies 機能は、マージリクエスト間の依存関係を設定できる機能です。
本機能はPremium以上のティアでご利用いただける機能でございます。
(無償版 (Free) をお使いの場合は、マージリクエストの作成画面 及び 編集画面に本機能の設定値を入力する項目が表示されません。)

本機能はマージリクエストにおいて、マージ前に 他のマージリクエストのマージ を条件に入れることができます。
参考 : Merge request dependencies | GitLab

依存関係を設定したマージリクエストの詳細画面では、下図のように、 依存するマージリクエストの名前とそのステータスが表示されます。
また、通常 [マージ] ボタンが表示されているところには、依存するマージリクエストのマージがまだ済んでいないのでマージがブロックされている旨が表示されます。

依存するマージリクエストが全てマージされると、下図のように [マージ] ボタンが表示され、マージすることが可能になります。

本機能を利用すると、同じプロジェクトのマージリクエストの依存関係を設定することはもちろん、異なるプロジェクトのマージリクエストとの依存関係を設定することができます。

またこの際、依存関係を設定する側のマージリクエストがあるプロジェクトがPremium以上のティアであれば、無償版 (Free) のGitLabのプロジェクトにあるマージリクエストを依存関係に指定するとが可能です。
参考 : Merge request dependencies | GitLab

ただし、逆に無償版 (Free) のGitLabのプロジェクトにあるマージリクエストから、Premium以上のティアのGitLabのプロジェクトにあるマージリクエストを依存関係に指定することはできません。

設定方法

新規のマージリクエストの場合は、マージリクエストの作成画面から設定することができます。

既存のマージリクエストの場合は、マージリクエスト詳細画面の右上の [編集] ボタンをクリックし、編集画面から設定することができます。

マージリクエストの依存関係 に依存するマージリクエストを指定します。
指定の仕方は、以下のいずれかとなります。

  1. マージリクエストIDを指定する。(設定画面)
  2. マージリクエストのURLを張り付ける。(設定画面)
  3. マージリクエストのリファレンスを指定する。(設定画面)

同じプロジェクトの場合に限り、マージリクエストのIDを指定するだけで依存関係を設定できます。
マージリクエストの依存関係 欄に!<マージリクエストID>と指定します。
なおマージリクエストのIDは、そのプロジェクトの [マージリクエスト] で表示されるマージリクエスト一覧で確認することができます。

依存関係に指定したいマージリクエストのURLをそのまま張り付けることでも、依存関係を設定できます。
マージリクエストのURLは、マージリクエストの詳細画面を開いた際のURLです。
これをコピーして マージリクエストの依存関係 欄に貼り付けます。

マージリクエストのリファレンスを指定することでも、依存関係を指定できます。
リファレンスは、マージリクエストの詳細画面で右側にあるサイドバーの一番下に表示されています。
これをコピーして マージリクエストの依存関係 欄に貼り付けます。

依存関係の設定に関する注意事項

ここではMerge request dependencies 機能の利用における、いくつかの注意事項を記載します。

注意1 : 入れ子になっている関係は設定できない

2022/09/07現在、Merge request dependencies 機能では入れ子になった依存関係は設定することができません。

例えば、3つのマージリクエストMR-A, MR-B, MR-Cがあり、マージリクエストMR-AはマージリクエストMR-Bに依存し、マージリクエストMR-BはマージリクエストMR-Cに依存しているとします。

この様に依存関係が入れ子状態になっている場合、Merge request dependencies 機能では、マージリクエストMR-AとマージリクエストMR-Bの依存関係か、マージリクエストMR-BとマージリクエストMR-Cの依存関係のどちらかしか設定できません。
参考 : Merge request dependencies - Complex merge order dependencies are unsupported | GitLab

注意2 : APIはサポートされていません

2022/09/07現在、マージリクエストの依存関係を管理するためのAPIはサポートされていません。
ただ、関連するイシューを見る限り、今後実装される可能性は十分ありそうです。
参考 : Merge request dependencies | GitLab, API support for managing merge request dependencies (#12551) · Issues · GitLab.org / GitLab · GitLab

注意3 : 依存されている側のマージリクエストは、それをGUIから確認できない

依存設定を入れたマージリクエスト側は、詳細画面で以下の図のように、依存関係が設定されていることを目視で確認できます。

しかし、依存されている側のマージリクエストの方は、詳細画面には何も表示されず、別のマージリクエストで依存関係に自分が設定されたことを確認できません。

注意4 : 別のプロジェクトを依存関係に指定できないケース

前に述べた通り、Merge request dependencies 機能は別のプロジェクトのマージリクエストを依存関係に指定することができます。ただしこの際、依存関係に指定したいマージリクエストのプロジェクトの設定次第では、依存関係に指定することができません。
(ここに記載している情報は2022/09/07時点で筆者が検証で確認した挙動です。バージョンや細かいパラメーター指定によっては異なる挙動になる可能性がございます。参考程度にご参照ください。)

上の図の例で、マージリクエストMR-AでマージリクエストMR-Bを依存関係に指定できないケースは以下の通りです。

  • Project-Bの可視性レベルがプライベート、且つ、マージリクエストMR-Aで依存関係を指定しようとしているユーザーがProject-Bのメンバーに入っていない
  • Project-Bの可視性レベルがプライベート、且つ、マージリクエストMR-Aで依存関係を指定しようとしているユーザーがProject-BでロールGuestになっている

最後に

この度はGitもCI/CDもよくわかっていないど素人SEによるGitLab検証ブログをお読みいただき、誠にありがとうございます。
このブログの目標は以下のとおりでしたが、皆さまはいかがでしたでしょうか。


今回のゴール
  • Merge request dependencies 機能を使ってマージリクエストの依存関係を設定する。

マージリクエスト間で依存関係がある場合、コメントに依存関係を記して運用でマージの順番を定めることもできますが、Merge request dependencies 機能を用いてシステム的に依存関係を指定すると確実で安心かと存じます。
もしマージリクエスト間の依存関係がある案件では、Merge request dependencies 機能をお試しいただければと存じます。
この記事がGitLabを触り始めた方の一助となれば幸いにございます。


GitLabに関するお問い合わせは、以下のフォームからお願い致します。
GitLab製品 お問い合わせ

今までのGitLabの検証ブログはこちらです。
GitLab カテゴリーの記事一覧 - ネットワールド らぼ

GitLab操作デモ動画 (基本編) を作ってみました。(音声の録音は自宅でiPhoneのボイスメモ使うという超低クオリティですが…。)
つたない内容ではありますが、ご興味がおありでしたら是非ご視聴いただければと存じます。

www.youtube.com