web-dev-qa-db-ja.com

Docker-> Maven-> Failsafe-> Surefireの起動フォークが失敗し、「フォークされたVMさよならを言わずに終了しました。VM crashまたはSystem.exitが呼び出されましたか? 」

タイトルどおり:私はコンテナ化されたJenkinsスレーブからMaven自動テストを実行しようとしていますが、これを1週間争った後、アイデアが不足しています。 4GのRAM=のAWSインスタンスではそのまま機能しますが、無制限(RAMおよびCPU))コンテナでは、以下のようなエラーで失敗します。 Failsafeプラグインのフォークを無効にすると実行されますが、これは今後のオプションではありません。

私はGoogleを使用して見つけたJava/Maven/Failsafe/Surefireオプションのすべての種類を試しましたが、うまくいきませんでした(グローバルJava -Xmxオプションとpom.xmlのプラグインごとに追加するなど)。

誰かがこのようにうまく実行したことがありますか?

これはもっと扱いやすいように思えますが、もし髪があれば頭からすべての髪を抜いたでしょう。私はまだ敗北を認める考えが好きではありません。助けてください!

これらは、失敗後にプラグインが作成するダンプです。

failsafe-summary.xml:

<?xml version="1.0" encoding="UTF-8"?>
<failsafe-summary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.Apache.org/surefire/maven-sure
fire-plugin/xsd/failsafe-summary.xsd" result="254" timeout="false">
    <completed>0</completed>
    <errors>0</errors>
    <failures>0</failures>
    <skipped>0</skipped>
    <failureMessage>org.Apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM cras
h or System.exit called?
Command was /bin/sh -c cd /var/lib/jenkins/workspace/ui_acceptance_test_chrome_docker_freestyle &amp;&amp; /usr/lib/jvm/Java-1.8-openjdk/jre/bin/ja
va -Dfile.encoding=UTF-8 -jar /var/lib/jenkins/workspace/ui_acceptance_test_chrome_docker_freestyle/target/surefire/surefirebooter81206735832436906
05.jar /var/lib/jenkins/workspace/ui_acceptance_test_chrome_docker_freestyle/target/surefire 2017-10-10T15-02-35_189-jvmRun1 surefire59539140137458
58339tmp surefire_03559885505222114015tmp
Error occurred in starting fork, check output in log
Process Exit Code: 1
       at org.Apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.Java:686)
       at org.Apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.Java:535)
       at org.Apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.Java:280)
       at org.Apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.Java:245)
       at org.Apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.Java:1124)
       at org.Apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.Java:954)
       at org.Apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.Java:832)
       at org.Apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.Java:134)
       at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:207)
       at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:153)
       at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:145)
       at org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.Java:116)
       at org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.Java:80)
       at org.Apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.Java:51)
       at org.Apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.Java:128)
       at org.Apache.maven.DefaultMaven.doExecute(DefaultMaven.Java:307)
       at org.Apache.maven.DefaultMaven.doExecute(DefaultMaven.Java:193)
       at org.Apache.maven.DefaultMaven.execute(DefaultMaven.Java:106)
       at org.Apache.maven.cli.MavenCli.execute(MavenCli.Java:863)
       at org.Apache.maven.cli.MavenCli.doMain(MavenCli.Java:288)
       at org.Apache.maven.cli.MavenCli.main(MavenCli.Java:199)
       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:289)
       at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.Java:229)
       at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.Java:415)
       at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.Java:356)
</failureMessage>
</failsafe-summary>

2017-10-10T15-02-35_189-jvmRun1.dump:

# Created on 2017-10-10T15:02:36.303
Killing self fork JVM. Maven process died.
13
mironq

Surefire 1.18.1にダウングレードしてみてください。私は今夜​​この問題に遭遇し、それに数時間を費やしましたが、これまでのところ、Surefireの新しいビルドがDockerの下で壊れる理由は簡単にはわかりません。

*更新*

