オートマージ

パイプラインが成功したときのマージと パイプラインが成功したときのマージトレインへの追加は、GitLab 16.0ではauto_merge_labels_mr_widgetというフラグを持つ Auto-mergeという 名前に変更されました。デフォルトで有効になっています。

マージリクエストをレビューしてマージする準備ができたけれどもパイプラインがまだ完了していない場合、自動マージに設定することができます。後で手動でマージすることを思い出す必要はありません:

Auto-merge is ready

note
GitLab 16.0以降ではMerge when pipeline succeedsと Add to merge train when pipeline succeedsは Set to auto-mergeという名前に変更されました。

パイプラインが成功すると、マージリクエストがマージされます。パイプラインが失敗した場合、作成者は失敗したジョブを再試行するか、失敗を修正するために新しいコミットをプッシュします:

  • 再試行したジョブが2回目で成功した場合、マージリクエストはマージされます。
  • マージリクエストに新しいコミットが追加された場合、GitLab はマージ前に新しい変更がレビューされるようにリクエストをキャンセルします。

マージリクエストの自動マージ

前提条件:

  • プロジェクトで少なくとも開発者ロールを持っている必要があります。
  • プロジェクトがそれを必要とするように設定されている場合、マージリクエストのすべてのスレッドが解決されていなければなりません
  • マージリクエストは必要な承認者をすべて受け取っていなければなりません。

コマンドラインからプッシュするには、merge_request.merge_when_pipeline_succeeds push オプションを使用します。

GitLab ユーザーインターフェースからこれを行うには、次のようにします:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. コード > マージリクエストを選択します。
  3. 編集するマージリクエストを選択します。
  4. マージリクエストレポートセクションまでスクロールします。
  5. オプションです。ソースブランチの削除コミットの破棄コミットメッセージの編集など、希望するマージオプションを選択します。
  6. 自動マージ] を選択します。

自動マージを選択した後、パイプラインが完了する前にマージリクエストに新しいコメントが追加された場合、GitLab は既存のスレッドをすべて解決するまでマージをブロックします。

自動マージのキャンセル

マージリクエストが自動マージに設定されている場合、それをキャンセルすることができます。

前提条件:

  • マージリクエストの作成者か、少なくとも開発者ロールを持つプロジェクトメンバーである必要があります。
  • マージリクエストのパイプラインはまだ進行中でなければなりません。

そのためには

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. コード > マージリクエストを選択します。
  3. 編集するマージリクエストを選択します。
  4. マージリクエストレポートセクションまでスクロールします。
  5. 自動マージをキャンセル] を選択します。

Status

マージに成功したパイプラインが必要です。

マージする前に、パイプラインが完了している必要があるようにプロジェクトを設定できます。この設定は両方に有効です:

その結果、GitLab CI/CDパイプラインを無効にしてもこの機能は無効にならず、外部のCIプロバイダからのパイプラインを一緒に使うことができます。

前提条件:

  • CI/CDがマージリクエストごとにパイプラインを実行するように設定されていることを確認してください。
  • プロジェクトで少なくともメンテナーのロールを持っている必要があります。

この設定を有効にするには

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定 > マージリクエストを選択します。
  3. マージチェック] までスクロールし、[パイプラインは成功する必要があります] を選択します。この設定は、パイプラインがない場合にマージリクエストがマージされるのを防ぎます。
  4. Save を選択します。

パイプラインをスキップした後のマージを許可します。

GitLab 13.1で導入されました。

Pipelines must succeedチェックボックスをチェックすると、スキップされたパイプラインによってマージリクエストがマージされなくなります。

前提条件

  • プロジェクトで少なくともメンテナーのロールを持っている必要があります。

この動作を変更するには

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定 > マージリクエストを選択します。
  3. マージチェック] を選択します:
    • パイプラインは成功する必要があります
    • 選択スキップされたパイプラインは成功とみなされます。
  4. Save を選択します。

トラブルシューティング

成功したパイプラインが必要なときにマージリクエストがマージされない

マージに成功したパイプラインが必要な場合、この設定はパイプラインを生成しないいくつかのユースケース (only/exceptrulesなど) と競合する可能性があります。 プロジェクトがマージリクエストごとにパイプラインを実行し、パイプラインが成功するようにしてください。

パイプラインタイプ間のテストパリティの確保

マージリクエストがブランチパイプラインとマージリクエストパイプラインの両方をトリガーする場合、マージリクエストパイプラインのみの成否がチェックされます。マージリクエストパイプラインのジョブ数がブランチパイプラインよりも少ない場合、この例のようにテストに失敗したコードがマージされてしまう可能性があります:

branch-pipeline-job:
  rules:
    - if: $CI_PIPELINE_SOURCE == "push"
  script:
    - echo "Testing happens here."

merge-request-pipeline-job:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "No testing happens here. This pipeline always succeeds, and enables merge."
    - echo true

代わりに、可能な限りブランチ (push) パイプラインかマージリクエストパイプラインを使用してください。ひとつのマージリクエストに対してふたつのパイプラインを使用しない方法については、rules ドキュメントを参照してください。

マージ結果パイプラインは、ブランチパイプラインが失敗しても、マージを許可します。

[Pipelines must succeed (パイプラインは成功しなければならない)] 設定と](#require-a-successful-pipeline-for-merge) [Merged results pipelines (マージされた結果のパイプライン)] 機能を組み合わせると、失敗したブランチパイプラインが無視されることがあります。これを追跡するためにイシュー 385841が開かれています。