Gradle 引入构建审视(Build Scans)功能

阅读数:2712 2017 年 1 月 3 日

话题:JavaDevOps语言 & 开发架构

在今年早些时候举办的Gradle 峰会上,Gradle 团队在发布 Gradle 构建工具3.0 版本的同时,引入Gradle 云服务(Gradle Cloud Services)。该服务“通过为 Gradle 构建工具增加新功能,并从新的角度分析你或你团队项目构建的过程,来提升自动化构建的效率和生产力”。其中第一个提供的云服务是构建审视(build scans)功能。

在 Gradle构建审视功能用户手册中是这样定义的:

构建审视是用于开发和维护 Gradle 构建的重要工具。它为你提供了构建的详细信息,并为你识别构建环境、依赖或性能上存在的问题,同时可以帮你更全面地理解并提升构建过程,也便于与他人的合作。

在 Gradle 构建运行时,构建审视插件会抓取数据,并将数据传送到构建审视服务端。同时返回一个可被共享的链接,内部包含有用的构建信息。这些信息包含两大类:

  • 环境信息,包括操作系统、Java 版本和时区
  • 构建相关信息,包含使用的插件、任务、测试以及依赖信息

但它不会记录项目的源码和其 artifacts,比如 JAR 包。

要为一个现存的 Gradle 项目增加构建审视功能,需要在 build.gradle 文件中增加如下配置:

plugins {
        id 'com.gradle.build-scan' version '1.3'
        id 'java'
}
    buildScan {
        licenseAgreementUrl = 'https://gradle.com/terms-of-service'
        licenseAgree = 'yes'
        tag 'SAMPLE'
        link 'GitHub','https://github.com/gradle/gradle-build-scan-quickstart'
    }

构建项目时,在命令行中增加 -Dscan 开关,就会触发构建审视:

$ gradle build -Dscan

在一系列简单的激活操作后,项目的构建信息就可以在线被查看了,还可以通过永久链接分享给其他开发者。这使开发者之间可以互相协作,并更快地解决问题或评估构建的性能。

如果一个项目在单元测试阶段失败或源码存在错误,构建审视的结果会像如下例子所示:

相反,如果项目通过了全部单元测试,且构建成功,则构建审视的结果会像下面的例子所示:

在以上任意情况下,都可以交互式地查看详细信息。其中还列出了各部分的构建耗时,用户可以使用这些信息来监控其性能。

在 GitHub 上可以找到完整的示例项目

诸多知名开源项目,如HibernateJUnit 5Ratpack,在开发各自项目时都使用上了 Gradle 的构建审视功能。

InfoQ 就 Gradle、Gradle 云服务和构建审视功能,专访 Gradle 市场主管Chris Beams

InfoQ:能介绍一下您目前在 Gradle 的职位么?

Beams:我在 Gradle 公司管理市场方面的工作。在此之前,我是一名 Gradle 构建工具团队的首席工程师。

InfoQ:从现状看来 Gradle 正与MavenAntPants等其他构建工具拉开差距,比如引入 Gradle 守护进程(Gradle daemon)、新的 Gradle 云服务和构建审视等。您期望其他的工具也实现这些特性么?

Beams:不太可能。就 Gradle 守护进程而言,它是我们提炼了多年工作经验的产物。并不是其他工具简单说一句“我也可以支持该功能”就能轻松实现的,至少无法达到适用于生产环境的水平。但是 Bazel 工具就另当别论了,它和 Gradle 守护进程一样采用了客户端、服务端模式。

而 Gradle 云服务,包括其中的构建审视功能,就远远超越了传统的构建工具特性。它是我们大规模自动化构建平台的一部分。这个构建平台是一个耗资巨大的项目,这也意味着,如果背后没有一家像我们这样致力于自动化构建,并在这方面作出巨大投资的公司来支持,不太可能实现这个特性。

InfoQ:您认为是什么因素使得 Gradle 超越其他构建工具?

Beams:有诸多因素造就了 Gradle 今天的与众不同。当然,其中一大因素就是它所拥有的一系列特性。从 Gradle 的原创特性,如增量构建(incremental builds),到全新的杀手级特性,如混合构建(composite builds),我们认为这些特性是 Gradle 成功从与诸多其他构建工具的竞争中脱颖而出的一大因素。你可以在https://gradle.org/maven_vs_gradle上找到详尽的 Gradle 特性列表,以及各特性与 Maven 的对比。

