debian-mirror-gitlab/doc/ci/pipelines/merge_request_pipelines.md

199 lines
8.5 KiB
Markdown
Raw Normal View History

2021-09-30 23:02:18 +05:30
---
stage: Verify
group: Pipeline Execution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
2022-03-02 08:16:31 +05:30
# Pipelines for merge requests **(FREE)**
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
You can configure your [pipeline](index.md) to run every time you commit changes to a branch.
This type of pipeline is called a *branch pipeline*.
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
Alternatively, you can configure your pipeline to run every time you make changes to the
source branch for a merge request. This type of pipeline is called a *pipeline for merge requests*.
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
Branch pipelines:
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
- Run when you push a new commit to a branch.
- Are the default type of pipeline.
- Have access to [some predefined variables](../variables/predefined_variables.md).
- Have access to [protected variables](../variables/index.md#protect-a-cicd-variable).
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
Pipelines for merge requests:
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
- Run when you:
- Create a new merge request.
- Push a new commit to the source branch for a merge request.
- Select **Run pipeline** from the **Pipelines** tab in a merge request. This option
is only available when pipelines for merge requests are configured for the pipeline.
- Do not run by default. The jobs in the CI/CD configuration file [must be configured](#prerequisites)
to run in pipelines for merge request.
- Have access to [more predefined variables](#available-predefined-variables).
- Do not have access to [protected variables](../variables/index.md#protect-a-cicd-variable).
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
Both of these types of pipelines can appear on the **Pipelines** tab of a merge request.
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
## Types of pipelines for merge requests
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
The three types of pipelines for merge requests are:
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
- Pipelines for merge requests, which run on the changes in the merge request's
source branch. These pipelines display a `detached` label to indicate that the
pipeline ran only on the contents of the source branch, ignoring the target branch.
- [Pipelines for merged results](pipelines_for_merged_results.md), which run on
the result of combining the source branch's changes with the target branch.
- [Merge trains](merge_trains.md), which run when merging multiple merge requests
at the same time. The changes from each merge request are combined into the
target branch with the changes in the earlier enqueued merge requests, to ensure
they all work together.
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
## Prerequisites
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
To use pipelines for merge requests:
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
- Your project's [CI/CD configuration file](../yaml/index.md) must be configured with
jobs that run in pipelines for merge requests. To do this, you can use:
- [`rules`](#use-rules-to-add-jobs).
- [`only/except`](#use-only-to-add-jobs).
- You must have at least the Developer [role](../../user/permissions.md) in the
source project to run a pipeline for merge requests.
- Your repository must be a GitLab repository, not an [external repository](../ci_cd_for_external_repos/index.md).
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
## Use `rules` to add jobs
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
You can use the [`rules`](../yaml/index.md#rules) keyword to configure jobs to run in
pipelines for merge requests. For example:
2021-09-30 23:02:18 +05:30
```yaml
2022-03-02 08:16:31 +05:30
job1:
script:
- echo "This job runs in pipelines for merge requests"
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
2021-09-30 23:02:18 +05:30
```
2022-03-02 08:16:31 +05:30
You can also use the [`workflow: rules`](../yaml/index.md#workflowrules) keyword
to configure the entire pipeline to run in pipelines for merge requests. For example:
2021-09-30 23:02:18 +05:30
```yaml
2022-03-02 08:16:31 +05:30
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
job1:
2021-09-30 23:02:18 +05:30
script:
2022-03-02 08:16:31 +05:30
- echo "This job runs in pipelines for merge requests"
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
job2:
2021-09-30 23:02:18 +05:30
script:
2022-03-02 08:16:31 +05:30
- echo "This job also runs in pipelines for merge requests"
2021-09-30 23:02:18 +05:30
```
2022-03-02 08:16:31 +05:30
## Use `only` to add jobs
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
You can use the [`only`](../yaml/index.md#onlyrefs--exceptrefs) keyword with `merge_requests`
to configure jobs to run in pipelines for merge requests.
2021-09-30 23:02:18 +05:30
```yaml
2022-03-02 08:16:31 +05:30
job1:
script:
- echo "This job runs in pipelines for merge requests"
only:
- merge_requests
2021-09-30 23:02:18 +05:30
```
2022-03-02 08:16:31 +05:30
## Use with forked projects
2021-09-30 23:02:18 +05:30
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217451) in GitLab 13.3.
> - [Moved](https://about.gitlab.com/blog/2021/01/26/new-gitlab-product-subscription-model/) to GitLab Premium in 13.9.
2022-03-02 08:16:31 +05:30
External contributors who work in forks can't create pipelines in the parent project.
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
A merge request from a fork that is submitted to the parent project triggers a
pipeline that:
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
- Is created and runs in the fork (source) project, not the parent (target) project.
- Uses the fork project's CI/CD configuration, resources, and project CI/CD variables.
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
Pipelines for forks display with the **fork** badge in the parent project:
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
![Pipeline ran in fork](img/pipeline_fork_v13_7.png)
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
### Run pipelines in the parent project **(PREMIUM)**
Project members in the parent project can choose to run a pipeline for merge requests
for a merge request submitted from a fork project. This pipeline:
- Is created and runs in the parent (target) project, not the fork (source) project.
- Uses the CI/CD configuration present in the fork project's branch
- Uses the parent project's CI/CD configuration, resources, and project CI/CD variables.
- Uses the permissions of the parent project member that triggers the pipeline.
Run pipelines in fork project MRs to ensure that the post-merge pipeline passes in
the parent project. Additionally, if you do not trust the fork project's runner,
running the pipeline in the parent project uses the parent project's trusted runners.
2021-09-30 23:02:18 +05:30
WARNING:
Fork merge requests can contain malicious code that tries to steal secrets in the
2022-03-02 08:16:31 +05:30
parent project when the pipeline runs, even before merge. As a reviewer, carefully
2021-09-30 23:02:18 +05:30
check the changes in the merge request before triggering the pipeline. GitLab shows
a warning that you must accept before you can trigger the pipeline.
2022-03-02 08:16:31 +05:30
Parent project members with at least the [Developer role](../../user/permissions.md)
can create pipelines in the parent project for merge requests from a forked project:
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
1. In the merge request, go to the **Pipelines** tab.
1. Select **Run pipeline**. You must accept the warning, or the pipeline does not run.
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
## Available predefined variables
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
When you use pipelines for merge requests, you can use:
- All the same [predefined variables](../variables/predefined_variables.md) that are
available in branch pipelines.
- [Additional predefined variables](../variables/predefined_variables.md#predefined-variables-for-merge-request-pipelines)
available only to jobs in pipelines for merge requests. These variables contain
information from the associated merge request, which can be when calling the
[GitLab Merge Request API endpoint](../../api/merge_requests.md) from a job.
## Troubleshooting
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
### Two pipelines when pushing to a branch
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
If you get duplicate pipelines in merge requests, your pipeline might be configured
to run for both branches and merge requests at the same time. Adjust your pipeline
configuration to [avoid duplicate pipelines](../jobs/job_control.md#avoid-duplicate-pipelines).
2021-09-30 23:02:18 +05:30
2021-11-18 22:05:49 +05:30
In [GitLab 13.7 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/201845),
2022-03-02 08:16:31 +05:30
you can add `workflow:rules` to [switch from branch pipelines to pipelines for merge requests](../yaml/workflow.md#switch-between-branch-pipelines-and-merge-request-pipelines).
2021-09-30 23:02:18 +05:30
After a merge request is open on the branch, the pipeline switches to a merge request pipeline.
2022-03-02 08:16:31 +05:30
### Two pipelines when pushing an invalid CI/CD configuration file
If you push an invalid CI/CD configuration to a merge request's branch, two failed
pipelines appear in the pipelines tab. One pipeline is a failed branch pipeline,
the other is a failed pipeline for merge requests.
When the configuration syntax is fixed, no further failed pipelines should appear.
To find and fix the configuration problem, you can use:
- The [pipeline editor](../pipeline_editor/index.md).
- The [CI lint tool](../lint.md).
### The merge request's pipeline is marked as failed but the latest pipeline succeeded
It's possible to have both branch pipelines and pipelines for merge requests in the
**Pipelines** tab of a single merge request. This might be [by configuration](../yaml/workflow.md#switch-between-branch-pipelines-and-merge-request-pipelines),
or [by accident](#two-pipelines-when-pushing-to-a-branch).
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
If both types of pipelines are in one merge request, the merge request's pipeline
is not considered successful if:
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
- The branch pipeline succeeds.
- The pipeline for merge request fails.
2021-09-30 23:02:18 +05:30
2022-03-02 08:16:31 +05:30
When using the [merge when pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md)
feature and both pipelines types are present, the pipelines for merge requests are checked,
not the branch pipelines.