
Pinterest发布了一份技术案例研究,详细介绍了其工程团队如何通过采用运行时感知的测试分片策略并构建内部测试平台,将 Android 端到端(E2E)持续集成(CI)的构建时间缩短了 36%以上。在进行变更之前,Pinterest 的 Android CI 管道因测试套件在第三方平台上按包名拆分,导致最慢的分片阻塞了整个构建,从而导致构建时间缓慢且不可预测。通过创建一个自定义的内部平台并重新组织测试的分发方式,Pinterest 实现了更平衡的执行,显著降低了开发人员的反馈延迟。
在他们之前的设置中,Pinterest 依赖于Firebase Test Lab (FTL)并基于包分组进行测试分片,当一些测试运行时间比其他测试长得多时,会导致工作负载不均衡。这不仅延长了总构建时间,还引入了不稳定性和设置开销,从而增加了每次运行的时间。在评估了第三方替代方案后,该团队得出结论,没有哪个方案能够满足其对原生模拟器支持、可靠性和细粒度控制的要求,而不需要自定义的编排层。这一分析导致了 PinTestLab 的开发,这是一个内部测试基础设施,它在 EC2 实例上运行 Android 模拟器,使工程师能够完全控制调度、设置环境和编排运行时。
其核心创新涉及一种运行时感知的分片算法,该算法使用存储在 Pinterest 的 Metro 测试管理系统中的历史测试执行数据,按预期持续时间而不是计数对测试进行分组。与简单的轮询或基于包的分片不同,该算法根据预期运行时间对测试进行排序,并将它们分配给分片,从而最小化各分片执行时间的差异。使用这种方法,团队将最快和最慢分片之间的时间差距从数百秒缩短到几十秒,从而实现一致且更快的构建完成。这种转变将最慢的分片运行时间缩短了 55%,并将每次构建的 CI 反馈时间缩短了约 9 分钟。
这一改进的关键促成因素是 Pinterest 能够收集和使用每个测试的历史运行时和稳定性数据。运行时感知的方法不是按数量平均分配测试,而是根据过去的性能将测试分配给预期首先完成的分片,保持模拟器资源繁忙和尾部延迟较低。实现涉及轻量级排序和使用最小堆数据结构的贪心赋值,这是调度效率和计算简单性之间的一种折衷。
Pinterest 的平台还优先考虑了运维的稳定性:运行时感知的分片逻辑在Buildkite中运行,使用历史数据生成每个分片的计划,但如果 Metro 不可用,则会回退到轮询分发,从而确保即使在基础设施出现故障的情况下也能保证 CI 的可靠性。展望未来,该团队正在探索使用消息队列的按需分片,以获得更大的弹性和更细粒度的测试执行,但他们发现当前的方法能够以最小的复杂度提供强大的性能。
这项工作突出了 CI 优化中的两个更广泛的趋势。首先,利用历史经验数据进行工作负载平衡可以在并行测试环境中获得确定性的性能提升。其次,从供应商管理的分片转向内部编排,可以让团队根据自己独特的工作负载特征定制测试执行策略。随着测试套件的规模和复杂性不断增长,Pinterest 的努力为其他面临 CI 等待时间延长的组织提供了一个实用模型,这是现代软件开发中的一个常见挑战。
还有其他公司和项目也采用了类似的方法来提高 CI 性能、测试分片和缩短构建时间,通常使用历史数据、并行化或根据工作负载定制的自定义算法。以下是一些其他示例及其关键细节:
Dropbox 的工程师改进了他们的 Android 测试管道,使用Affected Module Detector(受 AndroidX 工具的启发)有选择地识别并只运行给定更改中受影响的测试,并通过诸如 Flank/Fladle 等工具进行测试分片。他们还标准化了覆盖率报告,并将设备上的测试转移到 Firebase Test Lab,从而将整个 Android CI 运行时间从 75 分钟左右减少到 25 分钟左右。他们的方法与 Pinterest 的工作精神相似,因为它避免了运行不必要的测试,并应用战略并行来提高 CI 效率。
Shopify 的工程团队构建了一个自定义的测试分离器,它使用历史计时数据来平衡测试分片。通过按执行时间排序测试,然后以一种最小化分片差异的方式分配测试,它们极大地减少了慢分片和快分片之间的不平衡,将总 CI 构建时间从大约 45 分钟减少到大约 11 分钟,并且将分片持续时间差异压缩到大约 5%以内。这种模式与 Pinterest 的运行时感知的分片概念非常相似,并展示了历史时间指标如何在深思熟虑的情况下产生巨大的 CI 加速。
Square 的内部 CI 工具Kochiku支持自动化分片、智能调度和跨数百个 Android 构建分片的分布式缓存。Square 的方法虽然没有 Pinterest 的案例研究那么详细,但它强调了扩展 CI 分片和调度逻辑到分布式环境的重要性,在这种环境中,成百上千的并行测试工件可以独立执行,减少积压并提高资源利用率。
像Bitrise这样的平台提供了内置的测试分片和并行化功能,许多应用团队采用这些功能来减少 CI 时间。Bitrise 的用户报告称,使用它的分片和并行执行能力可以减少大约 50%的测试时间,尽管与 Pinterest 等自定义系统相比,它的抽象层次更高。
Slack 的工程团队通过有条件地跳过不必要的前端构建并重用预构建资产来优化端到端 CI 管道,这使得构建速度提高了约 50%,并减少了不稳定因素。虽然没有严格的测试分片,但这个例子展示了基于构建上下文的战略性重用和选择性执行是如何对 CI 反馈循环进行重大改进的。
这些例子说明,虽然 Pinterest 的运行时感知分片技术以简单和有效而闻名,但它适用于许多工程组织正在采用的更广泛的最佳实践:使用历史执行数据来平衡工作负载,最大化并行性,避免不必要的测试执行,以获得更快、更可靠的持续集成反馈。
原文链接:
https://www.infoq.com/news/2025/12/pinterest-ci-build-reduction/







评论