
jenkins中job编译时出现“Too many open files”报错
jenkins中的job在打包时,总是提示Too many open files,通常是因为系统中允许打开的文件句柄数量超过了限制。要解决这个问题,您可以按照以下步骤增加系统和 J
在 Jenkins CI/CD 构建前端项目(Vue / Vite / Webpack 等)时,执行:
pnpm run build
报错:
11:31:05 <--- JS stacktrace ---> 11:31:05 11:31:05 FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory 11:31:05 1: 0xb85bc0 node::Abort() [node] 11:31:05 2: 0xa94834 [node]
即 Node.js 在运行时超出了默认 V8 引擎的内存限制(~2GB)。
常见场景:
前端项目依赖多、打包体积大
构建命令中存在多个同时运行的高内存任务(如 vue-tsc + vite build)
Jenkins / pnpm 子进程没有正确继承 NODE_OPTIONS
默认内存限制不足:Node.js 默认最大堆内存约 2GB,在大型构建时不够用。
NODE_OPTIONS 未生效:在 Jenkins + pnpm 环境中,NODE_OPTIONS 环境变量可能在子进程中丢失。
多个构建任务并行执行:如 vue-tsc 与 vite build 同时运行会造成内存峰值过高。
错误调用 Node 执行 shell 脚本:直接用 node ./node_modules/.bin/xxx 会报语法错误,因为这些文件是 shell 脚本而非纯 JS。
pnpm exec node 加内存参数在 package.json 中,将构建命令改为:
"scripts": { "build": "pnpm exec node --max-old-space-size=8192 vue-tsc --noEmit && pnpm exec node --max-old-space-size=8192 vite build" }
说明:
pnpm exec 会在本地依赖中查找可执行文件(vue-tsc、vite),并自动用正确的 Node 执行。
--max-old-space-size=8192 将 Node 堆内存扩容至 8GB,可根据机器内存调整。
使用 && 串行执行,避免并行任务占用峰值过高的内存。
export NODE_OPTIONS="--max-old-space-size=8192" pnpm run build
node --max-old-space-size=8192 node_modules/vue-tsc/bin/vue-tsc.js --noEmit node --max-old-space-size=8192 node_modules/vite/bin/vite.js build
Node.js ≥ 18 在内存管理上更优化
升级 Vite / Webpack / vue-tsc,避免老版本插件内存泄漏
在 package.json 中固定如下脚本:
"scripts": { "build": "pnpm exec node --max-old-space-size=8192 vue-tsc --noEmit && pnpm exec node --max-old-space-size=8192 vite build", "build-only": "pnpm exec node --max-old-space-size=8192 vite build" }
优点:
直接在脚本里写死内存参数,避免 Jenkins / pnpm 环境变量传递失败
串行执行降低内存峰值
评论 0