分支连续更新,旧构建还在跑,新的验证结果迟迟拿不到。
最快解法:对会被后续提交取代的分支验证开启自动取消并收敛触发条件;对发布归档和不能安全重跑的任务,关闭该设置或拆成独立工作流。配置后要核对实际取消对象和最终交付状态。

管理 Xcode Cloud 工作流的 IT 或平台负责人,可以据此制定触发与取消策略。
负责 UI 回归的研发效能负责人,可以判断哪些测试适合合并或改为独立触发。
维护归档与 TestFlight 流程的团队,可以用下文检查取消是否会中断交付。

先按任务结果判断自动取消边界

自动取消不是通用的“清理队列”开关。它适用于后续提交能够取代当前结果的验证:例如同一分支上旧提交的构建与单元测试。若每次运行都承担独立的诊断、审计或交付责任,取消旧任务就可能丢失仍然必要的结果。

Apple 的 Xcode Cloud 工作流说明指出:默认情况下,每个启动条件启用自动取消;同一工作流排入新构建时,进行中的构建会被自动取消。关键边界是“同一工作流”,不是把不同工作流、所有任务或整个队列一概处理。

先用这几个问题划分任务:

  • ✅ 新提交能否完整替代旧提交的验证结果?能,才考虑自动取消。
  • ⚠️ 旧任务是否产生独立诊断材料、审计记录或需要交付的归档?需要,优先保留。
  • ✅ 这项验证是否只为尽快判断当前分支状态?可考虑开启,并审查触发范围。
  • ❌ 取消后是否会被误当作成功或发布完成?如果团队门禁无法区分状态,先拆分工作流和验收规则。

工作流本身可以配置启动条件与构建动作。Apple 的工作流动作说明列出构建、测试、分析和归档等动作;动作相似,不代表取消风险相同。应按结果的用途,而非只按工作流名称判断。

分支验证:让新提交替代旧结果

Xcode Cloud 可按分支变化启动构建;常见默认设置会在默认分支发生变化时启动工作流。Apple 在首次配置工作流的说明中提醒,启动条件决定工作流何时运行。若触发范围覆盖了不需要即时验证的分支,自动取消只能替换旧任务,不能纠正过宽的触发策略。

适合自动取消的典型情况:开发者推送修复后又连续推送补充提交,团队只需要确认最新提交是否通过基础构建和测试。较新的构建可以取代旧提交的当前验证结论;旧任务仍可能保留为已取消记录,但不能算作通过。

实施时按此顺序核验:

  • 先确认触发来源:分支变化、拉取请求、标签或计划任务,分别记录哪些条件会启动该工作流。工作流参考文档说明可按分支、拉取请求、Git 标签或计划配置启动条件。
  • 给快速反馈工作流明确命名,并只保留需要即时反馈的触发条件。
  • 在相应启动条件的选项中启用自动取消;不要把另一条发布或诊断工作流的选项一并照搬。
  • 触发一次测试提交,再推送后续提交,观察新任务是否进入同一工作流。
  • 对照构建记录里的提交标识、触发来源、取消状态和最终验证结果。首次配置流程的文档说明,构建报告会提供构建状态与所用提交等信息。

这套核验不会承诺节省多少时间或释放多少容量。它回答的是更重要的问题:哪些旧任务被取消了,最新提交是否真正完成了团队要求的验证。

连续提交:区分可替代结果与独立证据

自动取消最有用的场景,是“旧提交很快失去验证价值”。如果每次提交只需确认当前分支仍可构建,保留最新一次完成结果通常更贴合目的。Apple 的工作流策略指南也建议按项目和团队需要拆分工作流,而不是要求所有验证都采用同一触发方式。

但“只保留最新构建”不应成为所有连续提交的默认政策。以下任务通常值得独立保留:

  • 用于定位偶发故障的专项诊断,后续提交未必能复现旧问题。
  • 需要逐次核对变更结果的审计或发布前检查。
  • 发布候选版本、版本标签或其他具有交付后果的任务。

如果团队需要保存这些记录,不要只凭“新提交更新”决定取消。把快速分支验证和需要完整留痕的任务拆成不同工作流,并分别规定通过、失败、取消三种状态如何进入合并门禁。

UI 回归:先缩小触发范围,再决定是否取消

多模拟器 UI 测试成本高,且每次分支变化都启动完整回归,未必符合团队的反馈目标。Apple 的工作流参考文档明确举例:在多个模拟器上运行 UI 测试的工作流,可能不适合跟随每次分支变更启动;可以调整启动条件,让工作流运行得更少。

更稳妥的做法不是先开自动取消,再期待它替你管理测试策略,而是把快速门禁和完整回归分开:

  • 分支或拉取请求工作流负责团队要求的快速检查。
  • 多模拟器 UI 回归使用更精确的触发条件,或配置为独立的计划工作流。
  • 若完整 UI 测试针对某个合并候选或发布候选提供独立证据,就保留该次结果,不要让普通分支新提交取代它。

