ReactNative 0.59.x 在 CircleCI 上构建失败,退出值为137。

14

当我在CircleCI上为v0.59.x构建应用程序时,它会给我以下错误(在v0.57.8之前一直可以正常工作):

Translated:

在使用CircleCI为v0.59.x版本构建应用程序时,出现了以下错误(在v0.57.8版本之前正常工作):

[12:45:19]: ▸ Note: Some input files use or override a deprecated API.
[12:45:19]: ▸ Note: Recompile with -Xlint:deprecation for details.
[12:45:19]: ▸ > Task :react-native-svg:processReleaseJavaRes NO-SOURCE
[12:45:19]: ▸ > Task :react-native-svg:transformClassesAndResourcesWithPrepareIntermediateJarsForRelease
[12:45:19]: ▸ > Task :app:javaPreCompileQa
[12:45:44]: ▸ > Task :app:bundleQaJsAndAssets
[12:45:44]: ▸ warning: the transform cache was reset.
[12:46:00]: ▸ Loading dependency graph, done.
[12:46:19]: ▸ > Task :app:bundleQaJsAndAssets FAILED
[12:46:19]: ▸ FAILURE: Build failed with an exception.
[12:46:19]: ▸ * What went wrong:
[12:46:19]: ▸ Execution failed for task ':app:bundleQaJsAndAssets'.
[12:46:19]: ▸ > Process 'command 'node'' finished with non-zero exit value 137

我认为这与内存或Gradle/Java选项有关,因为在我的本地计算机上构建正常(./gradlew assembleRelease)。

Circle配置文件中有用的片段:

jobs:
  make-android:
    ...
    docker:
      - image: circleci/android:api-28-node8-alpha
    environment:
      TERM: dumb
      # JAVA_OPTS...
      # GRADLE_OPTS...
    steps:
      - checkout:
          path: *root_dir
      - attach_workspace:
          at: *root_dir
      - run:
          name: Build the app
          no_output_timeout: 30m
          command: bundle exec fastlane make

fastlane make 则是

gradle(task: "clean")
gradle(task: "assembleRelease")

我尝试了多个JAVA_OPTS和GRADE_OPTS,包括删除它们(在v0.57.8中没有_OPTS也可以正常工作)

JAVA_OPTS: "-Xms512m -Xmx4096m"
GRADLE_OPTS: -Xmx4096m -Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-Xms512m -Xmx4096m -XX:+HeapDumpOnOutOfMemoryError"
JAVA_OPTS: "-Xms512m -Xmx2048m"
GRADLE_OPTS: -Xmx2048m -Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError"
我也在 android/app/build.gradle 中有这个。
dexOptions {
    javaMaxHeapSize "2g"
    preDexLibraries false
}

关键日志行是 Task:app:bundleQaJsAndAssets FAILEDFAILURE: Build failed with an exception,但它们似乎没有提供太多细节。你能获取更多的日志吗?我知道它在你的开发机器上工作正常,但这可能是一个普通的环境问题,而不是特定于CircleCI的问题。我建议使用后构建SSH选项,这样你就可以手动运行它并深入挖掘 /var/log 文件夹(或任何其他可能写入日志的地方)。 - halfer
我在想你是否对内存问题的看法正确,因为这个错误似乎与内存修复同时提到。此错误在内存修复时被提及。 - halfer
哦,我想-Xmx4096m会失败。假设您使用的是默认容器大小,则整个系统的RAM限制为4G,因此您的JVM应该远小于此值。我建议您选择2G到3G之间的值。 - halfer
1
问题出在Metro,而不是Gradle。maxWorkers修复了它。 - Sourabh
太好了。感谢您添加答案! - halfer
2个回答

35

可能的原因之一是Metro捆绑程序使用的工作人员数量。

metro.config.js 中的maxWorkers: <# workers>设置为适当的值即可解决问题:

module.exports = {
  transformer: {
    getTransformOptions: async () => ({
      transform: {
        experimentalImportSupport: false,
        inlineRequires: false,
      },
    }),
  },
  maxWorkers: 2,
};

我改变的其他事情包括在 .circle/config.yml 中设置了 JAVA_OPTSGRADLE_OPTS

JAVA_OPTS: '-Xms512m -Xmx2g'
GRADLE_OPTS: '-Xmx3g -Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-Xmx2g -XX:+HeapDumpOnOutOfMemoryError"'

2
这对我有帮助。特别是最大工作线程数。谢谢! - bryan
最大工作线程解决了我的团队的问题,谢谢! - Josh Buchea
1
对我来说,需要将metro maxWorkers设置为1和这些GRADLE_OPTS结合起来:-Xmx3g -Dorg.gradle.workers.max=1 -Dorg.gradle.daemon=false -Dkotlin.compiler.execution.strategy=in-process -Dorg.gradle.jvmargs="-Xmx2g -XX:+HeapDumpOnOutOfMemoryError" - Dylan Nissley
你的CI似乎内存非常低。 - Sourabh

2

对于那些在新的React Native版本中遇到此问题的人。

大多数情况下,这与缓存有关,来自旧版本构建的缓存。我建议完全清除Gradle和Xcode的缓存:

Gradle:

// Stop daemon running:
cd android && ./gradlew --stop
// Clean cache using:
rm -rf ~/.gradle/caches/

xCode:

// remove old Pods folder
cd ios && rm -rf Pods
// install a clean version of it
pod install --clean-install

这是一个常见的Android内存问题,我在React Native版本0.66.x中也遇到了同样的问题。

对我而言,解决方法是限制Java堆大小。就像@Sourabh建议的那样。

我首先改变的是_JAVA_OPTIONS,将其设置为-Xmx3g。这个变量告诉Java堆大小不能超过3GB,这是默认中等资源类的75%。如果CI上还有其他作业正在运行,建议使用2GB。

第二个更改是同样改变GRADLE_OPTS,指向相同的3GB堆大小。此外,我使用选项Dkotlin.compiler.execution.strategy=in-process使Kotlin在相同的内存分配中运行。

我的两个更改:

_JAVA_OPTIONS: '-Xmx3g -Xmx2048m -XX:+UnlockExperimentalVMOptions -XX:+UseContainerSupport'
GRADLE_OPTS: '-Xmx3g -Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.compiler.execution.strategy=in-process'

它对我有效。 - Anthony

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