Slack端到端测试管道优化:构建时间减半的技术实践

本文详细介绍了Slack开发体验团队如何通过条件性前端构建和预构建资产缓存策略,将端到端测试管道的构建时间从10分钟缩短至2分钟,大幅提升开发效率并降低云存储成本的技术方案。

在DevOps和开发体验(DevXP)领域,速度和效率对工程师的日常工作有着重大影响。今天,我们将深入探讨Slack的DevXP团队如何利用现有工具优化端到端(E2E)测试管道,降低构建时间并减少冗余流程,为Slack工程师节省时间和资源。

问题:不必要的前端构建

对于我们最大的代码仓库之一(单体仓库),Slack有一个CI/CD管道,在将代码合并到main分支之前运行E2E测试。这对于确保Slack应用程序的整个技术栈(前端、后端、数据库以及中间的服务)的变化得到验证至关重要。然而,我们发现了一个瓶颈:构建前端代码的时间比预期要长,而且过于频繁,即使没有前端相关更改也会执行。以下是详细流程:

  • 开发工作流:开发人员进行更改并推送到分支
  • 构建过程:构建前端代码(约5分钟)
  • 部署:将构建部署到QA环境
  • 测试:运行200多个E2E测试,再花费5分钟

整个过程每次运行大约需要10分钟。其中约5分钟(一半时间)被前端构建消耗,即使不涉及前端更改也是如此。

考虑到每天有数百个拉取请求(PR)被合并,这些冗余构建不仅耗时,而且成本高昂:

  • 每周数千次前端构建,每次构建在AWS S3中存储近千兆字节数据
  • 其中一半构建与上次合并到main相比不包含前端更改,导致数TB的重复数据
  • 每次构建5分钟,给管道增加了不必要的延迟(每周数千小时)

解决方案:采用智能构建策略与缓存前端资产

为了解决这个问题,我们利用现有工具重新思考了构建策略。

步骤1:条件性前端构建

我们的第一步是确定是否需要新的前端构建。我们通过使用git diff及其三点表示法来检测当前检出分支与main分支最新共同提交之间的差异。如果检测到更改,我们调用前端构建作业;如果未检测到更改,我们完全跳过构建并重用预构建版本。

步骤2:预构建资产和内部CDN

当不需要前端构建时,我们从AWS S3定位现有构建。为了提高效率,我们使用仍在生产环境中的近期前端构建。我们将为E2E测试提供预构建前端资产的任务委托给内部CDN。这减少了在每个PR上创建新构建的需求,同时仍确保我们在当前资产上进行测试。

挑战:规模化效率

虽然方法看似简单,但将此解决方案扩展到我们的单体仓库面临了一些挑战:

  • 识别前端更改:我们的仓库包含超过10万个跟踪文件。确定是否存在前端更改需要高效的文件跟踪,git仅用几秒钟即可处理
  • 查找预构建资产:每天有数百个PR合并到此仓库,识别足够新的预构建版本需要强大的资产管理。通过使用简单的S3存储概念,我们能够平衡新鲜度、一致的文件命名和性能来管理资产
  • 保持快速:我们能够在平均不到3秒内区分前端构建是否不必要,并找到最近的构建产物

结果:构建频率降低60%,构建时间减少50%

我们的努力取得了显著成效:

  • 构建频率降低60%:通过智能重用预构建前端资产,我们将不必要的前端构建减少了超过一半
  • 每月节省数百小时:减少了云计算时间和开发人员等待时间
  • 节省数TB存储:每月减少AWS S3存储数TB。这些重复资产原本要存储一年
  • 构建时间改善50%:这是前端DevXP团队及其合作团队的第二个主要项目。第一个项目升级了Webpack设置,将平均构建时间从约10分钟减少到约5分钟。本项目将平均构建时间从约5分钟降至仅约2分钟。两个项目都成功后,我们将E2E管道的平均构建时间从约10分钟减少到约2分钟:这是今年的巨大改进!

两个意外结果:

  • 更可靠和可信的E2E结果:我们的测试不稳定性(指没有代码更改时测试间歇性或不一致失败)显著降低。这一改进来自优化的管道、减少需要复杂前端构建的可能性以及一致的资产交付。根据月度测量,我们观察到了最低的测试不稳定性百分比
  • 重新发现遗留代码:实施此优化需要深入研究多个系统长期未显著修改的遗留代码。这次探索产生了宝贵的见解,引发了关于代码库行为的新问题,并为未来增强生成了任务积压

结论:重新思考前端构建效率

通过战略性地利用git diff和内部CDN等现有工具,我们成功节省了宝贵的开发时间,降低了云成本,并提高了整体构建效率。

对于其他公司面临类似DevOps和DevXP瓶颈的团队,教训是质疑管道中真正必要的内容并相应优化。这个项目的改进事后看来似乎很明显,但在没有完全失败的系统忽视低效情况很常见。在我们的案例中,重新思考如何处理前端资产为组织带来了巨大胜利。

致谢

像这样的项目涉及许多移动部件:构建和测试的复杂管道、云基础设施、内部CDN、前端代码的复杂构建系统,以及我们整个系统中的现有自定义设置。它包括用Python、JavaScript、Bash、PHP/Hack、Rust、YAML和Ruby编写的代码。我们在没有任何停机的情况下实现了这一目标!好吧,几乎。我们的部署管道有十分钟的内部停机时间,但很快得到了修复。

这项工作离不开以下人员的贡献: Anirudh Janga、Josh Cartmell、Arminé Iradian、Anupama Jasthi、Matt Jennings、Zack Weeden、John Long、Issac Gerges、Andrew MacDonald、Vani Anantha和Dave Harrington

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计