マージ結果のパイプライン
GitLab Premium11.10で導入されました。
マージリクエストを送信すると、ソースブランチからの変更をターゲットブランチにマージすることを要求することになります。 デフォルトでは、CIパイプラインはソースブランチに対してジョブを実行します。
マージ結果のパイプラインでは、ソースブランチの変更がターゲットブランチにマージされているかのようにパイプラインが実行されます。
ターゲットブランチの問題が原因でパイプラインが失敗した場合、ターゲットが修正されるまで待ち、パイプラインを再実行できます。 この新しいパイプラインは、ソースが更新されたターゲットにマージされたかのように実行され、リベースする必要はありません。
パイプラインは、ターゲットブランチが変更されたときには自動的に実行されません。 ソースブランチの変更だけが、新しいパイプラインのトリガーとなります。 最後に成功したパイプラインから長い時間が経過している場合は、ソースの変更がターゲットに正常にマージできることを確認するために、マージする前にパイプラインを再実行するとよいでしょう。
マージリクエストがマージできない場合、パイプラインはソースブランチに対してのみ実行されます。 たとえば、次のような場合です:
- ターゲットブランチには、ソースブランチの変更と衝突する変更があります。
- マージリクエストは進行中です。
このような場合、パイプラインはマージリクエスト用のパイプラインとして実行され、detached
と表示されます。このようなケースがなくなった場合、マージされた結果に対して新しいパイプラインが再び実行されます。
開発者権限を持つユーザーであれば、マージ結果のパイプラインを実行できます。
前提条件
マージ結果のパイプラインを有効にします:
- メンテナー権限が必要です。
- GitLab Runner11.9以降を使用している必要があります。
- フォークやクロスレポワークフローを使用してはいけません。 進行状況を確認するには、#11934を参照してください。
- 早送りマージはまだ使用していないはずです。 進捗を追うには、#58226を参照してください。
マージ結果のパイプラインの有効化
プロジェクトのマージ結果のパイプラインを有効にします:
- マージリクエストに対してパイプラインまたは個々のジョブが実行されるように、CI/CD設定ファイルを構成します。
- プロジェクトの[設定] > [一般]にアクセスし、[マージリクエスト]を展開します。
- Enable merge trains and pipelines for merged results(マージトレインとパイプラインを有効にする)をチェックします。
- 変更を保存する]をクリックします。
マージトレインの使用
マージ結果のパイプラインを有効にすると、GitLabは自動的にStart/Add Merge Trainボタンを表示します。
一般的に、これはマージリクエストをすぐにマージするよりも安全なオプションです。なぜなら、マージリクエストは実際にマージが行われる前に、マージ後の予想される結果で評価されるからです。
詳細については、マージトレインのドキュメントをお読みください。
自動パイプライン・キャンセル
GitLab Premium12.3で導入されました。
GitLab CI/CDは冗長なパイプラインの存在を検知し、CIリソースを節約するために自動的にキャンセルします。
進行中のマージトレイン内でユーザがマージリクエストをすぐにマージした場合、マージトレインは再構築され、マージ後のコミットやパイプラインが再作成されます。 この場合、マージトレインには、以前のマージ後のコミットに対するパイプラインがすでに実行されている可能性があります。 これらのパイプラインは冗長とみなされ、自動的にキャンセルされます。
トラブルシューティング
マージリクエストに新しい変更がプッシュされても、マージ結果のパイプラインが作成されません。
GitLabインスタンスで以下の機能フラグが有効になっていることを確認してください:
:merge_ref_auto_sync
これらの機能フラグの値を確認および設定するには、管理者に依頼してください:
-
GitLabインスタンスのRailsコンソールにログインします:
sudo gitlab-rails console
-
フラグが有効かどうかをチェックします:
Feature.enabled?(:merge_ref_auto_sync)
-
必要に応じて、機能フラグを有効にします:
Feature.enable(:merge_ref_auto_sync)
fatal: reference is not a tree:
、断続的にパイプラインが失敗します。
マージ結果のパイプラインはマージリクエストのマージリファレンス (refs/merge-requests/<iid>/merge
) に対して実行されるため、予期しないタイミングで Git リファレンスが上書きされる可能性があります。 たとえば、ソースブランチやターゲットブランチが前進したときなどです。この場合、パイプラインはfatal: reference is not a tree:
エラーのために失敗します。これは checkout-SHA がマージリファレンスに見つからないことを示します。
この挙動は GitLab 12.4 でPersistent pipeline refsを導入することで改善されました。 これにより、エラーを気にすることなく任意のタイミングでパイプラインを作成できるようになりました。