合并队列
在默认分支变化频繁的项目中,不同合并请求中的更改可能会相互冲突。使用合并列车将合并请求放入队列。每一个合并请求会都和其他合并请求进行对比以确保他们都能一起很好工作。
更多详情,可以查看:
- 合并列车是如何工作的,查看合并列车工作流。
- 为什么您要使用合并列车,阅读如何使用合并列车提高 DevOps 效率。
合并队列工作流
当没有合并请求等待合并,并且您选择开始合并队列时,合并队列开始。极狐GitLab 启动合并队列流水线,验证更改是否可以合并到默认分支中。第一个流水线与合并结果流水线相同,在源分支和目标分支组合在一起的变化上运行。内部合并结果提交的作者是发起合并的用户。
要在第一个流水线完成后,立即合并第二个合并请求,请选择设置为自动合并,并将其添加到队列。 第二个合并队列流水线运行在合并请求与目标分支相结合的变化上。类似地,如果您添加第三个合并请求,该流水线将在与目标分支合并的所有三个合并请求的更改上运行。流水线全部并行运行。
每个合并请求仅在以下情况下合并到目标分支:
- 合并请求的流水线成功完成。
- 在合并之前排队的所有其他合并请求。
如果合并队列流水线失败,则不会合并合并请求。极狐GitLab 从合并队列中删除该合并请求,并为在它之后排队的所有合并请求启动新的流水线。
例如:
三个合并请求(A
、B
和 C
)按顺序添加到合并队列中,将创建三个并行运行的合并结果流水线:
- 第一个流水线运行在
A
与目标分支相结合的变化上。 - 第二个流水线运行在来自
A
和B
的变化以及目标分支上。 - 第三个流水线运行在
A
、B
和C
与目标分支相结合的变化上。
如果 B
的流水线失败:
- 第一个流水线(
A
)继续运行。 -
B
从队列中移除。 -
C
的流水线被取消,一个新的流水线开始,用于从A
和C
与目标分支相结合的变化(没有B
变化)。
如果 A
成功完成,它会合并到目标分支,而 C
继续运行。添加到队列中的任何新合并请求包括目标分支中的 A
更改,以及合并队列中的 C
更改。
自动取消流水线
极狐GitLab CI/CD 检测冗余流水线,并取消它们以节省资源。
冗余合并队列流水线发生在:
- 流水线因合并队列中的合并请求之一而失败。
- 您跳过合并队列并立即合并。
- 您从合并队列中删除合并请求。
在这些情况下,极狐GitLab 必须为队列上的部分或全部合并请求创建新的合并队列流水线。旧流水线正在与合并队列中先前的组合更改进行比较,这些更改不再有效,因此这些旧流水线被取消。
启用合并列车
- 在 极狐GitLab 16.5 中
disable_merge_trains
功能标志被移除。
先决条件:
- 您必须具有维护者角色。
- 您的代码库必须是极狐GitLab 代码库,而不是外部代码库。
- 您的流水线必须配置为使用合并请求流水线。否则,您的合并请求可能会陷入未解决状态,或者您的流水线可能会被丢弃。
- 您必须启用了合并结果流水线。
要启用合并队列:
- 在左侧边栏中,选择 搜索或转到 并找到您的项目。
- 选择 设置 > 合并请求。
- 在极狐GitLab 16.4 及早期版本中,在 合并方法 部分,确认选择了 合并提交 方法。在极狐GitLab 16.5 及以后版本中,您可以使用任何合并方法。
- 在 合并选项 部分,确认 启用合并结果流水线 已启用并选择 启用合并列车。
- 选择 保存更改。
启动一个合并列车
先决条件:
- 您必须具有权限,才能合并或推送到目标分支。
要启动合并队列:
- 访问合并请求。
- 选择:
- 当没有流水线运行时,合并。
- 当有流水线运行时,设置为自动合并。
合并请求的合并队列状态显示在流水线部件下方,并显示类似于 A new merge train has started and this merge request is the first of the queue.
的消息。
现在可以将其他合并请求添加到队列中。
查看合并列车
- 合并列车可视化自极狐GitLab 17.3 引入。
您可以查看合并列车以对队列中合并请求的顺序和状态有更好的洞察。合并列车详情页面显示了队列中活跃的合并请求和已合并的合并请求,这些合并请求是合并列车的一部分。
要从合并请求列表访问合并请求详情:
- 在左侧导航栏,选择 搜索或前往 并找到您的项目。
- 选择 代码 > 合并请求。
- 在合并请求列表上,选择 合并列车。
- 可选。按目标分支过滤合并列车。
您还可以从下面两个地方通过选择 查看合并列车详情 来查看此视图:
- 添加到合并列车中合并请求的部件或系统注释上。
- 合并列车流水线的详情页面。
您还可以从合并列车的详情视图上移除 () 某个合并请求。
将合并请求添加到合并队列
- 合并请求的自动合并自极狐GitLab 17.2 引入,使用名为
merge_when_checks_pass_merge_train
的功能标志。默认禁用。- 合并请求的自动合并在极狐GitLab 17.2 中,在 JihuLab.com 上启用。
- 合并请求的自动合并在极狐GitLab 17.4 中默认启用。
- 合并请求的自动合并在极狐GitLab 17.7 中 GA。功能标志
merge_when_checks_pass_merge_train
被删除。
先决条件:
- 您必须具有权限,才能合并或推送到目标分支。
将合并请求添加到合并队列:
- 访问合并请求。
- 选择:
- 当没有流水线运行时,合并。
- 当有流水线运行时,设置为自动合并。
合并请求的合并队列状态显示在流水线部件下方,并带有类似 Added to the merge train. There are 2 merge requests waiting to be merged.
的消息。
每个合并队列最多可以并行运行 20 个流水线。 如果您将超过 20 个合并请求添加到合并队列,额外的合并请求将排队等待流水线完成。等待加入合并队列的排队合并请求的数量没有限制。
从合并队列中删除合并请求
当您从合并队列中删除合并请求时:
- 合并请求的所有流水线在删除的合并请求重新启动后排队。
- 冗余流水线被取消。
您可以稍后再次将合并请求添加到合并队列。
要从合并列车中移除合并请求:
- 从合并请求中,选择 取消自动合并。
- 从 合并列车详情中,选择 。
跳过合并队列并立即合并
如果您有高优先级合并请求,例如必须紧急合并的关键补丁,请选择 立即合并。
当您立即合并合并请求时:
- 重新创建当前合并队列。
- 所有流水线重新启动。
- 冗余流水线被取消。
允许合并请求跳过合并列车立即合并,并无需重启合并列车流水线
- 自极狐GitLab 16.5 引入,使用名为
merge_trains_skip_train
的功能标志。默认禁用。- 在极狐GitLab 16.10 中作为实验功能。
merge_trains_skip_train
。在 JihuLab.com 此功能可用。您可以允许合并请求在无需重新运行合并列车的情况下被合并。使用此功能可以快速合并安全的变更,比如,文档更新。
您不能够为 fast-forward 或 semi-linear 合并方法跳过合并列车。
跳过合并请求还是个实验功能。在将来的版本中可能发生变更甚至被移除。
先决条件:
- 您必须具有维护者角色。
- 您必须 启用了合并列车。
要启用在不重启流水线的情况下跳过合并列车功能:
- 在左侧边栏中,选择 搜索或转到 并找到您的项目。
- 选择 设置 > 合并请求。
- 在 合并选项 部分,确保 启用合并结果流水线 和 启用合并列车 选项已启用。
- 选择 允许跳过合并列车。
- 选择 保存更改。
要想通过跳过合并列车来合并合并请求,可使用 合并请求合并 API 端点来合并,但需要将属性 skip_merge_train
设置为 true
。
合并请求会被合并,但是既有的合并列车流水线不会被取消或重启。
故障排除
合并请求从合并队列中丢弃
如果合并请求在合并队列流水线运行时不可合并,合并队列会自动丢弃您的合并请求。例如,这可能是由以下原因引起的:
- 将合并请求更改为草稿。
- 合并冲突。
- 当启用”必须解决所有主题”时,有未解决的主题。
您可以从系统日志中找到合并请求从合并队列中丢弃的原因。
查看 概览 选项卡中的 活动 部分是否有类似以下内容的消息:
User removed this merge request from the merge train because ...
无法使用自动合并
启用合并队列时,无法使用自动合并(之前名为 流水线成功时合并)以跳过合并队列。
无法重试合并队列流水线
当合并队列流水线失败时,合并请求会从合并队列中丢弃且无法重试流水线。 合并队列流水线在合并请求中的更改和队列上已有的其他合并请求的更改的合并结果上运行。如果合并请求从队列中丢弃,则合并结果将过期,并且流水线无法重试。 您可以:
- 再次将合并请求添加到列车,触发新的流水线。
- 如果间歇性失败,请将
retry
关键字添加到作业中。 如果重试后成功,则合并请求不会从合并队列中丢弃。
无法添加合并队列
当启用流水线必须成功,但最新流水线失败时:
- 设置为自动合并 或 合并 选项不可用。
- 合并请求显示
The pipeline for this merge request failed. Please retry the job or push a new commit to fix the failure.
。
在将合并请求重新添加到合并队列之前,您可以尝试:
- 重试失败的作业。如果通过,并且没有其他作业失败,则流水线将标记为成功。
- 重新运行整个流水线。在 流水线 选项卡上,选择 运行流水线。
- 推送修复问题的新提交,也会触发新的流水线。