【发布时间】:2021-12-14 14:52:51
【问题描述】:
我有一个 Gitlab CI/CD 管道,其中有多个并行运行的作业,每个作业执行 mvn test package。
因为有很多依赖关系,所以我利用 Gitlabs 缓存功能来存储 .m2 文件夹:
cache:
key: "$CI_PROJECT_NAME"
paths:
- .m2/repository
我正在使用 CI_PROJECT_NAME,因为我希望缓存可用于所有分支中的所有作业。
它主要是有效的,在许多工作中我看到构建成功,然后是缓存的消息 已创建或已经是最新的:
Creating cache my-project-name...
.m2/repository: found 10142 matching files and directories
Archive is up to date!
Created cache
但在某些工作中,Maven 突然失败了:
355804 [ERROR] Failed to execute goal net.alchim31.maven:scala-maven-plugin:4.5.2:compile (default) on project spark: wrap: scala.reflect.internal.FatalError: Error accessing /builds/Kxs9HrJp/4/analytics/my-project-name/.m2/repository/org/apache/spark/spark-catalyst_2.12/3.1.1/spark-catalyst_2.12-3.1.1.jar: zip END header not found -> [Help 1]
缓存似乎以某种方式损坏。如果我再次执行相同的作业,它现在总是失败。如果我通过 UI 清除运行器缓存,相同的作业会再次成功运行,直到它在某个时候因另一个文件而失败。
我感觉并发运行是个问题,但我不知道为什么。 每个作业在开始时都会下载缓存的当前状态。 即使它不是最新的,maven 也会简单地下载缺少的库。 如果两个或多个作业尝试“同时”更新/上传缓存,则最后一个获胜并覆盖其他作业的缓存是可以的。
知道这里发生了什么吗?
【问题讨论】:
标签: maven gitlab-ci gitlab-ci-runner