另一个因素是 Gradle 构建工具日趋完善的通用性。Gradle 是使用 Java 语言实现的,并扎根于基于 Java 虚拟机的项目上,但是如今 Gradle 支持构建不同语言和生态系统的项目,其中包括 C、C++ 及 Android。还有 LinkedIn 最近贡献的 PyGradle 插件,为 Gradle 增加了对 Python 项目的支持。Gradle 正成为第一个真正的通用构建工具,这对我们来说非常重要,因为这意味着各种形式和规模的语言社区,甚至是目前尚不存在的,都可以把 Gradle 作为高级自动化构建的基础,而不用重新创建自己的构建工具,从而能更快地发展语言本身。

Gradle 在使用率上也胜过其他工具。我们见证了 Gradle 一直以来稳定的下载增幅,目前我们平均每月有 250 万的下载量。GitHub 上还有数千使用 Gradle 构建的项目,同时,根据最近上线的 GitHub Archive 的数据,我们得知,大家在新建基于 Java 虚拟机的项目时,更倾向于使用 Gradle。Gradle 的插件生态系统也正蓬勃发展,现在在 Gradle 的插件门户页面上已经提供了上千个插件,这也意味着用户几乎所有的集成或构建需求都可以找到对应的插件。

我们不仅自豪于 Gradle 的下载量、项目数和用户量,我们更欣喜地看到,全世界许多非常受推崇的科技公司也在选择使用 Gradle,而且是以非常公开的形式。细想 Netflix 备受瞩目的Gradle 插件集合 Nebula,LinkedIn 频繁的Gradle 会谈以及 Google 采用Gradle 构建 Android 项目,它们选择使用 Gradle 的原因正是其另一个独特特性:极度灵活性。Gradle 可以满足它们极具挑战的自动化构建需求,因为 Gradle 认为,从根本上来说,项目的构建与你所构建的软件产品或服务的其他部分一样,都是代码,它们之间没有任何差别。事实上,Gradle 也正是一个自动化软件生产的类库及框架。

最后还有一点,Gradle 背后有一家专注于自动化构建且资金充裕的公司支持着。这也意味着我们可以聘请 30 多名工程师每日专注于改善 Gradle,使其变得最好。而大部分其他工具并没有这个优势,这自然也就限制了它们的发展。

InfoQ:已经有HibernateJUnit 5等项目在使用 Gradle 的构建审视,您期望其他知名开源项目也在开发中使用构建审视这个功能么?

Beams:这值得拭目以待!我们很高兴地看到整个社区,包括各开源项目维护者和用户,对构建审视功能的反应。构建审视的好处是每个人可以在任何时刻创建它,并分享给任何人。我们认为公开的构建审视为用户在需要解释 Gradle 构建的具体过程时提供了便利,比如在 Stack Overflow 或 GitHub 上描述问题时,以及在与同事之间的交流中。欢迎大家都来尝试一下构建审视,构建审视功能用户手册是用于起步的绝佳教程。

同时我们也很高兴地看到大家对 Gradle Enterprise 的兴趣,这是一个 Gradle 云服务的私有版。它提供了公共构建审视服务的所有功能,同时包含了一些额外的管理特性,这些特性会为团队,尤其是大型团队,带来巨大帮助。读者可以从https://gradle.com/enterprise上获得更多信息。

InfoQ:您能简单介绍下 Gradle 接下来的目标么?

Beams:2016 年是我们高产的一年,我们实现了 Gradle 云服务,支持了混合构建,并在提升各种规模项目的构建性能方面做了巨大改进。

但是我们更期待 2017 将要发生的变化。一个值得关注的工作是,我们正在创建独立的以任务为中心的帮助文档,为新老用户找出最佳方法来解决 Gradle 自动化构建中遇到的问题。

我们也将继续在诸多前沿领域尽可能地优化构建性能。17 年年初,我们会发布 Gradle 第一版任务输出缓存,它支持交叉构建,并提供跨机器缓存,缓存中会保存中间构建文件并可被重用于其他机器上的其他构建。我们已经在和全球一些大型科技公司的交流中了解到这个先进的缓存技术所将产生的巨大改变,我们迫不及待地期望大家能用上这个功能!

我们也将自动化分离 Gradle 所管理的依赖类库中的 API 及其实现。这样分离可以避免类库使用者在类库产生的 API(更准确地说是 ABI(应用程序二进制接口))没有发生变化时,不必要的编译,从而进一步提升构建性能。

在 2017 年初,我们还会发行 1.0 版 Gradle Kotlin 脚本,它将提供一种类型安全且对集成开发环境(IDE)极度友好的方式来编写 Gradle 构建脚本。

我们还有更多的计划,但是这里先不透露。谢谢今天的访谈!

Chris Beams 是 Gradle 公司的市场主管,也是一位资深的开源工具开发者。在就职于 Gradle 之前,他是一名 Spring Framework 开发组成员。

查看英文原文:Introducing Gradle Build Scans