为什么我在Gitlab CI/CD中找不到已配置的Maven缓存目录?
问题根因
1. 作业执行时序导致缓存被清理
GitLab CI作业默认执行顺序为:恢复缓存 → 拉取Git仓库代码。你的日志明确显示采用了clone全量拉取策略(日志输出Created fresh repository),该操作会清空$CI_PROJECT_DIR下所有不在Git版本控制内的文件/目录。你配置的缓存路径.m2/repository位于$CI_PROJECT_DIR下,缓存恢复后会被后续的全量克隆操作直接删除,因此script阶段无法找到对应目录。
2. 本地缓存局限性(潜在问题)
日志提示No URL provided, cache will not be downloaded from shared cache server,说明你未配置分布式缓存,缓存仅存储在当前运行作业的Runner节点本地。如果你的K8s集群部署了多副本GitLab Runner,后续作业调度到其他节点时会直接丢失历史缓存。
解决方案
方案1:修改Maven仓库路径到工作目录外(推荐)
调整Maven本地仓库路径到$CI_PROJECT_DIR之外,避免被Git拉取操作清理,修改配置如下:
variables: # 将maven仓库路径改到/cache目录下 MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=/cache/.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" .cache-m2: &cache-m2 cache: - key: "mavenRepo" paths: - /cache/.m2/repository
方案2:配置Git忽略缓存目录
保留原路径配置,新增Git清理规则,禁止删除.m2目录:
variables: # 新增该变量,告诉git clean忽略.m2目录 GIT_CLEAN_FLAGS: -ffdx -e .m2/ 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"
方案3:配置分布式缓存(可选)
给GitLab Runner配置S3、MinIO等分布式缓存后端,解决多Runner副本缓存无法共享的问题,所有节点均可读取同一份Maven依赖缓存。
内容的提问来源于stack exchange,提问作者Datz
相关产品推荐
相关产品推荐

