使用构建扫描标签进行临时根本原因分析
目录
引言
最近,我正在帮助一个 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 相结合,带来了许多可能性。