Github Actions构建报JavaScript堆内存不足,本地修复方案无效
Node.js堆内存不足:Github Actions构建失败排查与解决
问题描述
构建库文件时频繁遇到内存不足错误,本地通过执行命令export NODE_OPTIONS="--max-old-space-size=8192"可解决该问题,但在Github Actions的workflow中,无论如何增大--max-old-space-size的值,构建特定组件时仍会失败,抛出以下错误日志:
<--- Last few GCs ---> [3238:0x62dbb30] 103974 ms: Scavenge (reduce) 2038.5 (2082.4) -> 2038.3 (2083.4) MB, 4.0 / 0.0 ms (average mu = 0.080, current mu = 0.002) allocation failure [3238:0x62dbb30] 105675 ms: Mark-sweep (reduce) 2039.2 (2083.4) -> 2036.6 (2083.1) MB, 1697.7 / 0.0 ms (average mu = 0.054, current mu = 0.014) allocation failure scavenge might not succeed <--- JS stacktrace ---> FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 1: 0xa89e60 node::Abort() [node] 2: 0x9ade29 node::FatalError(char const*, char const*) [node] 3: 0xc7583e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node] 4: 0xc75bb7 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node] 5: 0xe3f6d5 [node] 6: 0xe4027c [node] 7: 0xe4dc0b v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node] 8: 0xe5190c v8::internal::Heap::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node] 9: 0xe157da v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationType, v8::internal::AllocationOrigin) [node] 10: 0x116d4ab v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [node] 11: 0x15045f9 [node] Aborted (core dumped)
当前使用的workflow文件build.yml内容如下:
name: Build on: push: tags: - "v*" jobs: build: runs-on: ubuntu-latest strategy: matrix: node-version: [15.x] steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm ci - run: export NODE_OPTIONS="--max-old-space-size=16384" # tried to increase it more but all fails - run: npm run build
问题根源
Github Actions中每个run步骤都是独立的shell进程,前一个步骤里通过export设置的环境变量不会被后续步骤继承,因此单独的export NODE_OPTIONS步骤对后续的npm run build没有生效,构建时依然使用Node.js默认的内存限制。
解决方案
以下几种方法可以解决这个问题:
方法1:将环境变量设置与构建命令放在同一个run步骤
通过多行命令的方式,让环境变量和构建命令在同一个shell进程中执行:
- run: | export NODE_OPTIONS="--max-old-space-size=16384" npm run build
方法2:通过workflow的env字段全局或局部设置环境变量
可以在job级别设置环境变量,作用于整个job的所有步骤:
jobs: build: runs-on: ubuntu-latest env: NODE_OPTIONS: "--max-old-space-size=16384" strategy: matrix: node-version: [15.x] steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm run build
也可以仅在构建步骤设置环境变量:
- run: npm run build env: NODE_OPTIONS: "--max-old-space-size=16384"
方法3:直接在npm构建脚本中指定内存限制
修改项目根目录下的package.json,在build脚本中直接添加Node.js内存参数:
"scripts": { "build": "node --max-old-space-size=16384 ./path-to-your-build-script.js" }
内容的提问来源于stack exchange,提问作者Sheikhah Maasher
相关产品推荐
相关产品推荐

