在 Teamcity CI 代理中重用 Gradle 缓存

Posted

技术标签:

【中文标题】在 Teamcity CI 代理中重用 Gradle 缓存【英文标题】:Reuse Gradle cache in Teamcity CI agents 【发布时间】:2020-08-02 22:37:48 【问题描述】:

鉴于我有多个构建基于 Gradle 5.X 的应用程序的代理,我想开始在所有代理之间缓存 Gradle 依赖项。

我尝试共享 .gradle 文件夹,但是当我尝试在 2 个代理上运行相同的构建时,其中一个失败:

Caused by: org.gradle.api.UncheckedIOException: 

Failed to create parent directory '/home/buildagent/.gradle/caches/5.0' 

when creating directory '/home/buildagent/.gradle/caches/5.0/generated-gradle-jars'

如何在 Teamcity 代理之间共享依赖项?

是否有支持 Gradle 5 及更高版本的通用解决方案?

我在 Gradle 6.x documentation 中找到了这个,但我在 5.x 文档中没有找到任何内容。

【问题讨论】:

sharemounted network share 或缓存副本?两个代理上的路径 (/home/buildagent/.gradle) 是否相同? @thokuest 挂载的网络共享在 VM 级别上挂载到多个代理 【参考方案1】:

我不能说你得到的异常的根本原因是什么,因为消息非常稀疏。我只能说,对于 Gradle 5,没有内置的解决方案可以通过网络共享本地缓存。您提到的copy and reuse the cache 功能已在 Gradle 6.1 中引入,但存在一些限制:

主要用于将内容复制到其他机器,可能具有不同的目录结构(缓存重定位)。 仅支持模块缓存 ($GRADLE_HOME/caches/modules-<version>) 网络共享很可能只能作为read-only dependency cache 使用。

那么,适用于 Gradle 5 和 6 的便携式解决方案是什么?根据最初介绍缓存可重用性的票(Make dependency caches relocateable #1338):

    复制文件夹,而不是网络安装。目录结构必须在不同机器之间保持一致。 使用您的依赖项装载以前导出的存储库:

    编写一个 Gradle 任务,从您的依赖项创建一个文件存储库并将该文件存储库打包。然后在您的构建中添加“如果该文件存储库存在,请使用它”的逻辑。

    (来自this comment)

【讨论】:

以上是关于在 Teamcity CI 代理中重用 Gradle 缓存的主要内容,如果未能解决你的问题,请参考以下文章

如何让 SpecUnit 在 TeamCity CI 构建中运行

TeamCity VS Jenkins:选择正确的CI / CD工具

Teamcity - 代理配置不兼容

如何配置 TeamCity 构建代理以通过 SOCKS 代理使用 git 和 git:// 协议?

Docker最全教程之使用TeamCity来完成内部CICD流程(十六)

TeamCity 代理错误“未能对代理执行结帐”