第十九天:用 Gradle 做 Build Scan

对 Kotlin 这种编译式语言来说,为了方便每次更新後的编译工作,都会搭配 Gradle 这种自动建置工具使用。而 Gradle 在编译的过程中会经过很多手续,这些手续彼此串连相依,若是遇到错误或是有效能问题时,其实并不容易除错,排除问题也很花时间。因此 Gradle 官方提供了 Build Scan 这样的工具来满足这个需求。

Build Scan 可以在执行 Build 过程中一并扫描和纪录所有细节,并将分析报告及运行环境等资讯传送到 scans.gradle.com 这个服务。这是一个免费的线上服务,每当报告上传上去後,就会产生一个可被分享的 Build 纪录,其提供了更多细节资讯,解释了其中发生了什麽以及为什麽,协助开发者更了解 Build 的细节。

今天我们先用 Gradle 指令来试用一下这个服务,明天再将这个服务套用在 TeamCity 的建置流程上。

执行 Build Scan

要让 Gradle 执行 Build Scan 并将分析报告传送到 scans.gradle.com 非常简单,只要在执行 build 指令时,加上 --scan 参数即可:

$ ./gradlew build --scan

BUILD SUCCESSFUL in 11s
8 actionable tasks: 3 executed, 5 up-to-date

Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no] yes

Gradle Terms of Service accepted.

Publishing build scan...
https://gradle.com/s/g2n2rjorrbvhe

在执行的过程中,Gradle 会询问您是否同意将资料上传到 Gradle 主机,并同意他们的使用条款?这时请输入 yes,Build Scan 完成後,Gradle 会在画面上印出本次分析报告的浏览位置。

浏览 Build Scan 报告

打开浏览器输入 Build Scan 提供的 URL,Gradle Enterprise 会先请您输入 Email 来将这个 Build Scan 关联到这个 Email 帐号,设定完成後就会将开通後的连结寄给,请先去收信。

点选 Email 里的连结就会开发 Build Scan 完整的分析报告。

从画面上我们可以看到,Build Scan 从 Console Log、Timeline、Performance、Tests、Projects、Dependencies、Build dependencies、Plugins、Switches、Infrastructure 等不同面向提供详细的报告,比平常在终端机的输出多更多,而且很多都辅以图表呈现。若是在检测效能问题或是除错时,有这样的报告相信会很有帮助。

上传 Build 资料的疑虑

虽然 Build Scan 服务是免费的,但很多开发主管听到会有资料上传到第三方主机,而且这个资料还是内部专案建置过程的详细资料,不免有资料隐私及外泄的疑虑。

根据 Gradle 官方的说明,透过 Build Scan 上传的资料只能透过当下随机产生的连结来浏览,只要您没有随意散布,基本上不容易被其他人取得。而传送到 scans.gradle.com 的分析报告假如没有被浏览的话,3 个月後就会被自动删除。不过一旦 Build Scan 报告被浏览过,它就会被永远留存。当然,您可以在观看之後依照意愿将其删除,仍有一定的安全性。

当然,最终极的作法就是购买 Gradle Enterprise 方案罗!您可以把 Build Scan 服务架在公司内部,所有资料就只会上传到自己的主机也只能在内网浏览,这样就不会有资料隐私及外泄的疑虑了。另外,购买 Gradle Enterprise 的另一层意义也是支持 Gradle 团队能持续贡献资源在开发及维护 Gradle 专案上。所以若团队有余裕的话,购买 Enterprise 是支持开放原始码专案的最好方法。我们 JetBrains 在内部开发时也有购买 Gradle Enterprise,所有 Build Scan 都可以在内网主机上查到,非常方便。

参考资料


<<:  Basic NetSuite Customization Glossary

>>:  [Day 24] 资料产品在部署阶段的五个大坑

DAY26 学习30天的c++

cin成员函数 除了使用setw()函数设定输出格式外,还可用cin成员函数更改cin的预设输入格式...

[13th][Day20] http request header(下)

接续昨天 header 的部分: If-Modified-Since:只在最近有来源最近有异动时发送...

[Day14] 永丰shioaji API,期货篇

今天先测试一下永丰期货部分的api,再看看接下来可以做什麽。首先是之前抓股价k棒的函数,因为现在要抓...

JavaScript入门 Day10_有关数字的语法2

昨天讲了 Math.abs( ),今天来讲Math.max( ) 那他是什麽呢,来看看下面的 cod...

Day 15 - 神经网络(D)NN 到 卷积神经网络CNN (2)

另一个full connection 例子, 数字辨识:https://www.youtube.co...