Cypress在GitHub Actions CI环境中持续挂起问题求助
环境信息
- CI平台:GitHub Actions,2台Ubuntu运行器
- 技术栈:Cypress 9.6.1 + cypress-cucumber-preprocessor 4.3.1,Node.js 14
- 配置:Cypress Dashboard存储测试结果,Headless Chrome浏览器
问题详情
一开始只是偶尔出现构建挂起,现在已经变成每次都卡壳,日志直接停更。已经排除了磁盘空间和内存不足的问题——测试前特意跑了free和df确认资源充足。开了调试日志后发现,每次失败的运行末尾都会刷一堆cypress:server:request aborting { requestId: 'request161' } +0ms的记录,之后每10秒会打印一次CPU/内存统计,但再也没有其他进展。
疑问与已尝试操作
- 有没有人碰到过同款问题?会不会是负责并行执行管理的Cypress Dashboard出问题,导致两台虚拟机同时卡壳?
- 已经试过换浏览器、用内存更大的虚拟机;接下来打算试
parallel: false,同时禁用向Cypress Cloud同步测试结果。
排查方向与可行方案
优先验证并行与Cypress Cloud的影响
你打算试的parallel: false+禁用Cypress Cloud记录是最直接的验证手段。如果这么改之后问题消失,基本就能锁定是并行调度或者Dashboard通信的锅:- Cypress 9.x版本的并行调度和Dashboard通信时,偶尔会出现请求阻塞,尤其是网络波动或者Dashboard临时限流的时候,很容易导致Runner挂死。可以试试把Cypress更到9.x的最新补丁版(比如9.7.0),这个版本修复了不少并行执行相关的请求阻塞问题。
检查cypress-cucumber-preprocessor的兼容性
cypress-cucumber-preprocessor 4.3.1和Cypress 9.6.1的组合可能存在隐性兼容问题,尤其是并行执行时的钩子处理逻辑。可以试试:- 把预处理器更到对应Cypress 9.x的最新兼容版本(比如4.3.2)
- 临时关掉预处理器,改用Cypress原生测试文件,看问题会不会消失。
捕获进程状态定位卡壳原因
在CI挂起的时候,用ps aux或者top看看Cypress相关进程的状态,如果有进程处于D状态(不可中断睡眠),大概率是文件锁或者资源占用的问题。可以在GitHub Actions的工作流里加个后台脚本,定期输出进程状态,方便定位。调整Headless Chrome启动参数
旧版Headless Chrome在资源调度上容易出问题,试试加这些启动参数:// cypress.config.js(或cypress.json)中配置 module.exports = { chromeWebSecurity: false, browser: 'chrome', chromeOptions: { args: [ '--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu', '--disable-software-rasterizer', '--window-size=1920,1080' ] } }--disable-dev-shm-usage能避免Ubuntu容器里/dev/shm空间不足导致的浏览器挂起——虽然你已经确认资源充足,但这个参数对Headless Chrome的稳定性确实有帮助。检查测试代码里的阻塞逻辑
大量的请求中止日志,可能意味着测试里有没处理好的网络请求,或者钩子(beforeEach/afterEach)里有阻塞操作。可以排查:- 有没有没设置超时的
cy.request或cy.intercept请求 - 测试结束后有没有没清理的资源,比如WebSocket连接、定时器
- 有没有没设置超时的
内容的提问来源于stack exchange,提问作者Pavel Kartavkin

