使用 GitHub Actions 构建 Gradle 的更好方法

在 GitHub Actions 上运行 Gradle 构建

GitHub Actions 为托管在 GitHub 上的项目提供了一个方便且强大的 CI 平台。为了增强在 GitHub Actions 上构建 Gradle 项目的体验,Gradle 团队开发了 gradle-build-action。与 Gradle Build Scans™ 结合使用,gradle-build-action 在 Gradle 和 GitHub Actions 之间提供了深度集成,在使用 GitHub Actions 构建和测试 Gradle 项目时,提供了更轻松的设置和更好的体验。

gradle-build-action官方支持 的方式,用于在 GitHub Actions 中运行 Gradle 构建,负责为您的 GitHub Actions 工作流程准备和优化 Gradle。当应用于工作流程时,所有后续的 Gradle 调用都会被优化,使您只需在常规工作流程步骤中运行 ./gradlew build 即可。

gradle-build-action 提供的主要功能包括:

  • 下载并安装指定版本的 Gradle(如果需要)
  • 在工作流程运行之间保存和恢复 Gradle 用户主目录
  • 显示结果和 Gradle 构建扫描,用于在您的工作流程中执行的任何 Gradle 构建

下面将更详细地介绍每个功能。

使用 Gradle 构建操作

通过在现有 GitHub Actions 工作流程中添加一个设置步骤,可以轻松利用 gradle-build-action,类似于使用 actions/setup-java 操作为您的工作流程配置 JVM。

gh-actions1

有关如何在工作流程中使用 gradle-build-action 的详细信息,请查看 Gradle 构建工具文档README

Gradle 构建操作的功能

在工作流程运行之间保存和恢复 Gradle 用户主目录

Gradle 用户主目录会保留大量有价值的状态,这些状态可以加快后续的 Gradle 调用。下载的依赖项、编译的构建脚本、本地构建缓存和生成的 API jar 文件都存储在 Gradle 用户主目录中。

每个 GitHub Actions 作业都在一个新的构建运行器上运行,这意味着它将从一个空的 Gradle 用户主目录开始。幸运的是,GitHub Actions 提供了一个缓存机制,允许在运行一个作业后保存 Gradle 用户主目录状态,并在运行另一个作业之前恢复。这可以通过消除重新下载依赖项、重新生成 Gradle API jar 文件等的需要,大大减少运行 Gradle 构建所花费的时间。

然而,正确地进行这种缓存并不容易。很容易保存太多状态(很快就会填满 GitHub Actions 缓存),或者对缓存键的描述不足(导致重要的内容被遗漏)。

gradle-build-action 会为您处理细节,以作业特定方式保存和恢复 Gradle 用户主目录中的最重要的文件,同时提取公共文件并单独保存它们,以减少存储的条目中的冗余。 大部分行为是可配置和可调整的。 gradle-build-action 使用的保存/恢复策略(以及相关的配置选项)的详细信息将在以后的文章中介绍。

显示每次构建的结果和 Gradle 构建扫描

默认情况下,GitHub Actions 不会像其他一些 CI 平台那样与 Gradle 深度集成。 它不提供构建结果的高级视图,也不提供测试通过和失败的漂亮渲染显示。 相反,您需要检查日志以查找任何错误消息,并且测试报告需要保存为构建工件,这些工件可以下载以检查任何测试失败。

但是,通过使用 gradle-build-action 并将每个 Gradle 调用配置为发布构建扫描,您可以设置您的 GitHub Actions 工作流程以提供您期望的这些可用性功能。 gradle-build-action 会对所有 Gradle 构建调用进行检测,捕获执行的任务、构建结果以及任何生成的构建扫描的链接等详细信息。 链接的 Gradle 构建扫描提供了构建执行的完整视图,包括所有构建日志、完整的任务时间线、测试输出、解析的依赖项以及构建的性能特征。

gh-actions2

有关更多详细信息,请阅读有关 Google AndroidX 团队如何利用 gradle-build-action 和 Gradle 构建扫描 来帮助他们在 GitHub Actions CI 环境中更快地排查构建和测试失败。

使用指定的 Gradle 版本执行构建

我们建议大多数项目使用 Gradle Wrapper 来运行 Gradle,默认情况下,gradle-build-action 不会下载或安装 Gradle 分发版。 但是,在某些情况下,您可能希望使用不同版本的 Gradle 运行构建:例如,您想使用 Gradle 发布候选版本对构建进行冒烟测试,或者您想使用不同 Gradle 版本的矩阵测试插件示例。

为此,gradle-build-action 能够下载并安装任何版本的 Gradle。如果向操作提供“gradle-version”参数,它将下载(并缓存)Gradle 分发版压缩文件,安装它,并将其添加到 PATH。还支持“latest”、“release-candidate”和“nightly”之类的别名值。然后,在后续工作流程步骤中运行 gradle 时,将使用此安装的版本。

为什么要使用 gradle-build-action?

如果您熟悉 GitHub Actions,您可能想知道为什么您要使用 gradle-build-action,而不是简单地配置 actions/cacheactions/setup-java 来保存和恢复工作流程运行之间的 Gradle 依赖项。

我们认为 gradle-build-action 提供了实质性的优势:请查看 操作自述文件的这一部分。如果您还有问题,请随时在 https://github.com/gradle/gradle-build-action/issues 上提问。

在 Gradle 和 GitHub Actions 中获得更好的体验

gradle-build-action 提供了一种简单有效的方法来在 GitHub Actions 上运行 Gradle 构建,最大限度地利用 GitHub Actions 缓存,并提供有关每次 Gradle 执行的重要信息。当与免费的 Gradle Build Scans(或自托管的 Gradle Enterprise Build Scans)结合使用时,在 GitHub Actions 上运行 Gradle 构建比以往任何时候都更好。

讨论