合并队列

合并结果流水线启用时,流水线作业运行就像来自源分支的更改已经合并到目标分支一样。

然而,目标分支可能正在迅速变化。当您准备好合并时,如果您有一段时间没有运行流水线,则目标分支可能已经更改。 现在合并可能会带来重大变化。

合并队列可以防止这种情况发生。合并队列是合并请求的排队列表,每个请求都在等待合并到目标分支中。

许多合并请求可以添加到队列中。每个合并请求都运行自己的合并结果流水线,其中包括队列上前面的所有其他合并请求的更改。 所有流水线并行运行,节省时间。内部合并结果提交的作者始终是发起合并的用户。

如果合并请求的流水线失败,则不会合并破坏性更改,并且目标分支不受影响。合并请求从队列中移除,并且它后面的所有流水线重新启动。

如果队列前端合并请求的流水线成功完成,则将更改合并到目标分支中,其它流水线继续运行。

要将合并请求添加到合并队列,您需要推送到目标分支的权限。

每个合并队列最多可以并行运行 20 个流水线。 如果将超过 20 个合并请求添加到合并队列,合并请求将排队,直到合并队列中的一个槽空闲。可以排队的合并请求的数量没有限制。

合并队列示例

三个合并请求(ABC)按顺序添加到一个合并队列中,这会创建三个并行运行的合并结果流水线:

  1. 第一个流水线运行在A 与目标分支相结合的变化上。
  2. 第二个流水线运行在 AB 的变化以及目标分支上。
  3. 第三个流水线运行在ABC 与目标分支相结合的变化上。

如果 B 的流水线出现故障,则将其从队列中移除。C 的流水线随着 AC 的变化而重新启动,但没有 B 的变化。

如果 A 然后成功完成,它会合并到目标分支,并且 C 继续运行。如果将更多合并请求添加到队列中,它们现在包括目标分支中包含的 A 更改,以及来自队列中已存在的合并请求的 C 更改。

先决条件

要启用合并队列:

  • 您必须具有维护者角色。
  • 您必须使用 GitLab Runner 11.9 或更高版本。
  • 您的仓库必须是极狐GitLab 仓库,而不是外部仓库。

合并队列不适用于半线性历史合并请求快进式合并请求

启用合并队列

要为您的项目启用合并队列:

  1. 如果您使用的是自助管理实例,请确保正确设置功能标志
  2. 配置您的 CI/CD 配置文件,使流水线或单个作业针对合并请求运行。
  3. 在顶部栏上,选择 主菜单 > 项目 并找到您的项目。
  4. 在左侧边栏上,选择 设置 > 通用
  5. 展开 合并请求
  6. 合并方法 部分,确认 合并提交 被选中。
  7. 合并选项 部分,选择 启用合并结果流水线(如果尚未选择)和 启用合并队列
  8. 选择 保存修改

在 13.5 及更早版本中,只有一个复选框,名为 为合并结果启用合并队列和流水线

caution如果选中该复选框但未将 CI/CD 配置为将流水线用于合并请求,则合并请求可能会卡在未解决状态或流水线可能会被丢弃。

启动合并队列

要启动合并队列:

  1. 访问合并请求。
  2. 选择 启动合并队列

Start merge train

现在可以将其他合并请求添加到队列中。

向合并队列添加合并请求

向合并队列添加合并请求:

  1. 访问合并请求。
  2. 选择 添加到合并队列

如果合并请求的流水线已经在运行,则不能将合并请求添加到队列中。相反,当最新的流水线成功时,您可以安排将合并请求添加到合并队列。

Add to merge train when pipeline succeeds

从合并队列中删除合并请求

  1. 访问合并请求。
  2. 选择 从合并队列中移除

Cancel merge train

您可以稍后再次将合并请求添加到合并列车。

查看合并请求在合并队列中的当前位置

将合并请求添加到合并队列后,合并请求的当前位置将显示在流水线部件下方:

Merge train position indicator

立即将合并请求与合并队列合并

如果您有一个必须紧急合并的高优先级合并请求(例如,一个关键补丁),您可以使用 立即合并 选项绕过合并队列。 这是将更改合并到目标分支的最快选项。

Merge Immediately

caution每次立即合并合并请求时,都会重新创建当前合并队列,并重新启动所有流水线。

故障排查

立即从合并队列中删除合并请求

如果合并请求不可合并(例如,它是 Draft 合并请求或存在合并冲突),合并队列会自动丢弃您的合并请求。

在这些情况下,删除合并请求的原因在 系统注释 中。

要检查原因:

  1. 打开从合并队列中丢弃的合并请求。
  2. 选择 讨论 选项卡。
  3. 找到包含以下任一内容的系统注释:
    • …从合并队列中删除了这个合并请求,因为…
    • …从合并队列中止了这个合并请求,因为…

原因在正文中的 因为… 短语之后给出。

Merge train failure

无法选择流水线成功时合并

当流水线成功时合并当前在启用合并队列时不可用。

无法重试合并队列流水线

当合并队列的流水线失败时,合并请求将从队列中删除,并且无法重试流水线。 合并队列的流水线运行在合并请求中更改的合并结果,和队列中已有的其他合并请求的更改上。如果合并请求从队列中删除,则合并结果已过期,并且无法重试流水线。

相反,您应该再次将合并请求添加到队列,这会触发新的流水线。

如果作业只是间歇性失败,您可以尝试使用 .gitlab-ci.yml 文件中的 retry 关键字在流水线完成之前重试作业。 如果在重试后成功,则不会从合并序列中删除合并请求。

无法添加到合并队列 “The pipeline for this merge request failed.”

有时 启动/添加到合并队列 按钮不可用并且合并请求提示,“The pipeline for this merge request failed. Please retry the job or push a new commit to fix the failure.”

流水线必须成功设置 > 通用 > 合并请求 中启用。此选项要求您运行新的成功流水线,然后才能将合并请求重新添加到合并队列。

合并队列确保每个流水线在合并之前都已成功,因此您可以清除 流水线必须成功 复选框并保持选中 为合并结果启用合并队列和流水线(合并队列)。

如果要保持 流水线必须成功 选项与合并队列一起选择,请在发生此错误时为合并结果创建新流水线:

  1. 流水线 选项卡上,选择 运行流水线
  2. 选择 Start/Add to merge train when pipeline success

合并队列功能标志

在 13.6 及更高版本中,您可以在项目设置中启用或禁用合并列车

在 13.5 及更早版本中,当启用合并结果的流水线 时,会自动启用合并队列。 要在不使用合并队列的情况下将流水线用于合并结果,您可以启用阻止合并队列功能的功能标志。

可以访问 GitLab Rails 控制台的管理员可以启用功能标志来禁用合并队列:

Feature.enable(:disable_merge_trains)

启用此功能标志后,所有现有合并队列将被取消,Start/Add to merge train 按钮不再出现在合并请求中。

要禁用功能标志,并再次启用合并队列:

Feature.disable(:disable_merge_trains)