Skip to content

Commit d372470

Browse files
nav-navSpace Team
authored and
Space Team
committed
Don't get BuildScanExtension when buildScan report is disabled
#KT-59589: Fixed (cherry picked from commit ea8b482)
1 parent 0ec7678 commit d372470

File tree

3 files changed

+62
-30
lines changed

3 files changed

+62
-30
lines changed

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/BuildFlowService.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import org.gradle.util.GradleVersion
1919
import org.jetbrains.kotlin.gradle.plugin.BuildEventsListenerRegistryHolder
2020
import org.jetbrains.kotlin.gradle.plugin.StatisticsBuildFlowManager
2121
import org.jetbrains.kotlin.gradle.plugin.internal.isProjectIsolationEnabled
22+
import org.jetbrains.kotlin.gradle.report.BuildReportType
23+
import org.jetbrains.kotlin.gradle.report.reportingSettings
2224
import org.jetbrains.kotlin.gradle.utils.isConfigurationCacheAvailable
2325
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
2426
import org.jetbrains.kotlin.statistics.metrics.IStatisticsValuesConsumer
@@ -56,6 +58,7 @@ internal abstract class BuildFlowService : BuildService<BuildFlowService.Paramet
5658
}
5759

5860
val fusStatisticsAvailable = fusStatisticsAvailable(project.gradle)
61+
val buildScanReportEnabled = reportingSettings(project).buildReportOutputs.contains(BuildReportType.BUILD_SCAN)
5962

6063
//Workaround for known issues for Gradle 8+: https://github.com/gradle/gradle/issues/24887:
6164
// when this OperationCompletionListener is called services can be already closed for Gradle 8,
@@ -80,7 +83,7 @@ internal abstract class BuildFlowService : BuildService<BuildFlowService.Paramet
8083
else -> StatisticsBuildFlowManager.getInstance(project).subscribeForBuildResult()
8184
}
8285
}
83-
if (GradleVersion.current().baseVersion >= GradleVersion.version("8.1")) {
86+
if (buildScanReportEnabled && GradleVersion.current().baseVersion >= GradleVersion.version("8.1")) {
8487
StatisticsBuildFlowManager.getInstance(project).subscribeForBuildScan(project)
8588
}
8689
}

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildMetricsService.kt

+44-28
Original file line numberDiff line numberDiff line change
@@ -231,44 +231,60 @@ abstract class BuildMetricsService : BuildService<BuildMetricsService.Parameters
231231
}
232232

233233
private fun subscribeForTaskEvents(project: Project, buildMetricServiceProvider: Provider<BuildMetricsService>) {
234-
// BuildScanExtension cant be parameter nor BuildService's field
235-
val buildScanExtension = project.rootProject.extensions.findByName("buildScan")
236-
val buildScan = buildScanExtension?.let { BuildScanExtensionHolder(it) }
237-
val buildMetricService = buildMetricServiceProvider.get()
238-
val buildScanReportSettings = buildMetricService.parameters.reportingSettings.orNull?.buildScanReportSettings
234+
val buildScanHolder = initBuildScanExtensionHolder(project, buildMetricServiceProvider)
235+
if (buildScanHolder != null) {
236+
subscribeForTaskEventsForBuildScan(project, buildMetricServiceProvider, buildScanHolder)
237+
}
238+
239239
val gradle80withBuildScanReport =
240-
GradleVersion.current().baseVersion == GradleVersion.version("8.0") && buildScanReportSettings != null && buildScan != null
240+
GradleVersion.current().baseVersion == GradleVersion.version("8.0") && buildScanHolder != null
241241

242242
if (!gradle80withBuildScanReport) {
243243
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(buildMetricServiceProvider)
244244
}
245+
}
245246

