マージトレイン

マージ結果のパイプラインを有効にすると、パイプラインジョブは、ソースブランチの変更がターゲットブランチにマージされているかのように実行されます。

しかし、ターゲットブランチは急速に変化している可能性があります。 マージの準備ができたとき、しばらくパイプラインを実行していなければ、ターゲットブランチはすでに変化しているかもしれません。 今マージすると、変更を壊してしまう可能性があります。

マージトレインとは、ターゲットブランチにマージされるのを待っているマージリクエストのキューリストのことです。

多くのマージリクエストをトレインに追加することができます。 各マージリクエストは、トレイン上でその前にある他のすべてのマージリクエストからの変更を含む、独自のマージ結果パイプラインを実行します。 すべてのパイプラインは、時間を節約するために並行して実行されます。

マージリクエストのパイプラインが失敗した場合、変更点はマージされず、ターゲットブランチは影響を受けません。 マージリクエストはトレインから削除され、その後ろにあるすべてのパイプラインが再開します。

列車の先頭にあるマージリクエストのパイプラインが正常に完了すると、変更がターゲットブランチにマージされ、他のパイプラインは引き続き実行されます。

マージリクエストをマージトレインに追加するには、ターゲットブランチにプッシュする権限が必要です。

注意:各マージトレインは最大20のパイプラインを並行して実行できます。 20を超えるマージリクエストがマージトレインに追加された場合、マージトレインのスロットが空くまでマージリクエストはキューに入れられます。 キューに入れられるマージリクエストの数に制限はありません。

マージトレインの例

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

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

B のパイプラインが失敗した場合、そのパイプラインは列車から削除されます。C のパイプラインは、AC の変更で再スタートしますが、B の変更は行いません。

A が正常に完了すると、ターゲットブランチにマージされ、C が実行され続けます。さらにマージリクエストが列車に追加されると、ターゲットブランチに含まれているAの変更と、すでに列車に含まれているマージリクエストのC の変更が含まれるようになります。

続きを読む マージ・トレインがマスター・グリーンを維持する方法

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

前提条件

マージトレインを有効にします:

  • メンテナー権限が必要です。
  • GitLab Runner11.9以降を使用している必要があります。
  • GitLab 12.0以降では、Redis3.2以降が必要です。

マージトレインの有効化

プロジェクトのマージトレインを有効にするには、以下の手順に従います:

  1. セルフマネジメントのGitLabインスタンスを使っている場合は、featureフラグが正しく設定されていることを確認してください。
  2. マージリクエストに対してパイプラインまたは個々のジョブが実行されるように、CI/CD設定ファイルを構成します。
  3. プロジェクトの[設定] > [一般]にアクセスし、[マージリクエス]を展開します。
  4. Enable merge trains and pipelines for merged results(マージトレインとパイプラインを有効にする)をチェックします。
  5. 変更を保存する]をクリックします。
注意:マージリクエストにパイプラインを使用するように CI/CD を設定せずにチェックボックスを選択した場合、マージリクエストが未解決の状態で立ち往生したり、パイプラインが削除されたりする可能性があります。

マージトレインの開始

マージトレインをスタートさせるため:

  1. マージリクエストにアクセスしてください。
  2. Start merge trainボタンをクリックします。

Start merge train

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

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

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

  1. マージリクエストにアクセスしてください。
  2. Add to merge train(マージ列車に追加)ボタンをクリックします。

パイプラインがすでにマージリクエストに対して実行されている場合、マージリクエストをトレインに追加することはできません。 代わりに、最新のパイプラインが成功したときにマージリクエストをマージトレインに追加するようにスケジュールすることができます。

Add to merge train when pipeline succeeds

マージ列車からのマージリクエストの削除

  1. マージリクエストにアクセスしてください。
  2. マージ列車から削除ボタンをクリックします。

Cancel merge train

後でマージリクエストを再びマージトレインに追加したい場合、可能です。

マージトレイン上のマージリクエストの現在位置を表示します。

マージリクエストがマージトレインに追加されると、マージリクエストの現在の位置がパイプラインウィジェットの下に表示されます:

Merge train position indicator

マージリクエストとマージトレインを即座にマージします。

緊急にマージしなければならない優先度の高いマージリクエスト (たとえばクリティカルなパッチ) がある場合、すぐにマージオプションを使用することでマージトレインをバイパスすることができます。 これは、変更をターゲットブランチにマージするための最速のオプションです。

Merge Immediately

注意:マージリクエストをすぐにマージするたびに、現在のマージトレインが再作成され、すべてのパイプラインが再スタートします。

トラブルシューティング

マージリクエストがマージトレインから即座に脱落

マージリクエストがマージ不可能な場合(例えば、WIPである、マージ競合があるなど)、あなたのマージリクエストは自動的にマージトレインから除外されます。

このような場合、マージリクエストを取り下げた理由はシステムノートに記載されています。

理由を確認するには

  1. マージトレインから削除されたマージリクエストを開いてください。
  2. ディスカッションタブを開きます。
  3. どちらかを含むシステムノートを探してください:
    • テキスト … マージトレインからこのマージリクエストを削除しました。
    • because… 理由はbecause ... フレーズの後に書かれています。

Merge Train Failure

パイプライン成功時のマージは選択できません。

マージトレインが有効な場合、パイプラインが成功したときにマージは現在使用できません。

詳しくは関連イシューをご覧ください。

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

マージトレインパイプラインは、失敗するとマージリクエストがマージトレインから削除されるため、再試行できません。 このため、再試行ボタンはパイプラインアイコンの隣に表示されません。

パイプラインが失敗した場合、マージリクエストをマージトレインに再度キューイングする必要があります。

“このマージリクエストのパイプラインは失敗しました” というメッセージが表示され、マージトレインに追加できません。

Start/Add to Merge Trainボタンが使用できず、マージリクエストに “The pipeline for this merge request failed. Please retry the job or push a new commit to fix the failure.” と表示されることがあります。

このイシューは以下の場合に発生します。 パイプラインは成功させる必要があります。このオプションでは、マージリクエストをマージトレインに再追加する前に、新しい成功したパイプラインを実行する必要があります。

マージトレインは、マージが発生する前に各パイプラインが成功していることを確認するため、[パイプラインは成功する必要がある] チェックボックスをオフにして、[マージトレインを有効にする] および [マージ結果のパイプライン(マージトレイン)] を有効にしておくことができます。

パイプラインが成功する必要がある]オプションを[列車をマージ]と一緒に有効にしたままにする場合は、[パイプライン]タブに移動し、[パイプラインを実行]をクリックすることで、このエラーが発生したときにマージされた結果のための新しいパイプラインを作成することができます。 次に、[パイプラインが成功したときに列車をマージするために開始/追加]をクリックします。

詳しくは関連イシューをご覧ください。

マージトレイン機能フラグ

マージトレイン機能を有効または無効にするには、:disable_merge_trains 機能フラグを使用します。

GitLab インスタンスで機能フラグが有効になっているかどうかを確認するには、管理者に以下のコマンドを実行してもらいましょう:

> sudo gitlab-rails console                         # Login to Rails console of GitLab instance.
> Feature.enabled?(:disable_merge_trains)           # Check if it's disabled or not.
> Feature.enable(:disable_merge_trains)             # Disable Merge Trains.
> Feature.disable(:disable_merge_trains)            # Enable Merge Trains.

この機能を無効にすると、既存のマージトレインはすべてキャンセルされ、マージリクエストに[Start/Add to Merge Train]ボタンは表示されなくなります。