【问题标题】:GitLab CI is failing due to maven-surefire-plugin with VM crashGitLab CI 因 maven-surefire-plugin 和 VM 崩溃而失败
【发布时间】:2019-04-05 04:33:30
【问题描述】:

我们有大约 10 个不同的应用程序,它们是带有 Groovy 的 Spring Boot 项目。

我们所有的项目都在所有开发人员工作站中正确构建,并且直到昨天它们都在正常运行,但是今天突然间它们都停止了,只在我们的 GitLab CI 管道中停止工作,并出现以下错误:

[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:37 min
[INFO] Finished at: 2018-10-31T17:49:11Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.21.0:test (default-test) on project ctg-oms-component: There are test failures.
[ERROR] 
[ERROR] Please refer to /builds/ctg-integrations/ctg-oms-component/target/surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date]-jvmRun[N].dump, [date].dumpstream and [date]-jvmRun[N].dumpstream.
[ERROR] ExecutionException The forked VM terminated without properly saying goodbye. VM crash or System.exit called?

我已经提取了使用我们的 GitLab CI 管道的相同 docker 映像,测试了构建项目并且一切正常。但是,该错误仅发生在 GitLab CI 中。

经过调查,看起来surefire 正在创建一个导致 GitLab CI docker 崩溃的分叉。为了解决这个问题,我在下面添加了显式配置以避免分叉 VM,这消除了上述错误。

<!-- Needed only for GitLab CI -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <forkCount>0</forkCount>
    </configuration>
</plugin>

你知道为什么会这样吗?是否有另一种方法来修复 GitLab CI 以避免此问题?我不太喜欢这种解决方法,因为它只是一种避免 GitLab CI 爆炸的方法,但不知道 Gitlab 在幕后如何处理 Docker。

【问题讨论】:

    标签: docker spring-boot gitlab gitlab-ci maven-surefire-plugin


    【解决方案1】:

    尝试将 &lt;useSystemClassLoader&gt;false&lt;/useSystemClassLoader&gt; 添加到您的 maven-surefire-plugin 配置中。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <useSystemClassLoader>false</useSystemClassLoader>
        </configuration>
    </plugin>
    

    【讨论】:

      【解决方案2】:

      当我在 gitlab-ci.yml 中使用 maven:3-jdk-8 进行 maven 构建时,我遇到了同样的问题。我把它改成了 maven:3-jdk-9 问题就消失了。

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题

        您可以在这里找到我在 gitlab 上为此创建的问题,并附有详细说明:https://gitlab.com/gitlab-org/gitlab-ce/issues/53734

        另外,我找到了一个“解决方法”。 maven:3.5.3-jdk-8 作为执行构建的 docker 镜像。或者,maven-surefire-plugin 上的 forkCount=0 属性。

        但这令人不安。构建如何突然开始失败?不知道,而且我认为我没有解决此问题所需的经验。

        到那时,也许这对你有帮助

        【讨论】:

        • 您的回答解决了我在设置 SonarQube 分析时遇到的问题,谢谢!将 forkCount 设置为 0 时要小心,因为它可能导致 JaCoCo 代码覆盖率为 0%:使用 maven-surefire-plugin 或 maven-failsafe-plugin 时,您不得使用 0 的 forkCount 或设置 forkMode永远不要,因为这会阻止使用 javaagent 集执行测试,并且不会记录覆盖率。 source
        【解决方案4】:

        这些问题与最新的 maven docker 映像有关。

        有一个开放的 github 问题,人们报告了同样的问题: https://github.com/carlossg/docker-maven/issues/90

        经过调查,我可以使用 alpine 版本解决问题,这让我无需添加 maven-surefire-plugin 解决方法。值得一提的是,使用 surefire 解决方法会带来另一个问题,例如 jacoco 之类的插件无法运行,因为它们需要 VM fork。

        因此,这些图像可以无缝运行(不需要万无一失的解决方法):

        • maven:3.3.9-jdk-8
        • maven:3.5.3-jdk-8
        • maven:3.5.4-jdk-8-alpine
        • maven:3.6.0-jdk-8-alpine

        但是,如果我们使用非 alpine 版本,问题仍然存在。

        【讨论】:

        • 实际上,maven docker 镜像的维护者会定期用更新的镜像标签覆盖旧的镜像标签,这会一次又一次地破坏“固定”构建。该问题来自JDK中的错误。唯一确定的解决方案是使用固定图像。我正在使用 maven-3.6.1 和 jdk 8 u212,只要图像仍然存在于 dockerhub 上,它就可以正常工作,sha256 图像 id 是maven@sha256:97c2ba42d7a8119de291aa944b5549fa032134cb0f403874b082100d68042307,可以在这里找到github.com/docker-library/repo-info/blob/…
        【解决方案5】:

        【讨论】:

          猜你喜欢
          • 2021-06-12
          • 2016-04-10
          • 1970-01-01
          • 2017-09-01
          • 2016-07-18
          • 1970-01-01
          • 2022-01-03
          • 2019-07-14
          • 2015-08-09
          相关资源
          最近更新 更多