Alpine Linuxで問題が発生していましたが、UbuntuまたはDebianベースのイメージを使用しているときはすべて問題ありませんでした。したがって、1.21内の何かが特定のオペレーティングシステムとの互換性を壊しています。

16
Derrick M

次の環境でも同じ問題が発生しました:Alpine 3.7のdockerイメージ、maven surefireプラグインバージョン2.21.0。

その根本的な原因は SUREFIRE-1422 で説明されています。surefireはps -pを使用してフォークされたプロセスをチェックしようとします。私のための解決策は、procpsを追加することでした:

RUN apk add --no-cache procps
9

久しぶりのことですが、FIXに1日以上かかった問題の解決策を追加します。

問題:DockerコンテナーのPaaSで統合テストを実行していますが、プロセスのメモリ割り当てを制御できません。デフォルトの動作は、フェイルセーフ/サーファーがJVMをフォークしてテストを実行することです。そのフォークされたJVMのメモリ割り当てを制御する方法を見つけることができず、「フォークの開始時にエラーが発生しました」というエラーでテストが失敗し続けました。また、「フォークされたVMは適切にさようならDockerを言わずに終了しました私が試していたフェイルセーフのバージョンに応じたログ。

ソリューション:私のソリューションは、JVMのフォークを無効にし、すべてのテストをメインのmavenプロセスと同じJVMで実行することでしたが、これは多くの人にとって理想的なソリューションですが、メインのMavenプロセスの最大メモリ割り当てのみを制御できる場合に機能します。

フォークを無効にするには、configでforkModeを設定するだけです。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <configuration>
        <forkCount>0</forkCount>
    </configuration>

.....

UPDATE:このソリューションを提供すると、フォークされたJVMにパラメータを渡すことができるようになるため、以前のソリューションは必要ありません。

Forked Test Executionのmaven docsから:

argLineプロパティを使用すると、メモリ設定など、フォークされたJVMプロセスに渡される追加のパラメーターを指定できます。メインのmavenプロセスからのシステムプロパティ変数は、フォークされたプロセスにも渡されます。さらに、要素systemPropertyVariablesを使用して、テストの実行中にシステムプロパティに追加する変数と値を指定できます。

https://maven.Apache.org/surefire/maven-failsafe-plugin/examples/fork-options-and-parallel-execution.html

8
Muji

まったく同じ問題が突然発生しましたが、CI/CDパイプライン(gitlab)でのみ発生しました。エラーメッセージは次のとおりです。

error occurred in starting fork, check output in log
Process Exit Code: 1
org.Apache.maven.surefire.booter.SurefireBooterForkException: 
The forked VM terminated without properly saying goodbye. VM crash or System.exit called?

OpenJDK Dockerイメージの新しいバージョンに関連していることが判明しました。

useSystemClassLoaderプロパティをfalseに設定すると、問題が解決しました:

   <plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire-plugin.version}</version>
    <configuration>
      <includes>
        <include>**/*Test.Java</include>
      </includes>
      <useSystemClassLoader>false</useSystemClassLoader>
    </configuration>
  </plugin>
4
Adrian Krebs

Surefire 2.21.0を使用してmaven:3.5.4-jdk-8内でビルドするときに同じ問題にぶつかるだけです。 surefireをアップグレードすることも助けにはなりませんでしたが、フォークを無効にすることでようやくうまくいきました。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>
    <configuration>
        <forkCount>0</forkCount>
    </configuration>
</plugin>
1
KI-Pirinha

Dockerを備えたAlpine(zenika/Alpine-maven)で確実なバージョン2.21.0のスプリングブートを使用しているときにも、同じ問題が発生しました。前述のように、2.18.1へのダウングレードはオプションであり、フォークされたvm終了の問題を解決する可能性がありますが、異なるslf4jバージョン間の非互換性に関する新しい問題を引き起こしました。それで、私たちは確実にバージョン2.22.1に明示的にアップグレードしました。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>
</plugin>
1