我有一个托管在Gitlab上的模块化Java项目,带有一些Gitlab CI,每次我们推动一些更改时都会检查代码。问题是这个项目最近增长了很多,现在每个CI管道大约需要15分钟才能完成。
我注意到的是,代码基本上被编译了三次:在“构建”作业(运行mvn compile)期间,在“测试”作业(运行mvn test)期间,在“部署”作业(运行mvn install)期间。此外,测试运行了两次,一次是在"test“中,一次是在"deploy”中。
我试图通过将mvn test转换为mvn resources:testResources compiler:testCompile surefire:test并将mvn install转换为mvn jar:jar install来更改此行为,但现在测试因未知的类和包而失败(即使当我尝试逐个手动运行所有命令时也能正常工作),比如package my.project.package does not exist。
也许我正在尝试做一些Gitlab CI做不到的事情?也许还有更好的方法呢?
这是我的YAML文件:
image: myproject:latest
variables:
MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true -U"
cache:
key: new_cache
paths:
- .m2/repository/
- target/
build:
stage: build
tags:
- shell
script:
- mvn $MAVEN_CLI_OPTS clean compile
test:
stage: test
tags:
- shell
script:
- mvn $MAVEN_CLI_OPTS resources:testResources compiler:testCompile surefire:test
install:
stage: deploy
tags:
- shell
script:
- mvn $MAVEN_CLI_OPTS jar:jar install:install
only:
- master发布于 2021-02-03 23:33:29
显然,Gitlab CI的默认行为是在作业完成后删除它的结果,但有两个称为artifacts和dependencies的功能,允许用户保存一些数据并将其传输到其他作业。现在,该文件如下所示:
image: myproject:latest
variables:
MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true -U"
cache:
key: new_cache
paths:
- .m2/repository/
- frontend/node_modules/
build:
stage: build
tags:
- shell
script:
- mvn $MAVEN_CLI_OPTS clean compile
artifacts:
paths:
- backend/target/
test:
stage: test
tags:
- shell
script:
- mvn $MAVEN_CLI_OPTS resources:testResources compiler:testCompile surefire:test
dependencies:
- build
install:
stage: deploy
tags:
- shell
script:
- mvn $MAVEN_CLI_OPTS jar:jar install:install
dependencies:
- build
only:
- master现在,test和deploy作业可以访问target目录,并且无需重新编译所有内容即可运行。结合node_modules的缓存,它将执行时间减少到只有5分钟。
发布于 2021-02-03 02:41:27
最好的方法不是将Maven构建拆分为几个部分,而是直接运行
mvn clean install
或
mvn clean deploy
而不需要之前分别运行编译和测试阶段。
https://stackoverflow.com/questions/66015539
复制相似问题