Apple 的测试结果说明也区分了开发过程中运行测试子集、代码审查阶段运行相关测试,以及按计划执行更完整测试的用途。你需要在团队门禁中明确:取消代表任务未完成,不等于测试通过;若取消的 UI 任务是必需检查,门禁必须等待有效完成结果。

常见问题:按状态核对,而不是猜测

自动取消会不会停止正在运行的构建?
会,但范围要按官方描述理解:新构建排入同一工作流,且相应启动条件启用了自动取消时,进行中的构建可能被取消。检查任务所属工作流和提交标识,再判断新构建是否真正替代旧构建;不要把这一行为推断为跨工作流取消。

连续推送时,怎样只保留最新验证?
将目标设为“验证最新提交”,确认触发条件只覆盖这类验证,再开启该条件的自动取消。之后用连续提交做一次受控核验:旧任务是否显示取消、最新任务是否完成、结果是否被合并门禁识别。诊断与审计工作流应独立保留。

发布归档流程是否应关闭自动取消?
如果每次归档或分发都必须留下可核验结果,就关闭对应条件的自动取消,或将发布工作流从日常验证中拆开。Apple 的分发工作流指南允许按团队需求采用单一或多个工作流;选择后仍要检查归档产物和分发状态。

UI 测试要不要每次提交都触发?
先看它是不是每次提交的必要门禁。如果完整多模拟器回归不需每次执行,就收紧启动条件或另设计划工作流;如果门禁要求该次回归完成,取消后的状态必须判为未完成,而不是通过。

发布归档:保住有交付后果的结果

分支验证的目标通常是获得最新代码的验证结论;发布工作流还可能负责生成归档、上传并分发给测试人员。若新构建到来会取消进行中的发布任务,就要先判断这会不会丢失当前候选版本所需的产物或交付记录。

建议把日常验证与发布分开设计:

  • 日常分支工作流:构建和测试为主;若结果可被后续提交取代,可开启自动取消。
  • 发布归档工作流:按发布分支或标签等适合团队流程的条件触发;如果每次发布结果都需保留,则关闭自动取消,或使用独立工作流。
  • TestFlight 分发工作流:确认归档动作、分发后动作和目标测试组设置符合发布流程,再进行受控发布验收。

不要以“工作流已启动”或“工作流已结束”作为发布成功证据。检查构建报告中的动作结果、归档产物和分发状态;随后到 App Store Connect 的 TestFlight 页面查看构建状态。Apple 的构建状态说明强调,状态对应的是构建本身;其上传构建说明也指出,构建还需要经过 Apple 系统处理后才会出现在 App Store Connect。不同状态的含义应按团队实际交付链路逐项核验。

⚠️ 若你无法从构建记录判断某个任务是“已取消”还是“已验证”,先暂停发布门禁的自动化判断。补齐状态映射与产物核验后,再启用自动取消。

混合 CI:明确 Xcode Cloud 与 Mac 节点的交接

Xcode Cloud 适合按其工作流、启动条件和动作组织的构建与验证。若任务依赖团队自主管理的执行环境、企业内部运行条件,或需要自行控制后续执行过程,可以评估由 Mac 节点承接;这不是性能或价格上的预设结论,必须按实际依赖和验收结果决定。

交接前先写清边界:哪个系统负责触发,哪个系统运行任务,构建产物怎样交接,失败或取消由谁判定。若使用自定义构建脚本传递信息,可核对 Apple 的环境变量参考;其中的变量可用于识别启动来源和工作流信息,但不能替代你对外部节点实际执行结果的检查。

实际验收至少走完以下步骤:

  • 选一个不涉及正式发布的样例任务,记录 Xcode Cloud 的触发来源和提交标识。
  • 明确 Mac 节点接手的条件及需要传递的源代码版本、构建参数和产物。
  • 分别记录 Xcode Cloud 工作流结果与 Mac 节点执行结果,避免把“已触发”当作“已接收”。
  • 验证取消发生时,交接端不会把未完成任务标记为成功;重试规则要能区分可重跑和不可重复的发布动作。
  • 对照预期的测试、归档或交付证据完成验收,再决定是否把该类任务长期交给独立 Mac 节点。

如果你正比较远程 Mac 与现有 CI 节点的接入路径,可以先查看 MACCOME 的远程 Mac 服务入口,再按自己的网络、权限和交付要求核对方案。若团队已确定需要自主管理的 Mac 执行节点,也可查看 MACCOME 的远程 Mac 接入与计算资源信息,并用自己的工作流做接入验证。

对于仅需短期验证、迁移测试或临时构建环境的团队,租赁 MACCOME 远程 Mac 可以先试清任务边界;如果任务长期稳定重载,或必须连接特定物理设备与接口,则应先比较自购设备、现有节点和远程方案的维护责任、权限要求及实际接入条件。