【问题标题】:Maven build and tests very slow on DockerMaven 在 Docker 上的构建和测试速度非常慢
【发布时间】:2021-07-21 00:59:49
【问题描述】:

我正在尝试设置我的 Gitlab CI/CD 来为我的 Java/Maven/Spring Boot 应用程序编译和运行测试。 我已经设置了一个 Gitlab Runner 并创建了我的 .gitlab-ci.yml 并且一切正常,但是非常慢。 我为我的跑步者尝试了许多配置,但都没有成功。

所以我退后一步,尝试在本地机器上的 Docker 上运行测试。

直接在我的机器上运行的构建 + 测试需要 17 分钟。 在 docker 上运行的构建 + 测试耗时超过 1 小时。

我获得的最佳性能是使用这个 docker 命令:

docker run -it --rm --name comp2 --mount type=bind,source="C:/ProjetosJava/eaud",destination=/usr/src/mymaven -e MAVEN_OPTS='-Xdebug -Xnoagent -Djava.compiler=NONE -Xmx4096m -Xms1024m -XX:MaxPermSize=1024m -Dmaven.repo.local=.m2/repository -XX:+TieredCompilation -XX:TieredStopAtLevel=1' -w /usr/src/mymaven maven:3.3-jdk-8 /bin/bash

在 bash 里面我做了:

mvn -s .m2/settings.xml clean compile test

我需要在 docker 内部构建至少有一个关闭时间(17 分钟)。

【问题讨论】:

  • 我不知道为什么你的构建速度很慢(我猜,没有更多信息,没有人会知道),但我知道的是 clean compile test 表明你不知道Maven 生命周期。对于测试只需运行clean test
  • 还看到您将内存配置为 4 GiB 内存?真的需要吗?
  • 4gb 是一个尝试.. 我什么都试过了,但是构建起来比在本地机器上要慢....
  • @renanleandrof 抱歉,评论可能听起来有点傲慢。但是,您应该将clean compile test 更改为clean test
  • 构建的前 17 分钟时间很多。多少个 LoC?多少测试?多少个模块?测试需要多长时间?第二:一般来说,容器内的构建总是比裸机慢,因为您要添加多个层......此外,您还没有映射 docker 容器中的本地缓存,这意味着每个构建都会下载很多......为什么使用 Maven 3.3?而不是最近的?为什么在 Container 中设置如此巨大的内存设置?你的 Docker 守护进程支持吗?内存增强不会减少构建时间...

标签: java docker maven gitlab-ci gitlab-ci-runner


【解决方案1】:

发现问题了,是 Maven Surefire 插件。

默认情况下,surefire 将分叉 JVM,并且当它这样做时,它不会从 mvn 命令继承 JAVA_OPTS。

所以,我可以通过将这些配置配置到插件来减少构建时间:

             <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
                <configuration>
                    <systemPropertyVariables>
                        <java.awt.headless>true</java.awt.headless>
                    </systemPropertyVariables>
                    <argLine>-Xms256m -Xmx1024m -XX:MaxPermSize=512m -Xverify:none -XX:TieredStopAtLevel=1 -XX:-TieredCompilation</argLine>
                    <printSummary>false</printSummary>
                    <forkCount>0</forkCount>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>3.0.0-M5</version>
                    </dependency>
                </dependencies>
            </plugin>

秘诀是:argLine 与-Xverify:none -XX:TieredStopAtLevel=1 -XX:-TieredCompilationforkCount=0

【讨论】:

  • 我怀疑是否需要该依赖项,因为它是由对您的项目 (junit) 的适当依赖项自动完成的...而且您真的需要 1 GiB 进行单元测试吗?
猜你喜欢
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 2022-07-08
  • 2021-09-01
  • 1970-01-01
  • 2015-12-23
  • 2014-02-03
  • 1970-01-01
相关资源
最近更新 更多