Bitbucket流水线构建React应用内存不足:terser-webpack-plugin启动jest线程问题
构建React应用时terser-webpack-plugin启动jest-worker导致内存超限的问题解决
问题背景
我们团队使用Bitbucket Pipelines构建部署React应用,当前yarn build步骤因内存超限失败。查看内存使用日志发现,失败前terser-webpack-plugin启动了大量占用内存的jest-worker线程。需要说明的是:失败发生在构建步骤而非测试步骤,我们并未运行测试,且测试步骤已通过--forceExit确保测试进程不会残留。
内存使用日志如下:
Memory usage in megabytes: 8191 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 2388 728 ? Ss 13:33 0:00 /bin/sh -c exit $( (/usr/bin/mkfifo /opt/atlassian/pipelines/agent/tmp/build_result && /bin/cat /opt/atlassian/pipelines/agent/tmp/build_result) || /bin/echo 1) root 7 0.0 0.0 2388 96 ? S 13:33 0:00 /bin/sh -c exit $( (/usr/bin/mkfifo /opt/atlassian/pipelines/agent/tmp/build_result && /bin/cat /opt/atlassian/pipelines/agent/tmp/build_result) || /bin/echo 1) root 8 0.0 0.0 2300 744 ? S 13:33 0:00 /bin/cat /opt/atlassian/pipelines/agent/tmp/build_result root 10 0.0 0.0 2388 1408 ? Ss 13:34 0:00 /bin/sh /opt/atlassian/pipelines/agent/tmp/wrapperScript3495155942582447061.sh root 42 0.0 0.0 2388 728 ? S 13:35 0:00 /bin/sh /opt/atlassian/pipelines/agent/tmp/buildScript11364665287647037922.sh root 43 0.0 0.0 3736 2928 ? S 13:35 0:00 /bin/bash -i /opt/atlassian/pipelines/agent/tmp/bashScript12075457348243585276.sh root 44 0.0 0.0 3736 2220 ? S 13:35 0:00 /bin/bash -i /opt/atlassian/pipelines/agent/tmp/bashScript12075457348243585276.sh root 45 0.4 0.0 3736 2360 ? S 13:35 0:01 /bin/bash -i /opt/atlassian/pipelines/agent/tmp/bashScript12075457348243585276.sh root 149 0.0 0.1 775412 54716 ? Sl 13:35 0:00 node /opt/yarn-v1.22.19/bin/yarn.js build root 178 0.0 0.0 2400 676 ? S 13:35 0:00 /bin/sh -c node --max-old-space-size=4096 scripts/build.js root 179 85.0 11.3 4457236 3684220 ? Sl 13:35 5:05 /usr/local/bin/node --max-old-space-size=4096 scripts/build.js root 274 44.9 4.0 1857172 1315684 ? Sl 13:35 2:40 /usr/local/bin/node --max-old-space-size=2048 /opt/atlassian/pipelines/agent/build/node_modules/fork-ts-checker-webpack-plugin/lib/service.js root 9856 16.8 0.8 798832 274212 ? Sl 13:39 0:14 /usr/local/bin/node --max-old-space-size=4096 /opt/atlassian/pipelines/agent/build/node_modules/terser-webpack-plugin/node_modules/jest-worker/build/workers/processChild.js root 9868 12.2 0.2 629752 92040 ? Sl 13:39 0:10 /usr/local/bin/node --max-old-space-size=4096 /opt/atlassian/pipelines/agent/build/node_modules/terser-webpack-plugin/node_modules/jest-worker/build/workers/processChild.js root 9887 11.3 0.5 712008 182288 ? Sl 13:39 0:09 /usr/local/bin/node --max-old-space-size=4096 /opt/atlassian/pipelines/agent/build/node_modules/terser-webpack-plugin/node_modules/jest-worker/build/workers/processChild.js root 9906 11.7 0.2 626048 89324 ? Sl 13:39 0:10 /usr/local/bin/node --max-old-space-size=4096 /opt/atlassian/pipelines/agent/build/node_modules/terser-webpack-plugin/node_modules/jest-worker/build/workers/processChild.js root 9921 52.0 4.9 2104068 1605920 ? Rl 13:39 0:45 /usr/local/bin/node --max-old-space-size=4096 /opt/atlassian/pipelines/agent/build/node_modules/terser-webpack-plugin/node_modules/jest-worker/build/workers/processChild.js root 9936 11.5 0.2 628400 93228 ? Sl 13:39 0:10 /usr/local/bin/node --max-old-space-size=4096 /opt/atlassian/pipelines/agent/build/node_modules/terser-webpack-plugin/node_modules/jest-worker/build/workers/processChild.js root 9955 23.2 2.1 1214696 695708 ? Sl 13:39 0:20 /usr/local/bin/node --max-old-space-size=4096 /opt/atlassian/pipelines/agent/build/node_modules/terser-webpack-plugin/node_modules/jest-worker/build/workers/processChild.js root 12683 0.0 0.0 2296 752 ? S 13:41 0:00 sleep 0.1 root 12684 0.0 0.0 7640 2656 ? R 13:41 0:00 ps -aux Memory usage in megabytes:
问题解析与解决方案
为什么构建时会出现jest-worker?
别担心,terser-webpack-plugin根本没在运行测试。你看到的jest-worker是Jest团队抽离出来的通用多进程并行处理库,很多前端构建工具都会用它来实现并行任务、提升效率——这里它是用来并行压缩JS代码的,和测试完全没关系。
如何解决内存超限问题?
1. 限制terser的并发worker数量
默认情况下,terser会根据CPU核心数创建worker,Bitbucket容器的内存可能扛不住这么多进程。手动设置并发数:
const TerserPlugin = require('terser-webpack-plugin'); module.exports = { optimization: { minimizer: [ new TerserPlugin({ parallel: 2, // 按容器内存调整,比如1或2,避免过多进程抢占内存 }), ], }, };
2. 给单个worker设置内存上限
每个worker默认继承主进程的内存配置,你可以单独给worker分配更小的内存:
new TerserPlugin({ parallel: true, workerArgs: ['--max-old-space-size=1024'], // 每个worker最多用1G内存 }),
3. 禁用并行压缩(极端情况)
如果内存实在紧张,直接关掉并行,虽然构建会变慢,但能彻底避免内存问题:
new TerserPlugin({ parallel: false, }),
4. 升级Bitbucket Pipelines的实例规格
在bitbucket-pipelines.yml里指定更大内存的实例:
pipelines: default: - step: name: Build and Deploy size: 2x # 可选2x、4x等规格,根据团队权限选择 script: - yarn build
内容的提问来源于stack exchange,提问作者Drew Gallagher
相关产品推荐
相关产品推荐

