我们的 React 应用程序配置为使用 CRA 脚本和 Bitbucket 管道构建和部署。
我们的大多数构建都无法运行
yarn build
并出现以下错误:
error Command failed with exit code 137.
这是一个内存不足的错误。
我们尝试将 GENERATE_SOURCEMAP=false 设置为部署环境变量,但这并没有解决问题https://create-react-app.dev/docs/advanced-configuration/.
我们还尝试通过运行以下命令为一个步骤设置可用的最大内存:
node --max-old-space-size=8192 scripts/build.js
增加到最大内存并没有解决问题。
这阻碍了我们的发展,我们不确定如何解决这个问题。
我们可以转向新的 CI/CD 服务,但这比预期的要多得多。
还有其他解决方案可以解决这个问题吗?
下面是
bitbucket-pipelines.yml
文件
image: node:14
definitions:
steps:
- step: &test
name: Test
script:
- yarn
- yarn test --detectOpenHandles --forceExit --changedSince $BITBUCKET_BRANCH
- step: &build
name: Build
size: 2x
script:
- yarn
- NODE_ENV=${BUILD_ENV} yarn build
artifacts:
- build/**
- step: &deploy_s3
name: Deploy to S3
script:
- pipe: atlassian/aws-s3-deploy:0.3.8
variables:
AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY
AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION
S3_BUCKET: $S3_BUCKET
LOCAL_PATH: "./build/"
ACL: 'public-read'
- step: &auto_merge_down
name: Auto Merge Down
script:
- ./autoMerge.sh stage || true
- ./autoMerge.sh dev || true
caches:
jest: /tmp/jest_*
node-dev: ./node_modules
node-stage: ./node_modules
node-release: ./node_modules
node-prod: ./node_modules
pipelines:
branches:
dev:
- parallel:
fail-fast: true
steps:
- step:
caches:
- node-dev
- jest
<<: *test
- step:
caches:
- node-dev
<<: *build
deployment: Dev Env
- step:
<<: *deploy_s3
deployment: Dev
stage:
- parallel:
fail-fast: true
steps:
- step:
caches:
- node-stage
- jest
<<: *test
- step:
caches:
- node-stage
<<: *build
deployment: Staging Env
- step:
<<: *deploy_s3
deployment: Staging
prod:
- parallel:
fail-fast: true
steps:
- step:
caches:
- node-prod
- jest
<<: *test
- step:
caches:
- node-prod
<<: *build
deployment: Production Env
- parallel:
steps:
- step:
<<: *deploy_s3
deployment: Production
- step:
<<: *auto_merge_down
事实证明,在我们的
terser-webpack-plugin
步骤中,yarn build
包正在运行 max workers for jest workers,导致内存不足错误https://www.npmjs.com/package/terser-webpack-plugin
通过从我们的
package.json
中删除该插件,它不再使构建失败,并且在构建过程中不再产生笑话工人。
您还可以在 TerserWebpackPlugin 的配置中将 paralell 设置为 false 以不产生工人。
这似乎不正确,导致我们的管道和其他人内存不足。
您可以使用带有
size: 4x
和 size: 8x
的更大的构建器,但只能与您的自托管管道运行器一起使用,这显然至少需要 16GB
https://support.atlassian.com/bitbucket-cloud/docs/step-options/#Size
definitions:
anchors:
- &build-step
name: Build
size: 4x
runs-on:
- 'self.hosted'
- 'my.custom.label'
script:
- yarn
- NODE_ENV=${BUILD_ENV} yarn build
artifacts:
- build/**
尝试添加以下定义:
definitions:
services:
docker:
memory: 4096
当我们遇到一些类似的问题时发现它:https://confluence.atlassian.com/bbkb/bitbucket-pipeline-execution-hangs-on-docker-build-step-1189503836.html
编辑: 对不起我的错,不,你不需要码头工人。请注意,分配的内存由步骤中的脚本和步骤中的任何服务共享,因此可能会删除并行并让 jest 在开始构建之前自行运行它可能会占用一些内存。如果您确实必须并行运行,至少通过按顺序运行测试 jest --runInBand 或通过较少数量的工人 jest --maxWorkers=4
来限制 jest 的影响