合并请求流水线
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
您可以配置流水线,使其在每次您对合并请求中的源分支进行更改时运行。
这种类型的流水线称为合并请求流水线,在以下情况下运行:
- 从包含一个或多个提交的源分支创建新的合并请求时。
- 向合并请求的源分支推送新的提交时。
- 在合并请求中转到 Pipelines 选项卡并选择 Run pipeline 时。
此外,合并请求流水线:
- 可以访问更多预定义变量。
- 可以选择性地访问受保护的变量或运行器。
这些流水线在流水线列表中会显示一个 merge request 标签。
合并请求流水线仅基于源分支的内容运行,而忽略目标分支的内容。要运行一个测试源分支和目标分支合并结果的流水线,请使用合并结果流水线。
前置条件
要使用合并请求流水线:
- 您的项目
.gitlab-ci.yml文件必须配置为在合并请求流水线中运行的任务。 - 您必须拥有源项目的 Developer 角色才能运行合并请求流水线。
- 您的仓库必须是 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 变量。
派生项目的流水线在父项目中会显示 fork 徽章。
在父项目中运行流水线
父项目中的项目成员可以为从派生项目提交的合并请求触发合并请求流水线。此流水线:
- 在父(目标)项目中创建和运行,而不是在派生(源)项目中。
- 使用派生项目分支中存在的 CI/CD 配置。
- 使用父项目的 CI/CD 设置、资源和项目 CI/CD 变量。
- 使用触发流水线的父项目成员的权限。
在派生项目的合并请求中运行流水线,以确保父项目中的合并后流水线能够通过。此外,如果您不信任派生项目的运行器,在父项目中运行流水线会使用父项目的受信任运行器。
派生项目的合并请求可能包含恶意代码,这些代码会在流水线运行时(甚至在合并之前)尝试窃取父项目中的密钥。作为审查者,在触发流水线之前,请仔细检查合并请求中的更改。除非您通过 API 或 /rebase 快速操作 触发流水线,否则 GitLab 会显示一个警告,您必须接受该警告后流水线才会运行。否则,不会显示任何警告。
前置条件:
- 父项目的
.gitlab-ci.yml文件必须配置为在合并请求流水线中运行任务。 - 您必须是父项目的成员,并且拥有运行 CI/CD 流水线的权限。如果分支是受保护的,您可能需要额外的权限。
- 派生项目必须对运行流水线的用户可见。否则,Pipelines 选项卡不会在合并请求中显示。
要使用 UI 在父项目中为来自派生项目的合并请求运行流水线:
- 在合并请求中,转到 Pipelines 选项卡。
- 选择 Run pipeline。您必须阅读并接受警告,否则流水线不会运行。
防止派生项目的流水线
要防止用户在父项目中为派生项目运行新的流水线,请使用项目 API 来禁用 ci_allow_fork_pipelines_to_run_in_parent_project 设置。
在禁用该设置之前创建的流水线不受影响,并会继续运行。如果您重新运行旧流水线中的某个任务,该任务会使用与流水线最初创建时相同的上下文。
可用的预定义变量
当您使用合并请求流水线时,您可以使用:
控制对受保护变量和运行器的访问
您可以控制从合并请求流水线对受保护的 CI/CD 变量和受保护的运行器的访问。
只有当合并请求的源分支和目标分支都是受保护的时,合并请求流水线才能访问这些受保护的资源。此外,触发流水线的用户应该对合并请求的目标分支有推送/合并权限。只有当源分支和目标分支属于同一个项目时,合并请求流水线才能访问这些受保护的资源。来自仓库派生的合并请求流水线无法访问这些受保护的资源。
前置条件:
- 您必须在项目中拥有 Maintainer 角色。
要控制对受保护变量和运行器的访问:
- 转到 设置 > CI/CD。
- 展开 变量
- 在 合并请求流水线中访问受保护资源 下,选择或清除 允许合并请求流水线访问受保护变量和运行器 选项。