Github Actions中CI/CD卡在npm run start进程的问题排查
解决Github Actions卡在
npm run start无法执行后续测试的问题 你的流水线之所以卡在npm run start步骤,核心原因是这个命令会启动一个常驻的Node.js服务器进程——它会一直占用当前终端的执行上下文,不会自动退出,导致后续的npm run test步骤完全没有执行机会。
下面是三种可行的解决方法,按推荐程度排序:
方法一:在测试代码中自动启停服务器(最推荐)
如果使用Jest,可以通过测试的生命周期钩子来控制服务器的启动和关闭,完全不需要在流水线中单独启动服务:
- 在项目根目录创建
jest.setup.js文件:
const app = require('./app'); let server; // 所有测试开始前启动服务器 beforeAll((done) => { server = app.listen(3000, done); }); // 所有测试结束后关闭服务器 afterAll((done) => { server.close(done); });
- 修改
jest.config.js(如果没有就新建),配置setup文件:
{ "setupFilesAfterEnv": ["./jest.setup.js"] }
- 调整流水线步骤,删掉单独的
npm run start,直接执行测试:
- run: npm ci - run: npm run test
这种方式让测试完全掌控服务器的生命周期,既不会出现进程阻塞,也能确保测试时服务处于就绪状态,是最可靠的方案。
方法二:后台启动服务器并等待就绪
把服务器进程放到后台运行,然后通过脚本等待服务启动完成后再执行测试:
修改流水线中的对应步骤:
- run: npm ci # 将服务器放到后台运行 - run: npm run start & # 等待服务器启动(根据你的服务端口和健康检查接口调整) - run: | until curl -s http://localhost:3000 > /dev/null; do sleep 1 done - run: npm run test
注意:如果你的服务没有HTTP接口可以检查,也可以用lsof或netstat监听端口是否被占用,来判断服务是否启动完成。
方法三:用工具同时启动服务和测试
使用concurrently这类工具同时启动服务器和测试进程,测试完成后自动终止服务:
- 安装依赖:
npm install --save-dev concurrently
- 修改
package.json的scripts:
"scripts": { "test": "jest", "start": "node app.js", "start:test": "concurrently \"npm run start\" \"npm run test\"" }
- 流水线中只需要执行这个组合命令:
- run: npm ci - run: npm run start:test
这种方式不需要修改测试代码,但需要额外安装依赖,适合快速调整的场景。
内容的提问来源于stack exchange,提问作者quinzo
相关产品推荐
相关产品推荐

