マージリクエストパイプライン
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
マージリクエストのソースブランチに変更を加えるたびに実行されるよう、パイプラインを設定できます。このタイプのパイプラインは、マージリクエストパイプラインと呼ばれます。
これらのパイプラインは、次の場合に実行されます:
- 1つ以上のコミットを含むソースブランチから新しいマージリクエストを作成する。
- マージリクエストのソースブランチに新しいコミットをプッシュする。
- マージリクエストのパイプラインタブに移動し、パイプラインを実行するを選択する。
マージリクエストパイプライン:
- ソースブランチの内容のみで実行され、ターゲットブランチの内容は無視されます。
merge requestラベルがパイプラインリストに表示されます。
ソースブランチとターゲットブランチをマージした結果をテストするパイプラインを実行するには、マージ結果パイプラインを使用します。
前提条件
マージリクエストパイプラインを使用するには:
- あなたのプロジェクトの
.gitlab-ci.ymlファイルには、CI_PIPELINE_SOURCE == "merge_request_event"に一致するジョブルールまたはワークフロールールを含める必要があります。 - マージリクエストパイプラインを実行するには、ソースプロジェクトのデベロッパー、メンテナー、またはオーナーのロールが必要です。
- リポジトリは、外部リポジトリではなく、GitLabリポジトリである必要があります。
マージリクエストパイプラインの設定
マージリクエストパイプラインを設定するには、.gitlab-ci.ymlファイルで、CI_PIPELINE_SOURCEがmerge_request_eventに等しい場合に実行されるようにジョブを設定する必要があります。
include:で定義されたルール(たとえば、include:componentを使用した場合)は、この要件を満たしません。一致するrules:またはworkflow: rulesを.gitlab-ci.ymlに直接定義する必要があります。
個々のジョブはrulesで設定できます。または、workflow: rulesを使用してパイプライン全体を制御することもできます。
個々のジョブを設定
rulesキーワードを使用して、個々のジョブがマージリクエストパイプラインで実行されるように設定します。例:
job1:
script:
- echo "This job runs in merge request pipelines"
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"ファイルの変更に基づいてジョブが実行されるタイミングを制御することもできます:
test:
script:
- echo "This job always runs in merge request pipelines"
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
lint:
script:
- echo "This job runs only when JavaScript files change"
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
changes:
- "*.js"パイプライン全体を設定
workflow: rulesキーワードを使用して、パイプライン内のすべてのジョブがマージリクエストパイプラインで実行されるように設定します。例:
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
job1:
script:
- echo "This job runs in merge request pipelines"その他のworkflowの例については、以下を参照してください:
マージリクエストパイプラインでセキュリティスキャンツールを使用するには、CI/CD変数AST_ENABLE_MR_PIPELINESまたはlatestテンプレートエディションを使用します。
カスタム入力を使用してマージリクエストパイプラインを実行
.gitlab-ci.ymlがパイプライン入力を定義している場合、新しいマージリクエストパイプラインを手動で実行する際に入力値をカスタマイズできます。同じフォームでCI/CD変数を設定することもできます。
前提条件:
- あなたの
.gitlab-ci.ymlファイルは、マージリクエストパイプライン用に設定されている必要があります。 - あなたの
.gitlab-ci.ymlファイルはspec: inputsセクションも定義している必要があります。 - ソースプロジェクトで少なくともデベロッパーロールが必要です。
カスタム入力を使用してマージリクエストパイプラインを実行するには:
- 左サイドバーで、検索または移動先を選択し、プロジェクトを見つけます。
- コード > マージリクエストを選択して、マージリクエストを開きます。
- パイプラインタブを選択します。
- パイプラインの実行ドロップダウンリスト( )を選択し、修正した値でパイプラインを実行を選択します。
- 新しいパイプラインフォームが開き、マージリクエストのソースブランチで事前に入力されています。必要に応じて入力値を変更し、CI/CD変数を設定します。
- パイプラインを実行するを選択します。
フォークしたプロジェクトで使用する
フォークで作業する外部のコントリビューターは、親プロジェクト内にパイプラインを作成できません。
フォークから親プロジェクトに送信されたマージリクエストは、次のパイプラインをトリガーします。
- 親(ターゲット)プロジェクトではなく、フォーク(ソース)プロジェクトで作成および実行される。
- フォークプロジェクトのCI/CD設定、リソース、およびプロジェクトCI/CD変数を使用する。
フォークのパイプラインは、親プロジェクト内でフォークバッジとともに表示されます。
親プロジェクトでパイプラインを実行する
親プロジェクトのプロジェクトメンバーは、フォークプロジェクトから送信されたマージリクエストに対して、マージリクエストパイプラインをトリガーできます。このパイプラインの特徴は、次のとおりです。
- フォーク(ソース)プロジェクトではなく、親(ターゲット)プロジェクトで作成および実行される。
- フォークプロジェクトのブランチに存在するCI/CD設定を使用する。
- 親プロジェクトのCI/CD設定、リソース、およびプロジェクトCI/CD変数を使用する。
- パイプラインをトリガーする親プロジェクトメンバーの権限を使用する。
フォークプロジェクトのMRでパイプラインを実行し、マージ後のパイプラインが親プロジェクトで正常に完了することを確認します。さらに、フォークプロジェクトのRunnerを信頼できない場合、親プロジェクトでパイプラインを実行すれば、親プロジェクトの信頼できるRunnerが使用されます。
フォークマージリクエストには、パイプラインが実行される際に、マージ前であっても、親プロジェクトのシークレットを盗もうとする悪意のあるコードが含まれている可能性があります。レビュアーは、パイプラインをトリガーする前に、マージリクエストの変更を慎重に確認してください。APIまたは/rebaseクイックアクションでパイプラインをトリガーした場合を除き、GitLabは警告を表示し、ユーザーはパイプラインを実行する前に承認する必要があります。それ以外の場合、警告は表示されません。
前提条件:
- 親プロジェクトの
.gitlab-ci.ymlファイルは、マージリクエストパイプラインでジョブを実行するように設定されている必要があります。 - CI/CDパイプラインを実行する権限を持つ、親プロジェクトのメンバーである必要があります。ブランチが保護されている場合、追加の権限が必要になることがあります。
- パイプラインを実行するユーザーがフォークプロジェクトを参照できる必要があります。そうでない場合、マージリクエストにパイプラインタブは表示されません。
UIを使用して、フォークプロジェクトからのマージリクエストに対して親プロジェクトでパイプラインを実行するには、次のようにします。
- マージリクエストで、パイプラインタブに移動します。
- パイプラインを実行するを選択します。警告を読んで承認する必要があります。そうしないと、パイプラインは実行されません。
フォークプロジェクトからのパイプラインを防止する
ユーザーが親プロジェクトでフォークプロジェクトの新しいパイプラインを実行できないようにするには、プロジェクトAPIを使用して、ci_allow_fork_pipelines_to_run_in_parent_project設定を無効にします。
設定が無効になる前に作成されたパイプラインは影響を受けず、引き続き実行されます。古いパイプラインでジョブを再実行すると、ジョブはパイプラインの初回作成時と同じコンテキストを使用します。
利用可能な定義済み変数
マージリクエストパイプラインを使用する場合は、以下を使用できます。
保護された変数とRunnerへのアクセスを制御する
マージリクエストパイプラインから、保護されたCI/CD変数と保護されたRunnerへのアクセスを制御できます。
マージリクエストパイプラインは、次の場合にのみこれらの保護されたリソースにアクセスできます:
- ソースブランチとターゲットブランチの両方が保護されている。
- パイプラインをトリガーするユーザーが、ターゲットブランチへのプッシュ/マージアクセス権を持っている。
- ソースブランチとターゲットブランチの両方が同じプロジェクトに属している。
フォークしたリポジトリからのマージリクエストパイプラインは、これらの保護されたリソースにアクセスできません。
前提条件:
- プロジェクト内でメンテナーまたはオーナーのロールを持っている。
保護された変数とRunnerへのアクセスを制御するには、次のようにします。
- 上部のバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 設定 > CI/CDを選択します。
- 変数を展開します。
- マージリクエストパイプライン内で保護されたリソースへのアクセスの下で、マージリクエストパイプラインが保護された変数やRunnerにアクセスすることを許可するチェックボックスを選択またはクリアします。