复合构建中的 Gradle 构建缓存

标签 gradle build gitlab

我正在使用 gradle 处理奇怪的行为构建缓存 复合构建 .
我有一个仓库,其中有 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:是模拟已成功构建(并启动),但不是应用程序。
    当我关闭构建缓存时,构建通过了。
    有什么想法可能导致问题吗?
    Example of build

    最佳答案

    您使用的是什么类型的 gitlab 执行器/运行器?

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

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

    关于复合构建中的 Gradle 构建缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54438080/

    相关文章:

    java - Gradle setupBuild 不转换 Maven pom.xml 文件

    java - Gradle:使构建版本可用于 Java

    gradle - Gradle每次刷新时都会再次下载所有依赖项

    java - Java + Jersey + Gradle-java.sql.SQLException:找不到合适的驱动程序

    java - Ionic 构建 Android 失败解析错误

    java - 使用maven和Jetty时的Web应用程序路径

    git - 无法通过SSH访问远程存储库(权限被拒绝(公钥))

    docker - kubectl 删除 secret registry.gitlab.com

    git - 可以重命名分支吗?

    java - 如何为每个jar从相同的源但不同的主类创建多个jar?