247+
private fun initBuildScanExtensionHolder(
248+
project: Project,
249+
buildMetricServiceProvider: Provider<BuildMetricsService>,
250+
): BuildScanExtensionHolder? {
251+
val buildScanReportSettings = buildMetricServiceProvider.get().parameters.reportingSettings.orNull?.buildScanReportSettings
246252
if (buildScanReportSettings != null) {
247-
buildScan?.also { buildScanHolder ->
248-
when {
249-
GradleVersion.current().baseVersion < GradleVersion.version("8.0") -> {
250-
buildScanHolder.buildScan.buildFinished {
251-
buildMetricServiceProvider.map {it.addBuildScanReport(buildScan)}.get()
253+
// BuildScanExtension cant be parameter nor BuildService's field
254+
val buildScanExtension = project.rootProject.extensions.findByName("buildScan")
255+
return buildScanExtension?.let { BuildScanExtensionHolder(it) }
256+
}
257+
return null
258+
}
259+
260+
private fun subscribeForTaskEventsForBuildScan(
261+
project: Project,
262+
buildMetricServiceProvider: Provider<BuildMetricsService>,
263+
buildScanHolder: BuildScanExtensionHolder
264+
) {
265+
when {
266+
GradleVersion.current().baseVersion < GradleVersion.version("8.0") -> {
267+
buildScanHolder.buildScan.buildFinished {
268+
buildMetricServiceProvider.map { it.addBuildScanReport(buildScanHolder) }.get()
269+
}
270+
}
271+
GradleVersion.current().baseVersion < GradleVersion.version("8.1") -> {
272+
val buildMetricService = buildMetricServiceProvider.get()
273+
buildMetricService.buildReportService.initBuildScanTags(buildScanHolder, buildMetricService.parameters.label.orNull)
274+
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(project.provider {
275+
OperationCompletionListener { event ->
276+
if (event is TaskFinishEvent) {
277+
val buildOperation = buildMetricService.updateBuildOperationRecord(event)
278+
val buildParameters = buildMetricService.parameters.toBuildReportParameters()
279+
val buildReportService = buildMetricServiceProvider.map { it.buildReportService }.get()
280+
buildReportService.addBuildScanReport(event, buildOperation, buildParameters, buildScanHolder)
281+
buildReportService.onFinish(event, buildOperation, buildParameters)
252282
}
253283
}
254-
GradleVersion.current().baseVersion < GradleVersion.version("8.1") -> {
255-
buildMetricService.buildReportService.initBuildScanTags(buildScan, buildMetricService.parameters.label.orNull)
256-
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(project.provider {
257-
OperationCompletionListener { event ->
258-
if (event is TaskFinishEvent) {
259-
val buildOperation = buildMetricService.updateBuildOperationRecord(event)
260-
val buildParameters = buildMetricService.parameters.toBuildReportParameters()
261-
val buildReportService = buildMetricServiceProvider.map { it.buildReportService }.get()
262-
buildReportService.addBuildScanReport(event, buildOperation, buildParameters, buildScanHolder)
263-
buildReportService.onFinish(event, buildOperation, buildParameters)
264-
}
265-
}
266-
267-
})
268-
}
269-
else -> {}//do nothing, BuildScanFlowAction is used
270-
}
284+
285+
})
271286
}
287+
else -> {}//do nothing, BuildScanFlowAction is used
272288
}
273289
}
274290

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildScanExtensionHolder.kt

+14-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,18 @@ package org.jetbrains.kotlin.gradle.report
88
import com.gradle.scan.plugin.BuildScanExtension
99

1010
class BuildScanExtensionHolder(val buildScan: BuildScanExtension) : java.io.Serializable {
11-
constructor(extension: Any) : this(extension as BuildScanExtension)
11+
12+
companion object {
13+
internal operator fun invoke(extension: Any): BuildScanExtensionHolder? {
14+
val buildScanExtension = try {
15+
extension as BuildScanExtension
16+
} catch (e: ClassNotFoundException) {
17+
// Build scan plugin is applied, but BuildScanExtension class is not available due to Gradle classpath isolation
18+
// Could be reproduced by applying Gradle enterprise plugin via init script: KT-59589
19+
null
20+
}
21+
22+
return buildScanExtension?.let { BuildScanExtensionHolder(it) }
23+
}
24+
}
1225
}

0 commit comments

Comments
 (0)