【问题标题】:Gitlab Runner Cache gets corruptedGitlab Runner Cache 损坏
【发布时间】: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


    【解决方案1】:

    我认为这可能与并发工作人员有关(可能同时读过写)如果您只收到一次错误,我可以假设它可能是从运行器到缓存位置的错误连接,但我'我经常看到它,问题可能是并发性。

    尝试通过分支/提交哈希将您的密钥更改为更具体,然后重试...

    cache:
      key: $CI_COMMIT_REF_SLUG
      paths:
        - .m2/repository
    

    或者使用启用了版本控制的分布式位置(如 S3)...

    【讨论】:

    • 谢谢。更改密钥将不起作用,所有作业都在同一管道中,因此它们共享相同的分支并提交。对于这项工作,我们目前使用具有分布式缓存的单个运行器,但我必须检查使用的是哪种存储。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2018-04-27
    • 2019-09-03
    • 1970-01-01
    相关资源
    最近更新 更多