在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