如何在GitLab CI中运行Maven测试且不重复构建项目
问题原因
当前配置触发test阶段重复构建,核心是机制没有对齐:
- Maven生命周期为链式依赖设计,直接执行
mvn test时,会自动按顺序执行test阶段之前的所有前置流程(主源码编译、测试源码编译、资源处理等),默认检测到源码时间戳变更就会重新编译,不会直接复用提前上传的target目录产物。 - 现有build阶段仅执行
mvn compile,只完成了main目录下主源码的编译,test目录下的测试源码编译、测试资源拷贝步骤都未执行,test阶段运行时会自动补全所有缺失的前置流程,等同于重新构建。 - 未配置Maven本地仓库缓存,两个作业独立拉取依赖也会增加不必要的耗时。
修正后可用的GitLab CI配置
image: maven:3.8-jdk-11 # 全局缓存Maven本地依赖,避免两个作业重复下载依赖 cache: paths: - .m2/repository stages: - build - test build-job: stage: build script: # 执行到test-compile阶段:完成主源码、测试源码编译+所有资源拷贝,-DskipTests跳过测试用例执行,仅做构建 - mvn test-compile -DskipTests -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository artifacts: paths: - target/ expire_in: 1 hour # 构建产物仅给当前pipeline的test阶段使用,1小时后自动清理,节省存储 test-job: stage: test script: # 直接调用surefire插件的test目标,不触发生命周期前置编译流程,直接复用已有编译产物跑测试 - mvn surefire:test -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository
配置要点
- build阶段使用
mvn test-compile -DskipTests:覆盖所有构建所需步骤,同时完全不运行测试用例,符合build阶段仅构建不跑测试的定位。 - test阶段使用
mvn surefire:test:属于插件目标直接调用,不会触发Maven生命周期的链式前置执行,不会重新编译任何代码,完全复用build阶段产出的target目录下的文件,从根源避免重复构建。 - 统一指定Maven本地仓库路径为项目目录下的
.m2/repository,配合全局缓存实现两个作业的依赖复用,大幅缩短执行时间。 - 制品设置1小时过期,避免无用构建产物长期占用GitLab存储空间。
内容的提问来源于stack exchange,提问作者juuubbb
相关产品推荐
相关产品推荐

