如何在Bitbucket Pipelines中为Typescript/Webpack增加NodeJS堆大小(--max-old-space-size)?

5

我在一个无服务器/TypeScript项目中的webpack打包步骤遇到了内存问题。

我尝试过:

  • 'increase-memory-limit' npm package to no avail
  • Calling the following command from an npm run script

  • Calling the following command directly through bitbucket-pipelines.yml.

    node --max-old-space-size=4096 ./node_modules/.bin/serverless deploy
    

这条命令在本地运行良好,但在 Bitbucket 管道中出现以下输出:

    Serverless: Bundling with Webpack...

    internal/child_process.js:323
        throw errnoException(err, 'spawn');
        ^
    Error: spawn ENOMEM
        at _errnoException (util.js:1022:11)
        at ChildProcess.spawn (internal/child_process.js:323:11)
        at exports.spawn (child_process.js:502:9)
        at Object.exports.fork (child_process.js:103:10)
        at fork (/opt/atlassian/pipelines/agent/build/node_modules/worker-farm/lib/fork.js:17:36)
        at Farm.startChild (/opt/atlassian/pipelines/agent/build/node_modules/worker-farm/lib/farm.js:106:16)
        at Farm.processQueue (/opt/atlassian/pipelines/agent/build/node_modules/worker-farm/lib/farm.js:279:10)
        at Farm.<anonymous> (/opt/atlassian/pipelines/agent/build/node_modules/worker-farm/lib/farm.js:97:21)
        at ontimeout (timers.js:475:11)
        at tryOnTimeout (timers.js:310:5)
        at Timer.listOnTimeout (timers.js:270:5)
    npm ERR! code ELIFECYCLE
    npm ERR! errno 1
    npm ERR! platform-state-machine-import@0.0.2 deploy: `node --max-old-space-size=4096 ./node_modules/.bin/serverless deploy "--stage"    "feattsify" "--region" "us-east-1"`
    npm ERR! Exit status 1
    npm ERR! 
    npm ERR! Failed at the platform-state-machine-import@0.0.2 deploy script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
    npm ERR! A complete log of this run can be found in:
    npm ERR!     /root/.npm/_logs/2019-02-07T22_37_25_150Z-debug.log

我在谷歌和这里搜索了很多,试图找到Bitbucket是否有可以设置运行时参数等的环境变量,但似乎找不到任何与前面提到的NPM包无关的内容。

4个回答

6

我曾在一些Jenkins构建任务中遇到类似的问题。您可以使用NODE_OPTION环境变量来解决它:

NODE_OPTIONS=--max_old_space_size=4096

根据您的错误堆栈跟踪,看起来正在生成新的节点进程。 如果您可以设置此环境变量,Node将使用它将参数传递给任何新进程,因此对于在此处耗尽内存的生成的进程也会有效。

https://nodejs.org/dist/latest-v8.x/docs/api/cli.html#cli_node_options_options


我尝试将其导出到bitbucket-pipelines.yml中,也直接放入存储库变量中,但仍然无法工作-相同的错误。 但是,在本地它确实可以工作。 - Matt Cook
这对我有用,虽然我使用连字符版本 -> NODE_OPTIONS = -max-old-space-size = 4096 - dmbarreiro

1
定义固定的内存量可能会有些棘手,因为您将无法使用运行机器上可用的全部内存。
我编写了一个代码,以获取运行机器上的总内存,扣除400mb(用于其他服务器资源),并将其指定为节点内存限制。
  FREE=$(free -m);
  echo "FREE: ${FREE}"
  FREE_FINAL=$(echo "$FREE" | grep -F Mem:  | grep -o "[0-9]*" | grep -o -m1 "^[0-9]*")
  echo "FREE_FINAL: ${FREE_FINAL}"
  MEM_LIMIT=$(($FREE_FINAL-400))
  echo "MEM_LIMIT: ${MEM_LIMIT}"
  echo " - "

  export MEMORY_LIMIT="${MEM_LIMIT:=3500}";

  export NODE_OPTIONS="--max-old-space-size=${MEMORY_LIMIT}"
  echo "NODE_OPTIONS: ${NODE_OPTIONS}"

你可以适应自己的情况并将脚本的最大内存用于脚本,但也要遵守限制。
如果使用 docker,则可以将其添加到 entrypoint.sh 文件中(该文件将在构建时运行,但每次启动 docker 时也会运行)。

0

从您的启动命令中增加它,例如

 node --max-old-space-size=8192 server.js  

0

这个问题有两种解决方法。首先,出现ENOMEM错误是因为我需要更多的内存来运行Node进程,其次是因为我分配给Node进程的内存超过了Bitbucket环境中可用的内存(默认为4GB)。

选项1:

使用其他答案中的任何选项,并确保Bitbucket管道环境具有足够的内存 - 对我来说,这意味着将大小提高到2倍(请参见this link)。

选项2:

在webpack.config.js文件中添加“transpileOnly”标志,使用ts-loader作为转换器。这将跳过类型检查并在打包/部署时节省内存。警告:您仍应在构建时对项目进行类型检查。对我来说,这意味着在打包/部署之前运行tsc

rules: [
  // all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
  { 
    test: /\.tsx?$/, 
    loader: 'ts-loader',
    options: {
      transpileOnly: true
    }
  },
],

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接