Canva 的更快持续集成构建

Canva 的更快持续集成构建

💡 原文英文,约6300词,阅读约需23分钟。
📝

内容提要

2022年4月,合并请求(PR)通过持续集成(CI)并合并到主分支的平均时间约为80分钟。现在,我们的CI构建时间已经降至30分钟以下。通过发现最佳机会、实验验证问题并尝试不同的解决方案、逐步提高CI效率和团队合作,我们改进了主代码库中的CI构建时间。主要瓶颈是水平扩展效率低下和步骤过多。通过优化CI实例池、使用Bazel远程构建执行、简化流水线生成和优化测试步骤等措施,我们显著缩短了CI构建时间,提高了开发人员的体验。

🔎

延伸解读

CI 构建时间优化的关键转折点

Canva 的 CI 构建时间从 2022 年 4 月的约 80 分钟降至 30 分钟以下,主要转折点包括:2022 年 6 月成立 CI 体验工作组,解决 Bazel 缓存和流水线步骤重复等简单问题;2023 年 4 月推出 BE/ML Pipeline v2,将构建时间从 49 分钟降至 35 分钟;2023 年 9 月发布 FE Pipeline v2 及 Bazel 化的前端集成与可访问性测试,显著提升速度并降低成本。这些阶段性改进体现了增量交付的价值。

水平扩展的陷阱与实例池优化

Canva 曾通过增加 CI 步骤和 VM 实例来水平扩展,导致每次 check-merge 构建有约 3000 个作业,每周下载数 PB 依赖,实例频繁冷启动,缓存失效,成本高昂。优化实例池,如使用 i4i.8xlarge 实例,将构建全部步骤的作业运行时间从 3 小时降至 15 分钟,并利用 EBS 快照加速代理预热,峰值等待时间减少 75%。这表明单纯增加资源不如优化资源利用效率。

Bazel 远程构建与缓存策略的实践

Canva 利用 Bazel 的远程构建执行(RBE)和“无字节构建”(BwoB)来提升效率。BwoB 通过 --remote-download-minimal 标志避免下载不必要的构建产物,使后端构建时间从 10 分钟减至 5 分钟,机器学习构建从 6 分钟减至 2 分钟。同时,RBE 将构建负载分布到专用集群,TypeScript 构建速度提升 200%。这些措施表明,合理利用缓存和远程执行能大幅减少 I/O 和计算开销。

测试健康与关键路径管理

CI 关键路径受最长依赖动作限制,一个缓慢或不稳定的测试可能拖累整个构建。Canva 通过手动禁用和协助改进慢速、不稳定的测试,将超过 10 分钟的测试动作减少到 3 分钟,并计划自动化强制执行测试健康标准。此外,针对 E2E 和集成测试优化 CPU 需求和 worker 池,节省 7-10 分钟。这强调了持续监控和优化测试性能对整体 CI 效率的重要性。

❓

Q&A

Canva 如何缩短持续集成的构建时间?

Canva 通过优化 CI 实例池、使用 Bazel 远程构建执行、简化流水线生成和优化测试步骤等措施,将构建时间从 80 分钟缩短到 30 分钟以下。

在持续集成中,主要的瓶颈是什么?

主要瓶颈是水平扩展效率低和步骤过多,这导致资源利用不足和构建时间延长。

Canva 在 CI 体验方面采取了哪些团队合作措施?

Canva 成立了 CI 体验工作组,汇集不同团队的成员,解决了许多简单问题并进行流水线审计,以识别改进机会。

Bazel 远程构建执行(RBE)对 CI 有什么影响?

Bazel 远程构建执行(RBE)提高了构建和测试的效率,允许将工作负载分配到多个机器上,从而加快了构建速度。

Canva 如何处理 CI 中的缓存问题?

Canva 使用 Bazel 的缓存机制,通过设置远程下载最小化标志,减少了不必要的网络 I/O 和时间,提高了构建效率。

Canva 在 CI 流水线中做了哪些简化?

Canva 通过去除 bazel-diff 和 bazel 查询,简化了流水线生成过程,使生成时间减少到 2-3 分钟。

🏷️

标签

➡️

继续阅读