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

news/2025/11/5 23:11:18/文章来源:https://www.cnblogs.com/qife122/p/19194890

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

问题:不必要的前端构建

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

  • 开发者工作流:开发者进行更改并推送到分支。
  • 构建过程:构建前端代码(约 5 分钟)。
  • 部署:将构建部署到 QA 环境。
  • 测试:运行超过 200 项 E2E 测试,耗时另外 5 分钟。

整个过程每次运行约需 10 分钟。其中约 5 分钟被前端构建占用,即使不涉及前端变更。

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

  • 每周数千次前端构建,每次构建在 AWS S3 中存储近 1GB 数据。
  • 其中半数构建与上次合并到 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

有兴趣承担有趣项目、让人们的职场生活更轻松,或只是构建一些很酷的表单吗?我们正在招聘!
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/957212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结构体与联合体的区别

1.内存分配方式 结构体为每一个结构体的成员分配独立的内存空间;总内存为所有成员大小之和。 联合体的成员共享同一片内存空间,总内存大小为最大成员的大小。 2.成员访问特性 结构体可以同时访问所有的成员 联合体同…

Day14综合案例二--

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

解决colcon编译卡死

下面这两个命令我这里不起作用:colcon build --parallel-workers 6 colcon build --executor sequential下面命令可以解决卡死问题:MAKEFLAGS=-j4 colcon build

铁杆粉丝占比20251105

序号 代码 名称 最新价(2025.11.05) 涨跌幅(2025.11.05) 铁杆粉丝占比 涨跌额(2025.11.05) 最高价(日线不复权)(2025.11.05) 最低价(日线不复权)(2025.11.05) 换手率(2025.11.05) 量比(2025.11.05) 成交量(股)(2025.11…

Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么? - Higurashi

基于:Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?在 MyBatis 中,Executor 是一个关键的接口,负责执行映射的 SQL 语句。MyBatis 提供了四种类型的 Executor,每种 Executor 在执行 SQL 和处理事务方…

100小时学会SAP—问题10:ME51N提示物料XX的强制账户设置(输入账户设置类别)

100小时学会SAP—问题10:ME51N提示物料XX的强制账户设置(输入账户设置类别)执行事务码ME51N时,报错如下:物料XXXXXX的强制账户设置(输入账户设置类别)解决方法:SPRO-后勤常规-物料主数据-基本设置-物料类型-定义…

P8990 [北大集训 2021] 小明的树 题解

QwQP8990 [北大集训 2021] 小明的树 题解 首先刻画 “美丽”,考虑灭点,由于 1 始终灭,所以形如一个包含 1 的连通块,灭点连通块数量要为 1。 因为要刻画连通块数量,考虑点减边容斥,即连通块个数是灭点个数减 “灭…

100小时学会SAP—问题11:MIGO收货时报错不可能为条目BSX CN01确立账户

100小时学会SAP—问题11:MIGO收货时报错不可能为条目BSX CN01确立账户执行事务码MIGO收货时,报错如下:不可能为条目BSX CN01确立账户。解决方法: 1、首先按照100小时学会SAP步骤配置(在用MMR1、MMF1事务码创建物料…

【动态维护前 x 大元素】LeetCode 3321. 计算子数组的 x-sum II

View Post【动态维护前 x 大元素】LeetCode 3321. 计算子数组的 x-sum II题目 https://leetcode.cn/problems/find-x-sum-of-all-k-long-subarrays-ii/description/ 题解 定义两个有序集合 \(L, R\) 动态维护数组前 \(…

100小时学会SAP—问题8:财务凭证行项目BSEG及对应的六张表

100小时学会SAP—问题8:财务凭证行项目BSEG及对应的六张表FI会计模块中输入一笔业务将会记一个财务凭证,SAP系统中将凭证信息分为抬头信息和明细信息两部分加以存储。其中抬头(Header)信息存储在透明表BKPF中,明细(…

100小时学会SAP—问题9:MD03提示日期在有效工厂日历之后(请改正)

100小时学会SAP—问题9:MD03提示日期在有效工厂日历之后(请改正)执行事务码MD03时,报错如下:提示日期在有效工厂日历之后(请改正)解决方法:这是因为在创建工厂数据的时候工厂的日期没有更改造成的。 路径为:SP…

100小时学会SAP—问题6:创建采购收货时出现WE在年2025中编号不存在

100小时学会SAP—问题6:创建采购收货时出现WE在年2025中编号不存在前台 后勤—物料管理—库存管理—货物移动—收货—对采购订单—采购订单GR(MIGO) 报了如下错误:有关业务/事件类型WE在年2025的号码范围不存在解决…

100小时学会SAP—问题7:FB70提示过账码没有定义

100小时学会SAP—问题7:FB70提示过账码没有定义执行事务码FB70时,报错如下:Posting keys not defined原因:在文档“0528—FB70运行时提示在表T030B中AGD输入丢失”中,解决方法错误,其中的PK码自己瞎填,导致错误…

树剖

接dfs序。 https://www.cnblogs.com/ybjnb/p/19089551 树剖 (dfs序的性质依旧满足 即子树也是一段连续区间)将一颗树转化为一个序列 将树上任意一条路径转化成 log(n) 段连续区间 然后就可以用序列数据结构维护信息。…

100小时学会SAP—问题5:SAP导航菜单字体突然变小

100小时学会SAP—问题5:SAP导航菜单字体突然变小问题:SAP导航菜单字体突然变小 无论修改字体、字符集或登录其他服务器的SAP都是菜单字体变小解决方法: 删除注册表(regedit)HKEY_CURRENT_USER\Software\SAP\SAPGU…

如何降低大模型幻觉

目录数据层面的改进检索增强生成(RAG)提示工程优化强化学习与人类反馈多模型验证置信度校准事实核查层特定领域微调 在大模型开发中减少幻觉是一个核心挑战。以下是一些有效的策略: 数据层面的改进 高质量的训练数据…

11月5日---学习总结

一、内存四区 代码区|全局区|栈区|堆区 1.程序运行前(生成可执行程序exe,未执行该程序之前) 1.1 代码区: *特点1:只读:不可修改 *特点2:共享:防止频繁使用占用内存 1.2全局区:全局变量、静态变量、常量 *静态…

11-2

(1)今天学习了将idea编写的后端代码与vscode上的前端代码连接 (2)明天继续深造

100小时学会SAP—问题4:ME21N创建采购订单报错

100小时学会SAP—问题4:ME21N创建采购订单报错创建采购订单ME21N时报错:物料***的强制账户设置(输入账户设置类别) 消息号ME062 诊断 在此工厂中没有此物料类型基于价值的库存管理的备抵.因此账户分配是十分必要的. 过…