マージトレイン
- プラン: Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
デフォルトブランチへのマージが頻繁に行われるプロジェクトでは、異なるマージリクエストの変更が互いに競合する可能性があります。マージトレインを使用して、マージリクエストをキューに入れます。各マージリクエストは、他の以前のマージリクエストと比較され、すべてが連携して動作することが保証されます。
詳細については、以下をご覧ください:
- マージトレインの仕組みについては、マージトレインのワークフローを確認してください。
- マージトレインを使用する理由については、マージトレインの開始がDevOpsの効率性をどのように改善するかをお読みください。
マージトレインのワークフロー
マージを待機しているマージリクエストがなく、マージまたは自動マージに設定を選択すると、マージトレインが開始されます。GitLabは、変更がデフォルトブランチにマージできることを確認するマージトレインパイプラインを開始します。この最初のパイプラインはマージ結果パイプラインと同じで、ソースブランチとターゲットブランチを組み合わせた変更に対して実行されます。内部マージ結果コミットの作成者は、マージを開始したユーザーです。
最初のパイプラインが完了した直後にマージする2番目のマージリクエストをキューに入れるには、マージまたは自動マージに設定を選択して、トレインに追加します。この2番目のマージトレインパイプラインは、ターゲットブランチと組み合わせた_両方_のマージリクエストの変更に対して実行されます。同様に、3番目のマージリクエストを追加すると、そのパイプラインは、ターゲットブランチとマージされた3つのマージリクエストすべての変更に対して実行されます。パイプラインはすべて並行して実行されます。
各マージリクエストは、以下の場合にのみターゲットブランチにマージされます:
- マージリクエストのパイプラインが正常に完了した場合。
- その前にキューに入れられた他のすべてのマージリクエストがマージされた場合。
マージトレインパイプラインが失敗した場合、マージリクエストはマージされません。GitLabはそのマージリクエストをマージトレインから削除し、その後にキューに入れられたすべてのマージリクエストに対して新しいパイプラインを開始します。
次に例を示します:
3つのマージリクエスト(A、B、およびC)が順番にマージトレインに追加され、並行して実行される3つのマージ結果パイプラインが作成されます:
- 最初のパイプラインは、
Aからの変更とターゲットブランチを組み合わせて実行されます。 - 2番目のパイプラインは、
AとBからの変更とターゲットブランチを組み合わせて実行されます。 - 3番目のパイプラインは、
A、B、およびCからの変更とターゲットブランチを組み合わせて実行されます。
Bのパイプラインが失敗した場合:
- 最初のパイプライン(
A)は引き続き実行されます。 Bがトレインから削除されます。Cのパイプラインはキャンセルされ、AとCからの変更とターゲットブランチを組み合わせた新しいパイプラインが(Bの変更なしで)開始されます。
次に、Aが正常に完了すると、ターゲットブランチにマージされ、Cの実行が継続されます。トレインに追加された新しいマージリクエストには、ターゲットブランチにあるAの変更と、マージトレインからのCの変更が含まれます。
マージトレインの並列実行によってコミットがデフォルトブランチを破損するのを防ぐ方法のデモについては、このビデオをご覧ください。
パイプラインの自動キャンセル
GitLab CI/CDは、冗長なパイプラインを検出し、リソースを節約するためにそれらをキャンセルします。
冗長なマージトレインパイプラインは、以下の場合に発生します:
- マージトレイン内のいずれかのマージリクエストでパイプラインが失敗した場合。
- マージトレインをスキップしてすぐにマージする場合。
- マージトレインからマージリクエストを削除する場合。
これらの場合、GitLabはトレイン上の一部のまたはすべてのマージリクエストに対して新しいマージトレインパイプラインを作成する必要があります。古いパイプラインは、マージトレイン内の以前の結合された変更と比較していましたが、これはもはや有効ではないため、これらの古いパイプラインはキャンセルされます。
マージトレインを有効にする
前提要件:
- メンテナーのロールを持っている必要があります。
- リポジトリは、外部リポジトリではなく、GitLabリポジトリである必要があります。
- パイプラインがマージリクエストパイプラインを使用するように設定されている必要があります。そうでない場合、マージリクエストが未解決の状態でスタックしたり、パイプラインがドロップされたりする可能性があります。
- マージ結果パイプラインが有効になっている必要があります。
マージトレインを有効にするには:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 設定 > マージリクエストを選択します。
- GitLab 16.4以前では、マージ方法セクションで、マージコミットが選択されていることを確認します。GitLab 16.5以降では、任意のマージ方法を使用できます。
- マージオプションセクションで、マージされた結果のパイプラインを有効にするが有効になっていることを確認し、**マージトレインを有効にする。**を選択します。
- 変更を保存を選択します。
マージトレインを開始する
前提要件:
- ターゲットブランチにマージまたはプッシュする権限が必要です。
マージトレインを開始するには:
- マージリクエストに移動します。
- 次を選択します:
- パイプラインが実行されていない場合は、マージ。
- パイプラインが実行されている場合は、自動マージに設定。
マージリクエストのマージトレイン状態が、A new merge train has started and this merge request is the first of the queue. View merge train details.のようなメッセージとともにパイプラインウィジェットの下に表示されます。リンクを選択して、マージトレインを表示できます。
他のマージリクエストをトレインに追加できるようになりました。
マージトレインを表示する
マージトレインを表示して、キュー内のマージリクエストの順序と状態をより詳細に把握できます。マージトレインの詳細ページには、キュー内のアクティブなマージリクエストと、トレインの一部であったマージ済みのマージリクエストが表示されます。
マージリクエストのリストからマージトレインの詳細にアクセスするには:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- コード > マージリクエストを選択します。
- マージリクエストのリストの上にあるマージトレインを選択します。
- オプション。ターゲットブランチでマージトレインをフィルタリングします。
次の場所から**マージトレインの詳細を表示します。**を選択して、このビューにアクセスすることもできます:
- マージトレインに追加されたマージリクエストのパイプラインウィジェットとシステムノート。
- マージトレインパイプラインのパイプライン詳細ページ。
マージトレインの詳細ビューからマージリクエストを削除( )することもできます。
マージリクエストをマージトレインに追加する
前提要件:
- ターゲットブランチにマージまたはプッシュする権限が必要です。
マージリクエストをマージトレインに追加するには:
- マージリクエストにアクセスします。
- 次を選択します:
- パイプラインが実行されていない場合は、マージ。
- パイプラインが実行されている場合は、自動マージに設定。
マージリクエストのマージトレイン状態が、This merge request is 2 of 3 in queue.のようなメッセージとともにパイプラインウィジェットの下に表示されます
各マージトレインは、最大20個のパイプラインを並行して実行できます。マージトレインに20を超えるマージリクエストを追加すると、追加のマージリクエストはキューに入れられ、パイプラインが完了するのを待ちます。マージトレインへの参加を待機している、キューに入れられたマージリクエストの数に制限はありません。
マージリクエストをマージトレインから削除する
マージリクエストをマージトレインから削除すると:
- 削除されたマージリクエストの後にキューに入れられたマージリクエストのすべてのパイプラインが再起動します。
- 冗長なパイプラインはキャンセルされます。
後でマージリクエストをマージトレインに再度追加できます。
マージリクエストをマージトレインから削除するには:
- マージリクエストから自動マージのキャンセルを選択します。
- マージトレインの詳細から、マージリクエストの横にある を選択します。
マージトレインをスキップしてすぐにマージする
緊急にマージする必要がある重要なパッチのような優先度の高いマージリクエストがある場合は、今すぐマージするを選択できます。
マージリクエストをすぐにマージすると:
- マージリクエストからのコミットが、マージトレインの状態を無視してマージされます。
- トレイン上の他のすべてのマージリクエストのマージトレインパイプラインはキャンセルされます。
- 新しいマージトレインが開始され、元のマージトレインからのすべてのマージリクエストがこの新しいマージトレインに追加され、それぞれに新しいマージトレインパイプラインが追加されます。これらの新しいマージトレインパイプラインには、すぐにマージされたマージリクエストによって追加されたコミットが含まれるようになりました。
すぐにマージすると、大量のCI/CDリソースを使用する可能性があります。このオプションは、重大な状況でのみ使用してください。
プロジェクトで早送りマージメソッドを使用し、ソースブランチがターゲットブランチより遅れている場合、merge immediately(すぐにマージ)オプションは使用できない場合があります。詳細については、イシュー434070を参照してください。
マージトレインパイプラインを再起動することなく、マージトレインをスキップしてすぐにマージできるようにする
- ステータス: 実験的機能
GitLab Self-Managedでは、デフォルトでこの機能を利用できます。機能を非表示にするには、管理者はmerge_trains_skip_trainという名前の機能フラグを無効にできます。GitLab.comおよびGitLab Dedicatedでは、この機能を使用できます。
実行中のマージトレインを完全に再起動せずに、マージリクエストをマージできます。この機能を使用すると、パイプラインを安全にスキップできる変更(たとえば、マイナーなドキュメントの更新)をすばやくマージできます。
早送りまたは半線形のマージ方法では、マージトレインをスキップできません。詳細については、イシュー429009を参照してください。
マージトレインのスキップは実験的な機能です。今後のリリースで変更または完全に削除される可能性があります。
この機能を使用すると、セキュリティまたはバグ修正をすばやくマージできますが、トレインをスキップしたマージリクエストの変更は、トレイン内の他のマージリクエストに対して検証されません。これらの他のマージトレインパイプラインが正常に完了してマージされた場合、結合された変更に互換性がないリスクがあります。その後、ターゲットブランチで新しい不具合を解決するために追加の作業が必要になる可能性があります。
前提要件:
- メンテナーのロールを持っている必要があります。
- マージトレインが有効になっている必要があります。
パイプラインを再起動せずにトレインのスキップを有効にするには:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 設定 > マージリクエストを選択します。
- マージオプションセクションで、マージされた結果のパイプラインを有効にするオプションと**マージトレインを有効にする。**オプションが有効になっていることを確認します。
- マージトレインのスキップを許可を選択します。
- 変更を保存を選択します。
マージトレインをスキップしてマージリクエストをマージするには、属性skip_merge_trainをtrueに設定してマージするマージリクエストマージAPIエンドポイントを使用します。
マージリクエストがマージされ、既存のマージトレインパイプラインはキャンセルまたは再起動されません。
トラブルシューティング
マージリクエストがマージトレインから削除されました
マージトレインパイプラインの実行中にマージリクエストがマージできなくなった場合、マージトレインはマージリクエストを自動的にドロップします。たとえば、これは次の原因で発生する可能性があります:
- マージリクエストをドラフトに変更する。
- マージの競合。
- すべてのスレッドを解決する必要があるが有効になっている場合の、未解決の新しい会話スレッド。
システムノートでマージリクエストがマージトレインから削除された理由を確認できます。概要タブのアクティビティーセクションで、User removed this merge request from the merge train because ...のようなメッセージを確認してください
自動マージを使用できません
マージトレインが有効になっている場合、マージトレインをスキップするために自動マージ(以前のパイプラインが成功したときにマージ)を使用できません。詳細については、イシュー12267を参照してください。
マージトレインパイプラインを再試行できません
マージトレインパイプラインが失敗すると、マージリクエストがトレインから削除され、パイプラインが失敗した後に再試行できなくなります。マージトレインパイプラインは、マージリクエストの変更と、すでにトレイン上にある他のマージリクエストからの変更のマージされた結果に対して実行されます。マージリクエストがトレインから削除されると、マージされた結果が古くなり、パイプラインを再試行できなくなります。
次のことができます:
- マージリクエストをトレインに再度追加します。これにより、新しいパイプラインがトリガーされます。
- ジョブが断続的に失敗する場合は、ジョブに
retryキーワードを追加します。再試行後に成功した場合、マージリクエストはマージトレインから削除されません。
マージリクエストをマージトレインに追加できません
パイプラインが完了しているが有効になっているが、最新のパイプラインが失敗した場合:
- 自動マージに設定またはマージオプションは使用できません。
- マージリクエストには
The pipeline for this merge request failed. Please retry the job or push a new commit to fix the failure.が表示されます
マージリクエストをマージトレインに再度追加する前に、次のことを試すことができます:
- 失敗したジョブを再試行します。合格し、他のジョブが失敗しなかった場合、パイプラインは成功としてマークされます。
- パイプライン全体を再実行します。パイプラインタブで、パイプラインの実行を選択します。
- イシューを修正する新しいコミットをプッシュします。これにより、新しいパイプラインもトリガーされます。
詳細については、関連イシューを参照してください。