You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:27:11