diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/BuildFlowService.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/BuildFlowService.kt index 20988edc14408..1eaa01ecb6751 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/BuildFlowService.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/BuildFlowService.kt @@ -19,6 +19,8 @@ import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.plugin.BuildEventsListenerRegistryHolder import org.jetbrains.kotlin.gradle.plugin.StatisticsBuildFlowManager import org.jetbrains.kotlin.gradle.plugin.internal.isProjectIsolationEnabled +import org.jetbrains.kotlin.gradle.report.BuildReportType +import org.jetbrains.kotlin.gradle.report.reportingSettings import org.jetbrains.kotlin.gradle.utils.isConfigurationCacheAvailable import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics import org.jetbrains.kotlin.statistics.metrics.IStatisticsValuesConsumer @@ -56,6 +58,7 @@ internal abstract class BuildFlowService : BuildService StatisticsBuildFlowManager.getInstance(project).subscribeForBuildResult() } } - if (GradleVersion.current().baseVersion >= GradleVersion.version("8.1")) { + if (buildScanReportEnabled && GradleVersion.current().baseVersion >= GradleVersion.version("8.1")) { StatisticsBuildFlowManager.getInstance(project).subscribeForBuildScan(project) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildMetricsService.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildMetricsService.kt index 8c3aaf909d339..24a8a09d32f93 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildMetricsService.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildMetricsService.kt @@ -231,44 +231,60 @@ abstract class BuildMetricsService : BuildService) { - // BuildScanExtension cant be parameter nor BuildService's field - val buildScanExtension = project.rootProject.extensions.findByName("buildScan") - val buildScan = buildScanExtension?.let { BuildScanExtensionHolder(it) } - val buildMetricService = buildMetricServiceProvider.get() - val buildScanReportSettings = buildMetricService.parameters.reportingSettings.orNull?.buildScanReportSettings + val buildScanHolder = initBuildScanExtensionHolder(project, buildMetricServiceProvider) + if (buildScanHolder != null) { + subscribeForTaskEventsForBuildScan(project, buildMetricServiceProvider, buildScanHolder) + } + val gradle80withBuildScanReport = - GradleVersion.current().baseVersion == GradleVersion.version("8.0") && buildScanReportSettings != null && buildScan != null + GradleVersion.current().baseVersion == GradleVersion.version("8.0") && buildScanHolder != null if (!gradle80withBuildScanReport) { BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(buildMetricServiceProvider) } + } + private fun initBuildScanExtensionHolder( + project: Project, + buildMetricServiceProvider: Provider, + ): BuildScanExtensionHolder? { + val buildScanReportSettings = buildMetricServiceProvider.get().parameters.reportingSettings.orNull?.buildScanReportSettings if (buildScanReportSettings != null) { - buildScan?.also { buildScanHolder -> - when { - GradleVersion.current().baseVersion < GradleVersion.version("8.0") -> { - buildScanHolder.buildScan.buildFinished { - buildMetricServiceProvider.map {it.addBuildScanReport(buildScan)}.get() + // BuildScanExtension cant be parameter nor BuildService's field + val buildScanExtension = project.rootProject.extensions.findByName("buildScan") + return buildScanExtension?.let { BuildScanExtensionHolder(it) } + } + return null + } + + private fun subscribeForTaskEventsForBuildScan( + project: Project, + buildMetricServiceProvider: Provider, + buildScanHolder: BuildScanExtensionHolder + ) { + when { + GradleVersion.current().baseVersion < GradleVersion.version("8.0") -> { + buildScanHolder.buildScan.buildFinished { + buildMetricServiceProvider.map { it.addBuildScanReport(buildScanHolder) }.get() + } + } + GradleVersion.current().baseVersion < GradleVersion.version("8.1") -> { + val buildMetricService = buildMetricServiceProvider.get() + buildMetricService.buildReportService.initBuildScanTags(buildScanHolder, buildMetricService.parameters.label.orNull) + BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(project.provider { + OperationCompletionListener { event -> + if (event is TaskFinishEvent) { + val buildOperation = buildMetricService.updateBuildOperationRecord(event) + val buildParameters = buildMetricService.parameters.toBuildReportParameters() + val buildReportService = buildMetricServiceProvider.map { it.buildReportService }.get() + buildReportService.addBuildScanReport(event, buildOperation, buildParameters, buildScanHolder) + buildReportService.onFinish(event, buildOperation, buildParameters) } } - GradleVersion.current().baseVersion < GradleVersion.version("8.1") -> { - buildMetricService.buildReportService.initBuildScanTags(buildScan, buildMetricService.parameters.label.orNull) - BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(project.provider { - OperationCompletionListener { event -> - if (event is TaskFinishEvent) { - val buildOperation = buildMetricService.updateBuildOperationRecord(event) - val buildParameters = buildMetricService.parameters.toBuildReportParameters() - val buildReportService = buildMetricServiceProvider.map { it.buildReportService }.get() - buildReportService.addBuildScanReport(event, buildOperation, buildParameters, buildScanHolder) - buildReportService.onFinish(event, buildOperation, buildParameters) - } - } - - }) - } - else -> {}//do nothing, BuildScanFlowAction is used - } + + }) } + else -> {}//do nothing, BuildScanFlowAction is used } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildScanExtensionHolder.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildScanExtensionHolder.kt index 721e7ddb54be2..499307c6ffd84 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildScanExtensionHolder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildScanExtensionHolder.kt @@ -8,5 +8,18 @@ package org.jetbrains.kotlin.gradle.report import com.gradle.scan.plugin.BuildScanExtension class BuildScanExtensionHolder(val buildScan: BuildScanExtension) : java.io.Serializable { - constructor(extension: Any) : this(extension as BuildScanExtension) + + companion object { + internal operator fun invoke(extension: Any): BuildScanExtensionHolder? { + val buildScanExtension = try { + extension as BuildScanExtension + } catch (e: ClassNotFoundException) { + // Build scan plugin is applied, but BuildScanExtension class is not available due to Gradle classpath isolation + // Could be reproduced by applying Gradle enterprise plugin via init script: KT-59589 + null + } + + return buildScanExtension?.let { BuildScanExtensionHolder(it) } + } + } } \ No newline at end of file