CircleCI构建时React Native Bundle卡顿挂起,SSH环境可绕过
yarn bundle-android超时问题排查与解决 问题背景
基于React Native 0.70.7、React 18.2.0、Fastlane 2.212.1搭建流程:通过CircleCI(使用cimg/android:2023.02.1-node镜像)调用Fastlane完成Android SDK构建,并推送至内部S3存储桶。执行Fastlane的staging lane时,在yarn bundle-android步骤卡顿挂起,默认10分钟超时终止,即使将超时限制提升至30分钟仍无法完成。
Fastfile的staging lane包含环境配置、bundle打包、Gradle构建、S3上传流程;CircleCI的config.yaml包含依赖安装、缓存、编译、Fastlane执行环节。
已做排查
- SSH进入CI容器后,修改
GEM_HOME并重新安装bundle,可跳过卡顿步骤,但正常CI构建仍会挂起 - 本地拉取相同Docker镜像执行全流程无异常,曾出现过137内存不足错误,但SSH环境未复现该问题
可能的解决方案
1. 给Node进程增加内存配额
yarn bundle-android本质是调用React Native的bundle命令,Node进程可能因内存不足进入假死状态(无输出但未退出),而非直接触发137 OOM kill。可通过以下方式调整:
- 在CircleCI步骤中直接指定Node内存:
node --max-old-space-size=8192 $(which yarn) bundle-android
- 或修改
package.json中的脚本:
"scripts": { "bundle-android": "node --max-old-space-size=8192 node_modules/react-native/cli.js bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res" }
2. 提升CircleCI资源配置
默认的CircleCI executor资源可能不足以支撑React Native打包,在config.yaml中调整资源等级:
jobs: build-android-sdk: machine: image: cimg/android:2023.02.1-node resource_class: large # 或根据需求选择xlarge steps: # 原有步骤...
3. 统一Fastlane的Gem环境
SSH中修改GEM_HOME能解决问题,说明CI环境默认的Gem配置可能导致依赖加载冲突。在CircleCI执行Fastlane前显式配置环境:
steps: # 原有依赖安装步骤... - run: name: Configure Gem Environment command: | export GEM_HOME="$HOME/.gem" gem install bundler bundle install --path vendor/bundle - run: bundle exec fastlane staging
4. 开启Verbose日志定位卡顿点
在Fastfile中给bundle步骤添加verbose输出,确认卡顿具体阶段:
lane :staging do # 其他环境配置步骤... sh "yarn bundle-android --verbose" # Gradle构建、S3上传步骤... end
同时在CircleCI构建设置中开启详细日志,排查是否有隐藏的错误输出被吞掉。
5. 刷新依赖缓存
检查CircleCI的缓存是否导致旧依赖冲突,尝试清理缓存后重新构建:
- 手动触发构建时勾选"Clear cache"选项
- 或修改config.yaml中的缓存key,强制刷新:
- restore_cache: keys: - v2-android-deps-{{ checksum "package.json" }}-{{ checksum "Gemfile.lock" }}-{{ epoch }}
内容的提问来源于stack exchange,提问作者oaowren

