You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Github Actions中CI/CD卡在npm run start进程的问题排查

解决Github Actions卡在npm run start无法执行后续测试的问题

你的流水线之所以卡在npm run start步骤,核心原因是这个命令会启动一个常驻的Node.js服务器进程——它会一直占用当前终端的执行上下文,不会自动退出,导致后续的npm run test步骤完全没有执行机会。

下面是三种可行的解决方法,按推荐程度排序:

方法一:在测试代码中自动启停服务器(最推荐)

如果使用Jest,可以通过测试的生命周期钩子来控制服务器的启动和关闭,完全不需要在流水线中单独启动服务:

  1. 在项目根目录创建jest.setup.js文件:
const app = require('./app');
let server;

// 所有测试开始前启动服务器
beforeAll((done) => {
  server = app.listen(3000, done);
});

// 所有测试结束后关闭服务器
afterAll((done) => {
  server.close(done);
});
  1. 修改jest.config.js(如果没有就新建),配置setup文件:
{
  "setupFilesAfterEnv": ["./jest.setup.js"]
}
  1. 调整流水线步骤,删掉单独的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这类工具同时启动服务器和测试进程,测试完成后自动终止服务:

  1. 安装依赖:
npm install --save-dev concurrently
  1. 修改package.json的scripts:
"scripts": {
  "test": "jest",
  "start": "node app.js",
  "start:test": "concurrently \"npm run start\" \"npm run test\""
}
  1. 流水线中只需要执行这个组合命令:
- run: npm ci
- run: npm run start:test

这种方式不需要修改测试代码,但需要额外安装依赖,适合快速调整的场景。

内容的提问来源于stack exchange,提问作者quinzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:45:30