合并请求的流水线

您可以配置流水线,每当您在合并请求的源分支上进行变更时,都会触发流水线运行。

被称之为合并请求的流水线,当您执行以下操作时运行:

  • 从具有一个或多个提交的源分支创建合并请求。
  • 推送新的提交到合并请求的源分支。
  • 在合并请求的 流水线选项卡中选择 运行流水线

此外,合并请求流水线:

这两种类型的流水线都可以出现在合并请求的 流水线 选项卡上。

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

先决条件

使用合并请求流水线:

  • 您的项目的 CI/CD 配置文件,必须配置为在合并请求流水线中运行作业。
  • 您必须至少在源项目中拥有开发人员角色才能运行合并请求的流水线。
  • 您的仓库必须是 GitLab 仓库,而不是外部仓库

先决条件

使用合并请求流水线:

向合并请求添加作业

您可以使用 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 变量。

用于派生项目的流水线在父项目中显示为带有 派生 标志:

Pipeline ran in fork

在父项目中运行流水线

父项目中的项目成员可以从派生项目提交的合并请求触发运行合并请求流水线。此流水线:

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

在派生项目 MR 中运行流水线,确保合并后的流水线在父项目中通过。此外,如果您不信任派生项目的 runner,则在父项目中运行流水线会使用父项目的受信任 runner。

caution 派生合并请求可能包含恶意代码,这些代码会在流水线运行时(甚至在合并之前)尝试窃取父项目中的机密。作为审核者,请在触发流水线之前仔细检查合并请求中的更改。除非您通过 API 或 /rebase 快速操作触发流水线,极狐GitLab 会显示一条您必须在流水线运行之前接受的警告。否则,不会显示警告

先决条件:

要在父项目中,为来自派生项目的合并请求运行流水线:

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

您可以通过使用项目 API 禁用 ci_allow_fork_pipelines_to_run_in_parent_project 设置,来禁用此功能。该设置默认为 enabled

阻止流水线分叉项目Prevent pipelines from fork projects

  • 自极狐Gitlab 15.3 引入。

为了在父项目中阻止用户为分叉项目运行流水线,可以使用项目 API来禁用 ci_allow_fork_pipelines_to_run_in_parent_project 设置。

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

可用的预定义变量

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

  • 分支流水线中可用的所有相同预定义变量
  • 其它预定义变量仅适用于合并请求流水线中的作业。这些变量包含来自相关合并请求的信息