列車のマージ

note
GitLab 16.0 以降ではStart merge trainStart merge train when pipeline succeedsボタンはSet to auto-mergeになりました。Remove from mergetrain はCancel auto-mergeに変更されました。

マージトレインを使用してマージリクエストをキューに入れ、ターゲットブランチにマージする前にそれらの変更が一緒に動作することを確認します。

デフォルトブランチへのマージが頻繁に行われるプロジェクトでは、異なるマージリクエストの変更が衝突する可能性があります。マージ結果のパイプラインは、変更がデフォルトブランチの内容と連動することを保証しますが、他の人が同時にマージしている内容とは連動しません。

マージトレインは、セミリニアヒストリーマージリクエストや 早送りマージリクエストでは機能しません。

詳細については

マージトレインのワークフロー

マージトレインはマージ待ちのマージリクエストがないときに開始されます。 マージ.GitLab は、変更がデフォルトブランチにマージできるかどうかを検証するマージトレインパイプラインを開始します。この最初のパイプラインはマージ結果パイプラインと同じもので、ソースブランチとターゲットブランチの変更を合わせたものに対して実行されます。内部マージ結果のコミットの作成者は、マージを開始したユーザーです。

最初のパイプラインが完了した直後に、2 番目のマージリクエストをキューに入れます。 自動マージに設定を選択してください。この 2 番目のマージトレイン パイプラインは、_両方の_マージリクエストの変更とターゲット ブランチを組み合わせて実行されます。同様に、3つ目のマージリクエストを追加すると、そのパイプラインは3つすべてのマージリクエストの変更をターゲットブランチにマージして実行します。パイプラインはすべて並行して実行されます。

各マージリクエストがターゲットブランチにマージされるのは、その後になります:

  • マージリクエストのパイプラインが正常に完了したとき。
  • その前にキューに入れられた他のマージリクエストはすべてマージされます。

マージトレインのパイプラインが失敗した場合、マージリクエストはマージされません。GitLab はマージトレインからそのマージリクエストを削除し、それ以降にキューに入れられたすべてのマージリクエストのために新しいパイプラインを開始します。

使用例:

3つのマージリクエスト(A,B,C)が順番にマージトレインに追加され、並行して実行される3つのマージ結果パイプラインが作成されます:

  1. 最初のパイプラインは、A からの変更をターゲットブランチと組み合わせて実行します。
  2. 2番目のパイプラインは、AB の変更とターゲットブランチを組み合わせて実行します。
  3. 3番目のパイプラインは、ABC の変更とターゲットブランチを組み合わせて実行します。

B のパイプラインが失敗した場合:

  • 最初のパイプライン(A)が実行され続けます。
  • B が列車から取り除かれます。
  • C のパイプラインはキャンセルされ、AC の変更をターゲットブランチと組み合わせた(B の変更を含まない)新しいパイプラインが開始されます。

A が正常に完了すると、ターゲットブランチにマージされ、C が引き続き実行されます。トレインに追加された新しいマージリクエストには、現在ターゲットブランチにあるA の変更と、マージトレインからのC の変更が含まれます。

マージトレインを Parallels で実行することで、コミットがデフォルトブランチを壊してしまうのを防ぐことができるというデモを、このビデオでご覧ください。

パイプラインの自動キャンセル

GitLab CI/CDは冗長なパイプラインを検出し、リソースを節約するためにパイプラインをキャンセルします。

冗長なマージトレインパイプラインは以下のような場合に発生します:

このような場合、GitLabはトレイン上のマージリクエストの一部または全部に対して新しいマージトレインパイプラインを作成しなければなりません。古いパイプラインはマージトレイン内の以前の結合された変更と比較しており、もはや有効ではないため、これらの古いパイプラインはキャンセルされます。

マージトレインの有効化

前提条件:

マージトレインを有効にするには

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定 > マージリクエストを選択します。
  3. マージ方法セクションで、マージコミットが選択されていることを確認します。
  4. マージ オプションセクションで
    • GitLab 13.6以降では、Enable merged results pipelinesと Enable merge trainsを選択してください。
    • GitLab 13.5以前では、マージ結果のパイプラインとパイプラインを有効にするを選択してください。さらに、機能フラグが正しく設定されている必要があります。
  5. 変更を保存を選択します。

マージトレインの開始

前提条件:

  • ターゲットブランチにマージしたりプッシュしたりする権限が必要です。

マージトレインを開始するには

  1. マージリクエストにアクセスしてください。
  2. 選択してください:
    • パイプラインが実行されていない場合は、マージ
    • パイプラインが実行されている場合は、自動マージに設定します。

マージリクエストのマージトレインステータスがパイプラインウィジェットの下に表示されます。A new merge train has started and this merge request is the first of the queue.

他のマージリクエストを列車に追加できるようになりました。

マージ列車へのマージリクエストの追加

前提条件:

  • ターゲットブランチにマージしたりプッシュしたりする権限が必要です。

マージリクエストをマージトレインに追加するには

  1. マージリクエストにアクセスしてください。
  2. 選択してください:
    • パイプラインが実行されていない場合は、マージ
    • パイプラインが実行されている場合は、自動マージに設定します。

マージリクエストのマージトレインステータスがパイプラインウィジェットの下に表示されます。Added to the merge train. There are 2 merge requests waiting to be merged.

各マージトレインは最大20のパイプラインを並行して実行できます。マージ トレインに 20 を超えるマージ リクエストを追加すると、余分なマージ リクエストはキューに入れられ、パイプラインが完了するのを待ちます。マージトレインへの参加を待機しているマージリクエストのキュー数に制限はありません。

マージトレインからのマージリクエストの削除

マージ列車からマージリクエストを削除するには、自動マージのキャンセル を選択します。マージリクエストは後でマージトレインに追加することができます。

マージ列車からマージリクエストを削除する場合:

  • 削除されたマージリクエストの後にキューに入れられたマージリクエストのすべてのパイプラインが再開します。
  • 冗長なパイプラインはキャンセルされます。

マージトレインをスキップして即座にマージします。

緊急にマージしなければならない重要なパッチなど、優先度の高いマージリクエストがある場合は、すぐにマージを選択してください。

マージリクエストをすぐにマージする場合:

  • 現在のマージトレインは再作成されます。
  • すべてのパイプラインが再スタートします。
  • 冗長なパイプラインはキャンセルされます。
caution
すぐにマージすると、CI/CDリソースを大量に消費します。このオプションはクリティカルな状況でのみ使用してください。

GitLab 13.5 以前のバージョンではマージトレインを無効にします。

GitLab 13.6以降ではプロジェクト設定でマージトレインを有効/無効にすることができます。

GitLab 13.5以前では、マージ結果パイプラインが有効な場合、マージトレインは自動的に有効になります。マージトレインを使わずマージ結果パイプラインを使うには、disable_merge_trains 機能フラグを有効にしてください。

GitLab RailsコンソールにアクセスできるGitLab管理者は、機能フラグを有効にしてマージトレインを無効にすることができます:

Feature.enable(:disable_merge_trains)

この機能フラグを有効にすると、GitLabは既存のマージトレインをキャンセルします。

機能フラグを無効にしてマージトレインを再び有効にするには、次のようにします:

Feature.disable(:disable_merge_trains)

トラブルシューティング

マージリクエストがマージトレインから脱落しました。

マージトレインパイプラインの実行中にマージリクエストがマージ不可能になった場合、マージトレインは自動的にマージリクエストを削除します。たとえば、次のようなことが考えられます:

マージリクエストがマージトレインから削除された理由は、システムノートで確認できます。概要]タブのアクティビティセクションで、以下のようなメッセージを確認してください:User removed this merge request from the merge train because ...

自動マージは使用できません。

マージトレインが有効になっている場合、自動マージ(以前はパイプラインが成功したときにマージ)を使用してマージトレインをスキップすることはできません。詳細はissue 12267を参照してください。

マージトレインパイプラインを再試行できません。

マージトレインパイプラインが失敗すると、マージリクエストはトレインから削除され、パイプラインを再試行することはできません。マージトレインパイプラインは、マージリクエスト内の変更と、すでにトレイン上にある他のマージリクエストからの変更のマージ結果に対して実行されます。マージリクエストがトレインから削除された場合、マージ結果は古くなり、パイプラインは再試行できません。

以下のようなことができます:

  • マージリクエストを再度トレインに追加し、新しいパイプラインをトリガーします。
  • 断続的に失敗する場合は、retry キーワードをジョブに追加します。再試行後に成功した場合、マージリクエストはマージトレインから削除されません。

マージトレインに追加できません。

いつ パイプラインは成功しなければなりません。が有効であるにもかかわらず、最新のパイプラインが失敗しました:

  • 自動マージに設定] または [マージ] オプションは使用できません。
  • マージリクエストは次のように表示されます。The pipeline for this merge request failed. Please retry the job or push a new commit to fix the failure.

マージリクエストをマージトレインに再追加する前に、次のことを試してください:

  • 失敗したジョブを再試行します。再試行が成功し、他のジョブが失敗しなかった場合、パイプラインは成功とマークされます。
  • パイプライン全体を再実行します。パイプライン]タブで[パイプラインの実行]を選択します。
  • イシューを修正する新しいコミットをプッシュします。

詳細は関連イシューを参照してください。