我有一个Gitlab /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也会简单地下载缺少的库。如果两个或多个作业试图“同时”更新/上载缓存,最后一个作业可以赢得并覆盖其他任务的缓存。
知道这里发生了什么吗?
发布于 2021-12-14 15:18:44
我认为这可能与并发工作人员有关(同时读一遍写)--如果您只收到过一次错误,我可以假设它可能错误地连接了从运行程序到缓存位置的连接,但我更经常看到的是,问题可能是并发性。
尝试通过分支/提交哈希将您的密钥更改为更具体,然后再试一次.
cache:
key: $CI_COMMIT_REF_SLUG
paths:
- .m2/repository或者使用像S3这样的分布式位置,并启用版本控制.
https://stackoverflow.com/questions/70350951
复制相似问题