【问题标题】:How to increase NodeJS heap (--max-old-space-size) in Bitbucket Pipelines for Typescript/Webpack?如何在 Typescript/Webpack 的 Bitbucket 管道中增加 NodeJS 堆(--max-old-space-size)?
【发布时间】:2019-07-02 19:48:39
【问题描述】:

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

我试过了:

  • 'increase-memory-limit' npm 包无效
  • 从 npm 运行脚本调用以下命令

  • 直接通过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 包不相关的任何内容。

【问题讨论】:

    标签: node.js typescript serverless-framework bitbucket-pipelines


    【解决方案1】:

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

    NODE_OPTIONS=--max_old_space_size=4096
    

    从您的错误堆栈跟踪来看,似乎正在生成新的节点进程。 如果您可以设置此环境变量,节点将使用该变量将参数传递给任何新进程,以及此处内存不足的衍生进程。

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

    【讨论】:

    • 我尝试在 bitbucket-pipelines.yml 上导出它,并将其直接放入存储库变量中,但它仍然无法正常工作 - 同样的错误。但是,它确实在本地工作。
    • 这对我有用,虽然我使用的是连字符版本 -> NODE_OPTIONS=--max-old-space-size=4096
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      选项 1:

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

      选项 2:

      将 'transpileOnly' 标志添加到您的 webpack.config.js 文件中,使用 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
          }
        },
      ],
      

      【讨论】:

        【解决方案4】:

        定义一个固定的内存口可能很棘手,因为您不会使用运行器机器上可用的全部内存。

        我写了一段代码,获取runner机器上的总内存,减去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 启动时运行)。

        【讨论】:

          猜你喜欢
          • 2020-08-27
          • 1970-01-01
          • 1970-01-01
          • 2019-11-20
          • 2018-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多