使用构建扫描标签进行临时根本原因分析

最近,我正在帮助一个 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 中的搜索条件,以查找所有表现出该问题的构建。

Scans List

这只是根据发生的情况对构建进行标记的一个示例。用于标记构建的 API 与 Gradle 用于查询构建的丰富且广泛的 API 相结合,为我们提供了许多可能性。

进一步阅读

  • 有关构建扫描的更多信息,请参见 此处
  • 有关 Gradle Enterprise 的更多信息,请参见 此处
  • 有关构建扫描标签和值的更多信息,请参见 此处

讨论