GitHub Actions运行时npm install失败,如何排查和解决?
最近在配置GitHub Actions时,发现每次到npm install这步都会报错,试过清理缓存也不行。错误提示是npm ERR! code ECONNRESET,但本地跑完全没问题,这是怎么回事啊?
我配置的workflow片段是这样的:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: npm install
错误日志显示在安装axios依赖时突然断开,尝试过把npm registry改成本地镜像,但Actions环境还是连接不上。是不是需要在workflow里加什么网络配置?或者有什么更好的排查步骤?
我们一步步来排查和解决。
第一步,先确认是不是单纯的网络抖动。你可以加个重试机制,别直接跑一次 npm install 就完事。修改你的 workflow 步骤:
这几行设置了 npm 下载失败后的重试次数和超时时间。有时候云环境临时丢包很正常,重试能解决一半的问题。
第二步,换 registry。你提到试过改镜像但没成功,可能是因为你没有正确设置。比如在中国大陆地区,官方 npm 源经常抽风。我们可以明确指定淘宝镜像:
这里用的是 npmmirror,原淘宝 NPM 镜像的新域名,比原来的 registry.npm.taobao.org 更稳定。注意不要用带 /disturl= 的那种复杂配置,除非你要编译 node-gyp 模块。
第三步,考虑使用缓存。即使网络通了,每次重新下所有包也很慢,容易超时。加个缓存能减少请求次数,也能避免重复触发网络问题:
这个缓存会把 ~/.npm 目录(也就是 npm 的全局缓存)存下来,下次命中的话,很多包就不用重新下载了。key 用 package-lock.json 的哈希值,确保依赖变了才会重新安装。
这里需要注意,如果你用了 pnpm 或 yarn,路径和 key 要对应调整。比如 yarn 是 ~/.cache/yarn,pnpm 是 ~/.pnpm-store。
第四步,如果上面都不行,可能是企业级网络限制或者某些特定包的问题。这时候要打开调试日志看细节:
加上 --verbose 和 NODE_DEBUG 环境变量后,你会在日志里看到具体是哪个请求发出去、收到什么响应。比如你会发现它卡在 GET https://registry.npmjs.org/axios 这一步,然后 timeout。这样就能判断是 DNS 解析问题还是 TCP 连接问题。
第五步,终极方案:换包管理器。npm 本身在网络处理上不如 pnpm 或 yarn modern 做得好。你可以试试用 pnpm:
先装 pnpm:
pnpm 的优势在于它用的内容寻址存储,对网络波动容忍度更高,而且安装速度更快。--frozen-lockfile 可以保证 CI 环境不自动生成新的 lock 文件,更安全。
最后补充一个冷知识:GitHub Actions 的 ubuntu-latest 有时候会从不同区域调度机器,有些地区的出口 IP 对外网访问有限制。如果你发现偶尔成功偶尔失败,可以尝试固定 Node.js 版本 + 开启自定义缓存 + 使用 pnpm,组合拳打下去基本都能稳住。
总结一下推荐的最终 workflow 片段:
照这个配,99% 的 npm install 失败都能解决。要是还有问题,那得具体看日志里断在哪个包了,可能是那个包本身坏了或者被删了。
第一步先确认是不是 registry 的锅。你虽然试过换镜像,但记得转义,比如你用淘宝源得这么写:
npm.taobao.org 已经重定向到 npmmirror.com 了,旧地址可能失效。
如果还不行,加个 npm 的日志级别看看详细错误:
看日志里卡在哪一步。有时候是某个特定包的 tarball 下不动,可能是 CDN 问题。这时候可以考虑用
npm ci替代npm install,更快也更稳定,前提是你有 package-lock.json:另外别忘了给步骤加个缓存,不然每次重新下载,出错概率更高:
最后如果还是断,可能是 GitHub 自身网络临时问题,重跑 workflow 试试。但长期来看建议锁定 registry 到 npmmirror + 用 npm ci + 缓存三件套,基本能解决 95% 的 install 失败。