{{< details >}}

  • Tier: 基础版,专业版,旗舰版
  • Offering: JihuLab.com,私有化部署

{{< /details >}}

您可以配置您的流水线,使其在每次对合并请求中的源分支进行更改时运行。

这种类型的流水线,称为合并请求流水线,当您执行以下操作时运行:

  • 从具有一个或多个提交的源分支创建新的合并请求。
  • 将新的提交推送到合并请求的源分支。
  • 转到合并请求中的 流水线 标签页,然后选择 运行流水线

此外,合并请求流水线:

这些流水线在流水线列表中显示一个 merge request 标签。

合并请求流水线仅在源分支的内容上运行,忽略目标分支的内容。要运行测试源分支和目标分支合并结果的流水线,请使用合并结果流水线。

先决条件

要使用合并请求流水线:

添加作业到合并请求流水线

使用 rules 关键字配置作业在合并请求流水线中运行。例如:

job1:
  script:
    - echo "This job runs in merge request pipelines"
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'

您也可以使用 workflow: rules 关键字配置整个流水线在合并请求流水线中运行。例如:

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'

job1:
  script:
    - echo "This job runs in merge request pipelines"

job2:
  script:
    - echo "This job also runs in merge request pipelines"

一个常见的 workflow 配置是让流水线在合并请求、标签和默认分支上运行。例如:

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    - if: $CI_COMMIT_TAG
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

在分叉项目中使用

在分叉项目中工作的外部贡献者无法在父项目中创建流水线。

从分叉提交到父项目的合并请求会触发一个流水线,该流水线:

  • 在分叉(源)项目中创建并运行,而不是在父(目标)项目中。
  • 使用分叉项目的 CI/CD 配置、资源和项目 CI/CD 变量。

分叉的流水线在父项目中显示 fork 徽章。

在父项目中运行流水线

父项目中的项目成员可以为从分叉项目提交的合并请求触发合并请求流水线。此流水线:

  • 在父(目标)项目中创建并运行,而不是在分叉(源)项目中。
  • 使用分叉项目分支中存在的 CI/CD 配置。
  • 使用父项目的 CI/CD 设置、资源和项目 CI/CD 变量。
  • 使用触发流水线的父项目成员的权限。

在分叉项目的合并请求中运行流水线,以确保合并后流水线在父项目中通过。此外,如果您不信任分叉项目的 runner,在父项目中运行流水线会使用父项目的可信 runner。

{{< alert type=”warning” >}}

分叉合并请求可能包含恶意代码,该代码尝试在流水线运行时窃取父项目中的密钥,即使在合并之前也是如此。作为审阅者,仔细检查合并请求中的更改,然后触发流水线。除非您通过 API 或 /rebase 快速操作触发流水线,否则极狐GitLab 会显示一个警告,您必须在流水线运行之前接受。否则,不会显示警告

{{< /alert >}}

先决条件:

要使用 UI 在父项目中为从分叉项目提交的合并请求运行流水线:

  1. 在合并请求中,转到 流水线 标签页。
  2. 选择 运行流水线。您必须阅读并接受警告,否则流水线不会运行。

阻止分叉项目的流水线

{{< history >}}

  • 引入于极狐GitLab 15.3。

{{< /history >}}

要阻止用户在父项目中为分叉项目运行新的流水线,请使用项目 API禁用 ci_allow_fork_pipelines_to_run_in_parent_project 设置。

{{< alert type=”warning” >}}

在禁用设置之前创建的流水线不受影响,并继续运行。如果您在旧流水线中重新运行作业,则作业使用与最初创建流水线时相同的上下文。

{{< /alert >}}

可用的预定义变量

当您使用合并请求流水线时,您可以使用: