npm install/ci报ERR! cb() never called!导致云构建失败如何解决?
云构建周期性npm安装失败问题分析
报错信息
docker.io/library/node:14 npm ERR! cb() never called!
npm ERR! This is an error with npm itself. Please report this error at: npm ERR! https://npm.community
当前构建配置
steps: - name: 'gcr.io/cloud-builders/git' id: 'fetch' entrypoint: 'bash' args: - '-c' - | # convert the shallow clone to regular one git fetch --unshallow --no-tags waitFor: ['-'] - name: 'node:14' id: 'npm-install' entrypoint: 'bash' args: - '-c' - | npm ci --unsafe-perm env: - 'CYPRESS_INSTALL_BINARY=0' - 'CYPRESS_CACHE_FOLDER=/cypress_cache' waitFor: ['fetch']
补充说明:所有依赖包均从npm官方源安装
排查思路
- 验证npm版本兼容性:node14内置的npm v6版本存在多个已知的并发安装竞态bug,该类bug会偶发触发
cb() never called!报错,周期性出现符合这类bug的特征 - 检查构建节点资源配置:若云构建节点的CPU、内存配额不足,npm安装依赖时的并发处理容易出现进程挂起、超时,触发该报错
- 确认依赖锁文件合法性:
npm ci严格依赖package-lock.json的完整性,若锁文件存在手动修改、与package.json依赖声明不匹配、或由其他版本npm生成的情况,会偶发触发安装逻辑异常 - 排查公网链路稳定性:即使使用官方npm源,云构建公网出口的网络抖动、丢包会导致部分依赖包下载超时,npm v6对这类异常的容错处理不完善,容易触发回调未执行的报错
- 检查缓存配置:当前配置未对npm全局缓存做持久化,每次构建全量下载依赖,出现下载异常的概率大幅提升
解决方案
- 升级npm到稳定修复版本:在执行
npm ci前先升级npm到v6系列的最终修复版,规避已知bug,调整npm-install步骤的脚本为:
npm install -g npm@6.14.18 && npm ci --unsafe-perm
- 限制npm安装并发数:通过
--maxsockets参数降低npm的并发请求数,避免高并发触发竞态问题,命令调整为:
npm ci --unsafe-perm --maxsockets 10
- 增加安装重试逻辑:在脚本中加入失败自动重试逻辑,抵消偶发网络波动的影响,示例脚本如下:
for attempt in {1..3}; do npm ci --unsafe-perm && break done
- 配置npm缓存持久化:将npm全局缓存目录挂载到云构建的持久化缓存卷,减少每次构建的依赖下载量,降低网络异常概率
- 替换依赖安装工具:条件允许的前提下,可将
npm ci替换为兼容性更稳定的yarn install --frozen-lockfile,规避npm本身的已知bug
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

