首页 > 解决方案 > Failsafe 插件在 CI 上随机崩溃

问题描述

我正在使用CircleCI在多模块应用程序中运行 Maven 测试。有一些针对 servlet 的集成测试是从本地 Jetty 服务器开始的。这些测试有时仅在 CI 上随机崩溃(在本地机器和其他开发人员机器上都可以),错误是:

Please refer to /root/project/project-name/target/failsafe-reports for the individual test results.
Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
Command was /bin/sh -c cd /root/project/project-name && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -javaagent:/root/.m2/repository/org/jacoco/org.jacoco.agent/0.8.1/org.jacoco.agent-0.8.1-runtime.jar=destfile=/root/project/project-name/target/jacoco-it.exec,output=file -jar /root/project/project-name/target/surefire/surefirebooter1161440693218570841.jar /root/project/project-name/target/surefire 2019-12-10T08-45-37_373-jvmRun1 surefire5250431631797135748tmp surefire_19208522219992515288tmp
Error occurred in starting fork, check output in log
Process Exit Code: 137
Crashed tests:
com.project.name.servlet.InviteServletITCase
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:670)
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:283)
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:246)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1161)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1002)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:848)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:956)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)

崩溃后我找到了dumpstream文件./project-name/target/failsafe-reports/2019-12-10T08-45-37_373.dumpstream

# Created at 2019-12-10T08:46:59.803
Killed

Java版本是:

openjdk version "1.8.0_232-ea"
OpenJDK Runtime Environment (build 1.8.0_232-ea-8u232-b09-0ubuntu1-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)

我试图应用这个类似的答案:https ://stackoverflow.com/a/33757854/1723695 但它在这里不相关,因为MaxPermSize选项已过时并且在 Java8 中将被忽略,并且工作机器有足够的内存来运行测试(测试不会消耗很多内存,8Gb绰绰有余):

$ java -XX:+PrintFlagsFinal -version | grep -i maxheapsize
uintx MaxHeapSize              := 18440257536        {product}

故障安全插件配置pom.xml为:

        <plugin>
          <artifactId>maven-failsafe-plugin</artifactId>
          <groupId>org.apache.maven.plugins</groupId>
          <version>3.0.0-M3</version>
          <configuration>
            <failIfNoSpecifiedTests>false</failIfNoSpecifiedTests>
            <runOrder>random</runOrder>
            <trimStackTrace>false</trimStackTrace>
            <systemPropertyVariables>
              <!-- some props for tests -->
            </systemPropertyVariables>
          </configuration>
        </plugin>

失败的测试总是不同的,我没有看到同一个测试失败了两次。

标签: javamavenmaven-failsafe-plugin

解决方案


推荐阅读