使用构建扫描标签进行临时的根本原因分析
目录
介绍
最近,我正在帮助一个 Android 团队调查一个难以重现的问题,该问题表现为非常耗时的编译和注解处理任务。他们的大部分构建只需要几分钟即可运行,但有时却需要长达 30 分钟!在这些情况下,构建扫描总是显示 Java 编译、Kotlin 编译或使用 Kapt 的注解处理的某种组合是罪魁祸首。该团队并不真正了解开发人员遇到此问题的频率以及在什么条件下发生。
Gradle Enterprise 尚未提供一种基于特定任务耗时来查找构建的方法。但是,自定义标签可以轻松地对构建进行分类,并查找在构建中可以检测到的任何条件的构建。通过标记所有过长的构建,我们可以使用 Gradle Enterprise 来了解其影响和严重性,以及它们发生的上下文,从而加速了调试。
为了实现这一点,我们只需在构建中添加类似以下代码片段的内容。
// root build.gradle
subprojects {
tasks.matching { t ->
t instanceof org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|| t instanceof org.jetbrains.kotlin.gradle.internal.KaptWithKotlincTask
|| t instanceof com.android.build.gradle.tasks.factory.AndroidJavaCompile
// || ... more ...
}.configureEach {
long start
doFirst {
start = System.currentTimeMillis()
}
doLast {
long duration = System.currentTimeMillis() - start
if (duration > 15 * 60 * 1000) { // 15 min
buildScan.tag "TooLong"
buildScan.value "TooLong", path
}
}
}
}
如果任何感兴趣的任务运行时间超过 15 分钟,此代码块将使用 “TooLong” 标记构建。此外,它将向构建添加一个自定义值,其中任务路径作为值,这样我们就能准确知道对于任何给定的构建,哪个或哪些任务是罪魁祸首。然后,标签或自定义值可以用作 Gradle Enterprise 中的搜索条件,以查找所有表现出该问题的构建。
这只是根据发生的情况标记构建的一个示例。用于标记构建的 API 与 Gradle 丰富而广泛的用于查询构建的 API 相结合,开辟了许多可能性。