合并列车
- Tier: Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
在频繁向默认分支合并的项目中,不同合并请求的更改可能会相互冲突。使用合并列车将合并请求排队。 每个合并请求都会与其他更早的合并请求进行比较,以确保它们能够协同工作。
有关更多信息:
- 合并列车的工作原理,请查看 合并列车工作流。
- 为什么您可能需要使用合并列车,请阅读 如何通过启动合并列车提高 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 必须为列车上的一些或所有合并请求创建新的合并列车流水线。旧的流水线是基于合并列车中之前的组合更改进行比较的,这些更改已不再有效,因此这些旧流水线被取消。
启用合并列车
先决条件:
- 您必须拥有 Maintainer 角色。
- 您的存储库必须是 GitLab 存储库,而不是 外部存储库。
- 您的流水线必须 配置为使用合并请求流水线。 否则您的合并请求可能会卡在未解决状态,或者您的流水线可能会被丢弃。
- 您必须已启用 合并结果流水线。
要启用合并列车:
- 在左侧边栏,选择 搜索或跳转至 并找到您的项目。
- 选择 设置 > 合并请求。
- 在 GitLab 16.4 及更早版本中,在 合并方法 部分,确保选择了 提交合并。 在 GitLab 16.5 及更高版本中,您可以使用任何合并方法。
- 在 合并选项 部分,确保 启用合并结果流水线 已启用, 并选择 启用合并列车。
- 选择 保存更改。
启动合并列车
先决条件:
- 您必须拥有 权限 才能合并或推送到目标分支。
要启动合并列车:
- 转到一个合并请求。
- 选择:
- 当没有流水线运行时,选择 合并。
- 当有流水线运行时,选择 设置为自动合并。
合并请求的合并列车状态显示在流水线小部件下方,消息类似于 新的合并列车已启动,此合并请求是队列中的第一个。查看合并列车详情。
您可以选择链接查看合并列车。
现在可以将其他合并请求添加到列车中。
查看合并列车
您可以查看合并列车,以更好地了解队列中合并请求的顺序和状态。 合并列车详情页面显示队列中的活动合并请求以及属于该列车的已合并合并请求。
要从合并请求列表访问合并列车详情:
- 在左侧边栏,选择 搜索或跳转至 并找到您的项目。
- 选择 代码 > 合并请求。
- 在合并请求列表上方,选择 合并列车。
- 可选。按目标分支筛选合并列车。
您还可以通过从以下位置选择 查看合并列车详情 来访问此视图:
- 添加到合并列车的合并请求上的流水线小部件和系统注释。
- 合并列车流水线的流水线详情页面。
您还可以从合并列车详情视图中移除( )合并请求。
将合并请求添加到合并列车
先决条件:
- 您必须拥有 权限 才能合并或推送到目标分支。
要将合并请求添加到合并列车:
- 访问一个合并请求。
- 选择:
- 当没有流水线运行时,选择 合并。
- 当有流水线运行时,选择 设置为自动合并。
合并请求的合并列车状态显示在流水线小部件下方,消息类似于 此合并请求在队列中排第 2/3 位。
每个合并列车最多可以并行运行二十个流水线。如果您向合并列车添加超过二十个合并请求,额外的合并请求将排队,等待流水线完成。等待加入合并列队的排队合并请求数量没有限制。
从合并列车中移除合并请求
当您从合并列车中移除合并请求时:
- 排在被移除合并请求之后的所有合并请求的流水线将重新启动。
- 冗余流水线 被取消。
您可以稍后将该合并请求再次添加到合并列车中。
要从合并列车中移除合并请求:
- 从合并请求中,选择 取消自动合并。
- 从 合并列车详情 中,在合并请求旁边,选择 。
跳过合并列车并立即合并
如果您有一个高优先级的合并请求,例如必须紧急合并的关键补丁,您可以选择 立即合并。
当您立即合并合并请求时:
- 合并请求的提交被合并,忽略合并列车的状态。
- 列车上所有其他合并请求的合并列车流水线 被取消。
- 启动一个新的合并列车,原始合并列车中的所有合并请求都添加到这个新合并列车中, 每个都有一个新的合并列车流水线。这些新的合并列车流水线现在包含 被立即合并的合并请求添加的提交。
立即合并可能会消耗大量 CI/CD 资源。仅在紧急情况下使用此选项。
如果您的项目使用 fast-forward 合并方法且源分支落后于目标分支,则 立即合并 选项可能不可用。有关更多详细信息,请参阅 问题 434070。
允许跳过合并列车以立即合并而不重新启动合并列车流水线
- Status: Experiment
在 GitLab 自托管版中,默认情况下此功能可用。要隐藏该功能,
管理员可以 禁用功能开关
名为 merge_trains_skip_train。在 GitLab.com 和 GitLab Dedicated 中,此功能可用。
您允许合并请求在不完全重新启动正在运行的合并列车的情况下进行合并。 使用此功能可以快速合并可以安全跳过流水线的更改,例如 次要的文档更新。
您不能为 fast-forward 或 semi-linear 合并方法跳过合并列车。有关更多信息,请参阅 问题 429009。
跳过合并列车是一个实验性功能。它可能会在未来版本中更改或被完全移除。
您可以使用此功能快速合并安全修复或错误修复,但跳过列车的合并请求中的更改 不会针对列车中的任何其他合并请求进行验证。如果这些其他合并列车流水线 成功完成并合并,则存在组合更改不兼容的风险。 目标分支可能需要额外的工作来解决新的故障。
先决条件:
- 您必须拥有 Maintainer 角色。
- 您必须已 启用合并列车。
要启用跳过列车而不重新启动流水线:
- 在左侧边栏,选择 搜索或跳转至 并找到您的项目。
- 选择 设置 > 合并请求。
- 在 合并选项 部分,确保 启用合并结果流水线 和 启用合并列车 选项已启用。
- 选择 允许跳过合并列车。
- 选择 保存更改。
要通过跳过合并列车来合并合并请求,请使用 合并请求合并 API 端点
进行合并,并将属性 skip_merge_train 设置为 true。
合并请求被合并,现有的合并列车流水线不会被取消或重新启动。
故障排除
合并请求从合并列车中掉落
如果合并请求在合并列车流水线运行时变得不可合并,合并列车会自动丢弃您的合并请求。例如,这可能是由以下原因引起的:
- 将合并请求更改为 草稿。
- 合并冲突。
- 当 所有线程都必须已解决 启用时,存在未解决的新对话线程。
您可以在系统注释中找到合并请求从合并列车中掉落的原因。在 概览 选项卡的 活动 部分查找类似的消息:
用户从合并列车中移除此合并请求,因为...
无法使用自动合并
当合并列车启用时,您不能使用 自动合并 (以前的 当流水线成功时合并)来跳过合并列车。有关更多信息,请参阅 问题 12267。
无法重试合并列车流水线
当合并列车流水线失败时,合并请求会从列车中掉落,失败后无法重试。 合并列车流水线在合并请求的更改与列车上其他合并请求的更改合并结果上运行。 如果合并请求从列车中掉落,合并结果已过时,无法重试流水线。
您可以:
- 再次将合并请求添加到列车, 这会触发新的流水线。
- 如果作业间歇性失败,将
retry关键字添加到作业中。 如果重试后成功,合并请求不会从合并列车中移除。
无法将合并请求添加到合并列车
当 流水线必须成功 已启用,但最新的流水线失败时:
- 设置为自动合并 或 合并 选项不可用。
- 合并请求显示
此合并请求的流水线失败。请重试作业或推送新提交来修复故障。
在您可以将合并请求重新添加到合并列车之前,您可以尝试:
- 重试失败的作业。如果通过,且没有其他作业失败,则流水线被标记为成功。
- 重新运行整个流水线。在 流水线 选项卡上,选择 运行流水线。
- 推送修复问题的新提交,这也会触发新的流水线。
有关更多信息,请参阅 相关问题。