【问题标题】:Gradle build-cache in composite builds复合构建中的 Gradle 构建缓存
【发布时间】:2019-01-30 10:13:36
【问题描述】:

我正在处理使用 gradle build-cachecomposite builds 的奇怪行为。 我有一个仓库,其中有 3 个独立项目:

  • 应用程序
  • 模拟
  • 集成测试

集成测试包括 2 个构建 - 模拟和应用程序,并将这两个服务作为 java 应用程序启动(取决于两个项目的 jar 任务)。

在本地运行

在本地运行时,一切似乎都很好(也使用构建缓存),但在集成机器上,发生了一些奇怪的事情。

集成测试

我们用的是gitlab,pipiline还是挺简单的:

---|-- junit-mocks --|--- integration-tests
   |-- junit-app ----|

junit mocks 和 junit app 并行(带有构建缓存),下一阶段是 int-testing,其中从 build-cache 加载 app 和 mocks 的 java 编译。 (如附图所示)。

该错误只是一个结果,即未找到 Main 类(奇怪#1)。当我查看 jar 文件时,它确实是半空的,缺少很多类,但静态资源在那里。当我查看 gradle 的 build/classes 目录时,它完全是空的。好像缓存被命中了,但是类没有被复制?

奇怪#2:是模拟已成功构建(并启动),但不是应用程序。

当我关闭构建缓存时,构建通过了。

有什么可能导致问题的想法吗?

【问题讨论】:

    标签: gradle build gitlab


    【解决方案1】:

    你用的是什么类型的 gitlab executor/runner?

    您的缓存旨在在 gitlab 阶段之间共享,但是如果您使用 docker 执行器,每个阶段将使用新的 docker 映像/环境,因此除非您使用工件,否则您将无法在它们之间共享缓存.

    如果您使用的 shell 执行器在每次构建时都针对特定机器,那么只要缓存不在构建目录中,您就可以利用缓存,因为在管道中的每个 gitlab 阶段都会发生变化。

    【讨论】:

    • 为了回答你的问题,我根本不使用 docker image。 Gradle 缓存位于 gitlab runner 用户的主目录中(不在构建中)。我的问题不是缓存没有被命中,而是完全相反。看起来缓存键是正确的,但可能缓存值是错误的,我很好奇这怎么可能或可能导致这种情况。
    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2022-01-17
    • 2017-07-25
    • 2021-03-31
    • 2016-05-16
    • 2018-11-03
    相关资源
    最近更新 更多