GitHub Actions CI中npm test任务持续运行不结束的问题排查
任务持续挂起的核心原因
- 最直接的挂起诱因:
package.json中的test脚本为nodemon --exec babel-node spec/run.js。nodemon是面向本地开发的常驻型文件监听工具,启动后会持续监听文件变更、自动重启进程,本身没有执行完主动退出的逻辑。本地开发时你可以手动终止进程,但GitHub Actions是无交互的自动化环境,会一直等待测试进程主动返回退出码,自然就会出现任务永远不结束的状态。 - 配置类连带问题:
package.json的devDependencies块中重复声明了两次"eslint-watch": "^7.0.0",会导致npm ci环节直接依赖校验失败,哪怕解决了挂起问题也无法走完流程- 工作流配置中Node版本矩阵列出的10.x、12.x、15.x均已停止官方维护,和当前版本的
actions/setup-node存在兼容性问题,容易出现安装异常、行为不符合预期的情况
可落地的配置调整方案
- 拆分本地开发和CI环境的测试脚本,去掉CI流程里的nodemon依赖:
- 把根脚本
test修改为单次执行、运行完自动退出的形式:"test": "babel-node spec/run.js" - 如果本地需要监听文件变化自动跑测试,可以单独新增一个专用脚本:
"test:watch": "nodemon --exec babel-node spec/run.js",这样既不破坏本地开发体验,也能保证CI环境的测试进程执行完正常退出
- 把根脚本
- 修正
package.json里的依赖配置,删除重复的eslint-watch声明,保证npm ci可以正常完成依赖安装 - 优化工作流的Node版本矩阵,替换掉已停止维护的旧版本,比如将原有的
[10.x, 12.x, 14.x, 15.x]调整为长期维护的LTS版本列表;同时升级工作流中引用的actions/checkout、actions/setup-node的版本,避免旧版action的兼容bug - 配置修改完成后,可以先在本地手动执行
npm test,确认脚本运行完成后会自动正常退出、没有残留常驻进程,再推送到分支触发CI校验
内容的提问来源于stack exchange,提问作者Mary Obiagba
相关产品推荐
相关产品推荐

