From 77403cb5cb608865a9cee18ec5b10081d09e7e9a Mon Sep 17 00:00:00 2001 From: Daz DeBoer Date: Mon, 25 Jul 2022 16:42:23 -0600 Subject: [PATCH 01/22] Remove unnecessary initscript block Loading the GE plugin into the initscript classpath is not required. --- .../configure-gradle-enterprise.gradle | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index 6b44b72f..74628190 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -1,18 +1,6 @@ import org.gradle.util.GradleVersion import java.nio.charset.StandardCharsets; -initscript { - def gradleEnterprisePluginVersion = "3.12.4" - - repositories { - gradlePluginPortal() - } - - dependencies { - classpath("com.gradle:gradle-enterprise-gradle-plugin:${gradleEnterprisePluginVersion}") - } -} - // Don't run against the included builds (if the main build has any). def isTopLevelBuild = gradle.getParent() == null if (isTopLevelBuild) { From d3a13cfd3f1306457443fccabb7ac7d06da13fb6 Mon Sep 17 00:00:00 2001 From: Daz DeBoer Date: Mon, 25 Jul 2022 17:13:54 -0600 Subject: [PATCH 02/22] Consolidate init-scripts used to configure GE Removes the separate 'capture-published-build-scan.gradle' init script, merging the functionality into 'configure-gradle-enterprise.gradle'. This reduces duplication and simplifies the overall scripts. --- .../capture-published-build-scan.gradle | 51 ------------------- .../configure-gradle-enterprise.gradle | 18 +++++++ components/scripts/lib/gradle.sh | 1 - 3 files changed, 18 insertions(+), 52 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/capture-published-build-scan.gradle b/components/scripts/gradle/gradle-init-scripts/capture-published-build-scan.gradle index e2cfe835..e69de29b 100644 --- a/components/scripts/gradle/gradle-init-scripts/capture-published-build-scan.gradle +++ b/components/scripts/gradle/gradle-init-scripts/capture-published-build-scan.gradle @@ -1,51 +0,0 @@ -import org.gradle.util.GradleVersion - -// Don't run against the included builds (if the main build has any). -def isTopLevelBuild = gradle.getParent() == null -if (isTopLevelBuild) { - def version = GradleVersion.current().baseVersion - def atLeastGradle5 = version >= GradleVersion.version("5.0") - def atLeastGradle6 = version >= GradleVersion.version("6.0") - - if (atLeastGradle6) { - settingsEvaluated { settings -> - if (!settings.pluginManager.hasPlugin("com.gradle.enterprise")) { - throw new IllegalStateException("The com.gradle.enterprise plugin is missing from the project (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_6_x_and_later).") - } - registerCallbacks(settings.extensions["gradleEnterprise"]) - } - } else if (atLeastGradle5) { - projectsEvaluated { gradle -> - if (!gradle.rootProject.pluginManager.hasPlugin("com.gradle.build-scan")) { - throw new IllegalStateException("The com.gradle.build-scan plugin is missing from the project (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_5_x).") - } - registerCallbacks(gradle.rootProject.extensions["gradleEnterprise"]) - } - } else { - throw new IllegalStateException("Build validation not supported for Gradle ${GradleVersion.current()}. Upgrade your project's build to Gradle 5 or newer.") - } -} - -void registerCallbacks(gradleEnterprise) { - gradleEnterprise.with { - buildScan { - def scanFile = new File(experimentDir, "build-scans.csv") - buildScanPublished { buildScan -> - def buildScanUri = buildScan.buildScanUri - def buildScanId = buildScan.buildScanId - def port = (buildScanUri.port != -1) ? ":" + buildScanUri.port : "" - def baseUrl = "${buildScanUri.scheme}://${buildScanUri.host}${port}" - scanFile.append("${baseUrl},${buildScanUri},${buildScanId}\n") - } - def errorFile = new File(experimentDir, "build-scan-publish-error.txt") - onError { error -> - errorFile.text = error - } - } - } -} - -File getExperimentDir() { - def projectProperties = gradle.startParameter.projectProperties - new File(projectProperties.get("com.gradle.enterprise.build_validation.experimentDir")) -} diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index 74628190..443b1632 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -56,10 +56,28 @@ void configureGradleEnterprise(gradleEnterprise) { uploadInBackground = false publishAlways() } + captureBuildScanLinks(buildScan) addCustomData(buildScan) } } +void captureBuildScanLinks(buildScan) { + buildScan.with { + def scanFile = new File(experimentDir, "build-scans.csv") + buildScanPublished { publishedBuildScan -> + def buildScanUri = publishedBuildScan.buildScanUri + def buildScanId = publishedBuildScan.buildScanId + def port = (buildScanUri.port != -1) ? ":" + buildScanUri.port : "" + def baseUrl = "${buildScanUri.scheme}://${buildScanUri.host}${port}" + scanFile.append("${baseUrl},${buildScanUri},${buildScanId}\n") + } + def errorFile = new File(experimentDir, "build-scan-publish-error.txt") + onError { error -> + errorFile.text = error + } + } +} + void addCustomData(buildScan) { def projectProperties = gradle.startParameter.projectProperties diff --git a/components/scripts/lib/gradle.sh b/components/scripts/lib/gradle.sh index a0da73cb..dd50bbd4 100644 --- a/components/scripts/lib/gradle.sh +++ b/components/scripts/lib/gradle.sh @@ -15,7 +15,6 @@ invoke_gradle() { fi args+=(--init-script "${INIT_SCRIPTS_DIR}/configure-gradle-enterprise.gradle") - args+=(--init-script "${INIT_SCRIPTS_DIR}/capture-published-build-scan.gradle") if [ -n "${ge_server}" ]; then args+=("-Pcom.gradle.enterprise.build_validation.server=${ge_server}") From 0dd801fc7f1b7999b22c3064b4ec4adcf84cf77b Mon Sep 17 00:00:00 2001 From: Daz DeBoer Date: Tue, 26 Jul 2022 13:34:11 -0600 Subject: [PATCH 03/22] Improve error message when GE plugin is not applied --- .../configure-gradle-enterprise.gradle | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index 443b1632..f291bdee 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -14,7 +14,9 @@ if (isTopLevelBuild) { if (atLeastGradle6) { settingsEvaluated { settings -> if (!settings.pluginManager.hasPlugin("com.gradle.enterprise")) { - throw new IllegalStateException("The com.gradle.enterprise plugin is missing from the project (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_6_x_and_later).") + throw new IllegalStateException("The com.gradle.enterprise plugin is missing from the project.\n" + + "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_6_x_and_later),\n" + + "or use `--enable-gradle-enterprise` when running the build validation script.") } if (!settings.pluginManager.hasPlugin("com.gradle.common-custom-user-data-gradle-plugin")) { logWarningMissingCommonCustomUserDataGradlePlugin() @@ -26,7 +28,9 @@ if (isTopLevelBuild) { } else if (atLeastGradle5) { projectsEvaluated { gradle -> if (!gradle.rootProject.pluginManager.hasPlugin("com.gradle.build-scan")) { - throw new IllegalStateException("The com.gradle.build-scan plugin is missing from the project (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_5_x).") + throw new IllegalStateException("The com.gradle.build-scan plugin is missing from the project.\n" + + "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_5_x),\n" + + "or use `--enable-gradle-enterprise` when running the build validation script.") } if (!gradle.rootProject.pluginManager.hasPlugin("com.gradle.common-custom-user-data-gradle-plugin")) { logWarningMissingCommonCustomUserDataGradlePlugin() From d02452f886fd7a77545f1a57e24138c1bd0e5eaf Mon Sep 17 00:00:00 2001 From: Daz DeBoer Date: Tue, 26 Jul 2022 14:39:31 -0600 Subject: [PATCH 04/22] Avoid duplicate plugin application with `-e` Borrowing the logic from the TC Build Scan plugin, the init-script now checks if the GE / CCUD plugins are already applied. --- .../configure-gradle-enterprise.gradle | 2 +- .../enable-gradle-enterprise.gradle | 75 ++++++++++++++----- 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index f291bdee..24a3dfde 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -2,7 +2,7 @@ import org.gradle.util.GradleVersion import java.nio.charset.StandardCharsets; // Don't run against the included builds (if the main build has any). -def isTopLevelBuild = gradle.getParent() == null +def isTopLevelBuild = !gradle.parent if (isTopLevelBuild) { def version = GradleVersion.current().baseVersion def atLeastGradle5 = version >= GradleVersion.version("5.0") diff --git a/components/scripts/gradle/gradle-init-scripts/enable-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/enable-gradle-enterprise.gradle index 06b4814f..b1531b2b 100644 --- a/components/scripts/gradle/gradle-init-scripts/enable-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/enable-gradle-enterprise.gradle @@ -1,9 +1,12 @@ -import com.gradle.enterprise.gradleplugin.GradleEnterprisePlugin -import com.gradle.scan.plugin.BuildScanPlugin -import com.gradle.CommonCustomUserDataGradlePlugin import org.gradle.util.GradleVersion +// Don't run against the included builds (if the main build has any). initscript { + def isTopLevelBuild = !gradle.parent + if (!isTopLevelBuild) { + return + } + def gradleEnterprisePluginVersion = "3.12.4" def commonCustomUserDataPluginVersion = "1.9" @@ -17,25 +20,57 @@ initscript { } } -// Don't run against the included builds (if the main build has any). -def isTopLevelBuild = gradle.getParent() == null -if (isTopLevelBuild) { - def version = GradleVersion.current().baseVersion - def atLeastGradle5 = version >= GradleVersion.version("5.0") - def atLeastGradle6 = version >= GradleVersion.version("6.0") - - if (atLeastGradle6) { - beforeSettings { settings -> - settings.pluginManager.apply(GradleEnterprisePlugin) - settings.pluginManager.apply(CommonCustomUserDataGradlePlugin) +def isTopLevelBuild = !gradle.parent +if (!isTopLevelBuild) { + return +} + +def BUILD_SCAN_PLUGIN_CLASS = 'com.gradle.scan.plugin.BuildScanPlugin' + +def GRADLE_ENTERPRISE_PLUGIN_ID = 'com.gradle.enterprise' +def GRADLE_ENTERPRISE_PLUGIN_CLASS = 'com.gradle.enterprise.gradleplugin.GradleEnterprisePlugin' + +def CCUD_PLUGIN_ID = 'com.gradle.common-custom-user-data-gradle-plugin' +def CCUD_PLUGIN_CLASS = 'com.gradle.CommonCustomUserDataGradlePlugin' + +def version = GradleVersion.current().baseVersion +def atLeastGradle5 = version >= GradleVersion.version("5.0") +def atLeastGradle6 = version >= GradleVersion.version("6.0") + +if (atLeastGradle6) { + gradle.settingsEvaluated { settings -> + if (!settings.pluginManager.hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID)) { + logger.quiet("Applying $GRADLE_ENTERPRISE_PLUGIN_CLASS via init script") + settings.pluginManager.apply(initscript.classLoader.loadClass(GRADLE_ENTERPRISE_PLUGIN_CLASS)) + } + if (!settings.pluginManager.hasPlugin(CCUD_PLUGIN_ID)) { + logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script") + settings.pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS)) } - } else if (atLeastGradle5) { - rootProject { - pluginManager.apply(BuildScanPlugin) - pluginManager.apply(CommonCustomUserDataGradlePlugin) + } +} else if (atLeastGradle5) { + rootProject { + buildscript.configurations.getByName("classpath").incoming.afterResolve { ResolvableDependencies incoming -> + def resolutionResult = incoming.resolutionResult + + def scanPluginComponent = resolutionResult.allComponents.find { + it.moduleVersion.with { group == "com.gradle" && (name == "build-scan-plugin" || name == "gradle-enterprise-gradle-plugin") } + } + if (!scanPluginComponent) { + logger.quiet("Applying $BUILD_SCAN_PLUGIN_CLASS via init script") + pluginManager.apply(initscript.classLoader.loadClass(BUILD_SCAN_PLUGIN_CLASS)) + } + + def ccudPluginComponent = resolutionResult.allComponents.find { + it.moduleVersion.with { group == "com.gradle" && name == "common-custom-user-data-gradle-plugin" } + } + if (!ccudPluginComponent) { + logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script") + pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS)) + } } - } else { - throw new IllegalStateException("Build validation not supported for Gradle ${GradleVersion.current()}. Upgrade your project's build to Gradle 5 or newer.") } +} else { + throw new IllegalStateException("Build validation not supported for Gradle ${GradleVersion.current()}. Upgrade your project's build to Gradle 5 or newer.") } From 347630d7ff07249c571cb302170f920e5f12cb93 Mon Sep 17 00:00:00 2001 From: Daz DeBoer Date: Tue, 26 Jul 2022 14:59:27 -0600 Subject: [PATCH 05/22] Use System property instead of Project property for server override --- .../configure-gradle-enterprise.gradle | 10 ++++------ components/scripts/lib/gradle.sh | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index 24a3dfde..de836ee8 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -47,12 +47,10 @@ if (isTopLevelBuild) { void configureGradleEnterprise(gradleEnterprise) { gradleEnterprise.with { buildScan { - def projectProperties = gradle.startParameter.projectProperties - if (projectProperties.containsKey("com.gradle.enterprise.build_validation.server")) { - server = projectProperties.get("com.gradle.enterprise.build_validation.server") - } - - if (!server) { + def serverOverride = System.getProperty("com.gradle.enterprise.build_validation.server") + if (serverOverride) { + server = serverOverride + } else if (!server) { throw new IllegalStateException("A Gradle Enterprise server URL has not been configured.", null) } diff --git a/components/scripts/lib/gradle.sh b/components/scripts/lib/gradle.sh index dd50bbd4..69128e3c 100644 --- a/components/scripts/lib/gradle.sh +++ b/components/scripts/lib/gradle.sh @@ -17,7 +17,7 @@ invoke_gradle() { args+=(--init-script "${INIT_SCRIPTS_DIR}/configure-gradle-enterprise.gradle") if [ -n "${ge_server}" ]; then - args+=("-Pcom.gradle.enterprise.build_validation.server=${ge_server}") + args+=("-Dcom.gradle.enterprise.build_validation.server=${ge_server}") fi if [[ "${build_scan_publishing_mode}" == "on" ]]; then From e7eae5c4aa56cff718b1db50c6d6f5e83172441d Mon Sep 17 00:00:00 2001 From: Daz DeBoer Date: Tue, 26 Jul 2022 15:15:25 -0600 Subject: [PATCH 06/22] Merge enable- and configure- init scripts This reduces duplication and increases similarity with TC Build Scan plugin. --- .../configure-gradle-enterprise.gradle | 126 ++++++++++++++---- .../enable-gradle-enterprise.gradle | 76 ----------- components/scripts/lib/gradle.sh | 6 +- 3 files changed, 102 insertions(+), 106 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index de836ee8..ea1cebca 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -1,47 +1,119 @@ import org.gradle.util.GradleVersion import java.nio.charset.StandardCharsets; +// Don't run against the included builds (if the main build has any). +initscript { + def isTopLevelBuild = !gradle.parent + if (!isTopLevelBuild) { + return + } + + def enableGradleEnterprise = System.getProperty("com.gradle.enterprise.build_validation.enableGradleEnterprise") + if (!enableGradleEnterprise) { + return + } + + def gradleEnterprisePluginVersion = "3.12.1" + def commonCustomUserDataPluginVersion = "1.8.2" + + repositories { + gradlePluginPortal() + } + + dependencies { + classpath("com.gradle:gradle-enterprise-gradle-plugin:${gradleEnterprisePluginVersion}") + classpath("com.gradle:common-custom-user-data-gradle-plugin:${commonCustomUserDataPluginVersion}") + } +} + // Don't run against the included builds (if the main build has any). def isTopLevelBuild = !gradle.parent -if (isTopLevelBuild) { - def version = GradleVersion.current().baseVersion - def atLeastGradle5 = version >= GradleVersion.version("5.0") - def atLeastGradle6 = version >= GradleVersion.version("6.0") - def isScanDump = System.properties.containsKey("scan.dump") +if (!isTopLevelBuild) { + return +} + +def BUILD_SCAN_PLUGIN_CLASS = 'com.gradle.scan.plugin.BuildScanPlugin' + +def GRADLE_ENTERPRISE_PLUGIN_ID = 'com.gradle.enterprise' +def GRADLE_ENTERPRISE_PLUGIN_CLASS = 'com.gradle.enterprise.gradleplugin.GradleEnterprisePlugin' + +def CCUD_PLUGIN_ID = 'com.gradle.common-custom-user-data-gradle-plugin' +def CCUD_PLUGIN_CLASS = 'com.gradle.CommonCustomUserDataGradlePlugin' + +def enableGradleEnterprise = System.getProperty("com.gradle.enterprise.build_validation.enableGradleEnterprise") - clearWarnings() +def version = GradleVersion.current().baseVersion +def atLeastGradle5 = version >= GradleVersion.version("5.0") +def atLeastGradle6 = version >= GradleVersion.version("6.0") +def isScanDump = System.properties.containsKey("scan.dump") - if (atLeastGradle6) { - settingsEvaluated { settings -> - if (!settings.pluginManager.hasPlugin("com.gradle.enterprise")) { +clearWarnings() + +if (atLeastGradle6) { + settingsEvaluated { settings -> + if (!settings.pluginManager.hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID)) { + if (enableGradleEnterprise) { + logger.quiet("Applying $GRADLE_ENTERPRISE_PLUGIN_CLASS via init script") + settings.pluginManager.apply(initscript.classLoader.loadClass(GRADLE_ENTERPRISE_PLUGIN_CLASS)) + } else { throw new IllegalStateException("The com.gradle.enterprise plugin is missing from the project.\n" + - "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_6_x_and_later),\n" + - "or use `--enable-gradle-enterprise` when running the build validation script.") + "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_6_x_and_later),\n" + + "or use `--enable-gradle-enterprise` when running the build validation script.") } - if (!settings.pluginManager.hasPlugin("com.gradle.common-custom-user-data-gradle-plugin")) { + } + if (!settings.pluginManager.hasPlugin(CCUD_PLUGIN_ID)) { + if (enableGradleEnterprise) { + logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script") + settings.pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS)) + } else { logWarningMissingCommonCustomUserDataGradlePlugin() } - if (!isScanDump) { - configureGradleEnterprise(settings.extensions["gradleEnterprise"]) - } } - } else if (atLeastGradle5) { - projectsEvaluated { gradle -> - if (!gradle.rootProject.pluginManager.hasPlugin("com.gradle.build-scan")) { - throw new IllegalStateException("The com.gradle.build-scan plugin is missing from the project.\n" + - "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_5_x),\n" + - "or use `--enable-gradle-enterprise` when running the build validation script.") + + if (!isScanDump) { + configureGradleEnterprise(settings.extensions["gradleEnterprise"]) + } + } +} else if (atLeastGradle5) { + rootProject { + buildscript.configurations.getByName("classpath").incoming.afterResolve { ResolvableDependencies incoming -> + def resolutionResult = incoming.resolutionResult + + def scanPluginComponent = resolutionResult.allComponents.find { + it.moduleVersion.with { group == "com.gradle" && (name == "build-scan-plugin" || name == "gradle-enterprise-gradle-plugin") } } - if (!gradle.rootProject.pluginManager.hasPlugin("com.gradle.common-custom-user-data-gradle-plugin")) { - logWarningMissingCommonCustomUserDataGradlePlugin() + if (!scanPluginComponent) { + if (enableGradleEnterprise) { + logger.quiet("Applying $BUILD_SCAN_PLUGIN_CLASS via init script") + pluginManager.apply(initscript.classLoader.loadClass(BUILD_SCAN_PLUGIN_CLASS)) + } else { + throw new IllegalStateException("The com.gradle.build-scan plugin is missing from the project.\n" + + "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_5_x),\n" + + "or use `--enable-gradle-enterprise` when running the build validation script.") + } + } + + def ccudPluginComponent = resolutionResult.allComponents.find { + it.moduleVersion.with { group == "com.gradle" && name == "common-custom-user-data-gradle-plugin" } } - if (!isScanDump) { - configureGradleEnterprise(gradle.rootProject.extensions["gradleEnterprise"]) + if (!ccudPluginComponent) { + if (enableGradleEnterprise) { + logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script") + pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS)) + } else { + logWarningMissingCommonCustomUserDataGradlePlugin() + } } } - } else { - throw new IllegalStateException("Build validation not supported for Gradle ${GradleVersion.current()}. Upgrade your project's build to Gradle 5 or newer.") } + + if (!isScanDump) { + projectsEvaluated { gradle -> + configureGradleEnterprise(gradle.rootProject.extensions["gradleEnterprise"]) + } + } +} else { + throw new IllegalStateException("Build validation not supported for Gradle ${GradleVersion.current()}. Upgrade your project's build to Gradle 5 or newer.") } void configureGradleEnterprise(gradleEnterprise) { diff --git a/components/scripts/gradle/gradle-init-scripts/enable-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/enable-gradle-enterprise.gradle index b1531b2b..e69de29b 100644 --- a/components/scripts/gradle/gradle-init-scripts/enable-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/enable-gradle-enterprise.gradle @@ -1,76 +0,0 @@ -import org.gradle.util.GradleVersion - -// Don't run against the included builds (if the main build has any). -initscript { - def isTopLevelBuild = !gradle.parent - if (!isTopLevelBuild) { - return - } - - def gradleEnterprisePluginVersion = "3.12.4" - def commonCustomUserDataPluginVersion = "1.9" - - repositories { - gradlePluginPortal() - } - - dependencies { - classpath("com.gradle:gradle-enterprise-gradle-plugin:${gradleEnterprisePluginVersion}") - classpath("com.gradle:common-custom-user-data-gradle-plugin:${commonCustomUserDataPluginVersion}") - } -} - -def isTopLevelBuild = !gradle.parent -if (!isTopLevelBuild) { - return -} - -def BUILD_SCAN_PLUGIN_CLASS = 'com.gradle.scan.plugin.BuildScanPlugin' - -def GRADLE_ENTERPRISE_PLUGIN_ID = 'com.gradle.enterprise' -def GRADLE_ENTERPRISE_PLUGIN_CLASS = 'com.gradle.enterprise.gradleplugin.GradleEnterprisePlugin' - -def CCUD_PLUGIN_ID = 'com.gradle.common-custom-user-data-gradle-plugin' -def CCUD_PLUGIN_CLASS = 'com.gradle.CommonCustomUserDataGradlePlugin' - -def version = GradleVersion.current().baseVersion -def atLeastGradle5 = version >= GradleVersion.version("5.0") -def atLeastGradle6 = version >= GradleVersion.version("6.0") - -if (atLeastGradle6) { - gradle.settingsEvaluated { settings -> - if (!settings.pluginManager.hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID)) { - logger.quiet("Applying $GRADLE_ENTERPRISE_PLUGIN_CLASS via init script") - settings.pluginManager.apply(initscript.classLoader.loadClass(GRADLE_ENTERPRISE_PLUGIN_CLASS)) - } - if (!settings.pluginManager.hasPlugin(CCUD_PLUGIN_ID)) { - logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script") - settings.pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS)) - } - } -} else if (atLeastGradle5) { - rootProject { - buildscript.configurations.getByName("classpath").incoming.afterResolve { ResolvableDependencies incoming -> - def resolutionResult = incoming.resolutionResult - - def scanPluginComponent = resolutionResult.allComponents.find { - it.moduleVersion.with { group == "com.gradle" && (name == "build-scan-plugin" || name == "gradle-enterprise-gradle-plugin") } - } - if (!scanPluginComponent) { - logger.quiet("Applying $BUILD_SCAN_PLUGIN_CLASS via init script") - pluginManager.apply(initscript.classLoader.loadClass(BUILD_SCAN_PLUGIN_CLASS)) - } - - def ccudPluginComponent = resolutionResult.allComponents.find { - it.moduleVersion.with { group == "com.gradle" && name == "common-custom-user-data-gradle-plugin" } - } - if (!ccudPluginComponent) { - logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script") - pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS)) - } - } - } -} else { - throw new IllegalStateException("Build validation not supported for Gradle ${GradleVersion.current()}. Upgrade your project's build to Gradle 5 or newer.") -} - diff --git a/components/scripts/lib/gradle.sh b/components/scripts/lib/gradle.sh index 69128e3c..6611da83 100644 --- a/components/scripts/lib/gradle.sh +++ b/components/scripts/lib/gradle.sh @@ -10,12 +10,12 @@ invoke_gradle() { cd "${project_dir}" > /dev/null 2>&1 || die "ERROR: The subdirectory ${project_dir} (set with --project-dir) does not exist in ${project_name}." "${INVALID_INPUT}" fi + args+=(--init-script "${INIT_SCRIPTS_DIR}/configure-gradle-enterprise.gradle") + if [ "$enable_ge" == "on" ]; then - args+=(--init-script "${INIT_SCRIPTS_DIR}/enable-gradle-enterprise.gradle") + args+=("-Dcom.gradle.enterprise.build_validation.enableGradleEnterprise=true") fi - args+=(--init-script "${INIT_SCRIPTS_DIR}/configure-gradle-enterprise.gradle") - if [ -n "${ge_server}" ]; then args+=("-Dcom.gradle.enterprise.build_validation.server=${ge_server}") fi From d6fc20702fb4a9eb430f3dc245d6ac14a6b3b175 Mon Sep 17 00:00:00 2001 From: Daz DeBoer Date: Wed, 27 Jul 2022 13:58:57 -0600 Subject: [PATCH 07/22] Refactor init-script to be more similar to gold standard --- .../configure-gradle-enterprise.gradle | 154 ++++++++++-------- 1 file changed, 84 insertions(+), 70 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index ea1cebca..3437a08e 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -1,80 +1,78 @@ import org.gradle.util.GradleVersion import java.nio.charset.StandardCharsets; -// Don't run against the included builds (if the main build has any). +if (GradleVersion.current() < GradleVersion.version("5.0")) { + throw new IllegalStateException("Build validation not supported for Gradle ${GradleVersion.current()}. Upgrade your project's build to Gradle 5 or newer.") +} + +// note that there is no mechanism to share code between the initscript{} block and the main script, so some logic is duplicated + +// conditionally apply the GE / Build Scan plugin to the classpath so it can be applied to the build further down in this script initscript { def isTopLevelBuild = !gradle.parent if (!isTopLevelBuild) { return } - def enableGradleEnterprise = System.getProperty("com.gradle.enterprise.build_validation.enableGradleEnterprise") - if (!enableGradleEnterprise) { - return - } + def enableGradleEnterprise = Boolean.getBoolean("com.gradle.enterprise.build_validation.enableGradleEnterprise") - def gradleEnterprisePluginVersion = "3.12.1" - def commonCustomUserDataPluginVersion = "1.8.2" + def gePluginVersion = enableGradleEnterprise ? "3.12.1" : null + def ccudPluginVersion = enableGradleEnterprise ? "1.8.2" : null repositories { gradlePluginPortal() } dependencies { - classpath("com.gradle:gradle-enterprise-gradle-plugin:${gradleEnterprisePluginVersion}") - classpath("com.gradle:common-custom-user-data-gradle-plugin:${commonCustomUserDataPluginVersion}") - } -} + if (gePluginVersion) { + classpath "com.gradle:gradle-enterprise-gradle-plugin:$gePluginVersion" + } -// Don't run against the included builds (if the main build has any). -def isTopLevelBuild = !gradle.parent -if (!isTopLevelBuild) { - return + if (ccudPluginVersion) { + classpath "com.gradle:common-custom-user-data-gradle-plugin:$ccudPluginVersion" + } + } } +def BUILD_SCAN_PLUGIN_ID = 'com.gradle.build-scan' def BUILD_SCAN_PLUGIN_CLASS = 'com.gradle.scan.plugin.BuildScanPlugin' def GRADLE_ENTERPRISE_PLUGIN_ID = 'com.gradle.enterprise' def GRADLE_ENTERPRISE_PLUGIN_CLASS = 'com.gradle.enterprise.gradleplugin.GradleEnterprisePlugin' +def GRADLE_ENTERPRISE_EXTENSION_CLASS = 'com.gradle.enterprise.gradleplugin.GradleEnterpriseExtension' def CCUD_PLUGIN_ID = 'com.gradle.common-custom-user-data-gradle-plugin' def CCUD_PLUGIN_CLASS = 'com.gradle.CommonCustomUserDataGradlePlugin' -def enableGradleEnterprise = System.getProperty("com.gradle.enterprise.build_validation.enableGradleEnterprise") +def isTopLevelBuild = !gradle.parent +if (!isTopLevelBuild) { + return +} -def version = GradleVersion.current().baseVersion -def atLeastGradle5 = version >= GradleVersion.version("5.0") -def atLeastGradle6 = version >= GradleVersion.version("6.0") -def isScanDump = System.properties.containsKey("scan.dump") +def enableGradleEnterprise = Boolean.getBoolean("com.gradle.enterprise.build_validation.enableGradleEnterprise") clearWarnings() -if (atLeastGradle6) { - settingsEvaluated { settings -> - if (!settings.pluginManager.hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID)) { - if (enableGradleEnterprise) { - logger.quiet("Applying $GRADLE_ENTERPRISE_PLUGIN_CLASS via init script") - settings.pluginManager.apply(initscript.classLoader.loadClass(GRADLE_ENTERPRISE_PLUGIN_CLASS)) - } else { - throw new IllegalStateException("The com.gradle.enterprise plugin is missing from the project.\n" + - "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_6_x_and_later),\n" + - "or use `--enable-gradle-enterprise` when running the build validation script.") - } - } - if (!settings.pluginManager.hasPlugin(CCUD_PLUGIN_ID)) { - if (enableGradleEnterprise) { - logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script") - settings.pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS)) - } else { - logWarningMissingCommonCustomUserDataGradlePlugin() - } +// define a buildScanPublished listener that captures the build scan URL and sends it in a message to the server +def buildScanPublishedAction = { def buildScan -> + if (buildScan.metaClass.respondsTo(buildScan, 'buildScanPublished', Action)) { + def scanFile = new File(experimentDir, "build-scans.csv") + buildScan.buildScanPublished { publishedBuildScan -> + def buildScanUri = publishedBuildScan.buildScanUri + def buildScanId = publishedBuildScan.buildScanId + def port = (buildScanUri.port != -1) ? ":" + buildScanUri.port : "" + def baseUrl = "${buildScanUri.scheme}://${buildScanUri.host}${port}" + scanFile.append("${baseUrl},${buildScanUri},${buildScanId}\n") } - - if (!isScanDump) { - configureGradleEnterprise(settings.extensions["gradleEnterprise"]) + def errorFile = new File(experimentDir, "build-scan-publish-error.txt") + buildScan.onError { error -> + errorFile.text = error } } -} else if (atLeastGradle5) { +} + +// register buildScanPublished listener and optionally apply the GE / Build Scan plugin +if (GradleVersion.current() < GradleVersion.version('6.0')) { rootProject { buildscript.configurations.getByName("classpath").incoming.afterResolve { ResolvableDependencies incoming -> def resolutionResult = incoming.resolutionResult @@ -105,53 +103,69 @@ if (atLeastGradle6) { } } } + + pluginManager.withPlugin(BUILD_SCAN_PLUGIN_ID) { + buildScanPublishedAction(buildScan) + } } - if (!isScanDump) { + if (!System.properties.containsKey("scan.dump")) { projectsEvaluated { gradle -> configureGradleEnterprise(gradle.rootProject.extensions["gradleEnterprise"]) } } } else { - throw new IllegalStateException("Build validation not supported for Gradle ${GradleVersion.current()}. Upgrade your project's build to Gradle 5 or newer.") + gradle.settingsEvaluated { settings -> + if (!settings.pluginManager.hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID)) { + if (enableGradleEnterprise) { + logger.quiet("Applying $GRADLE_ENTERPRISE_PLUGIN_CLASS via init script") + settings.pluginManager.apply(initscript.classLoader.loadClass(GRADLE_ENTERPRISE_PLUGIN_CLASS)) + } else { + throw new IllegalStateException("The com.gradle.enterprise plugin is missing from the project.\n" + + "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_6_x_and_later),\n" + + "or use `--enable-gradle-enterprise` when running the build validation script.") + } + } + if (!settings.pluginManager.hasPlugin(CCUD_PLUGIN_ID)) { + if (enableGradleEnterprise) { + logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script") + settings.pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS)) + } else { + logWarningMissingCommonCustomUserDataGradlePlugin() + } + } + + extensionsWithPublicType(settings, GRADLE_ENTERPRISE_EXTENSION_CLASS).collect { settings[it.name] }.each { ext -> + if (!System.properties.containsKey("scan.dump")) { + configureGradleEnterprise(ext) + } + buildScanPublishedAction(ext.buildScan) + } + } +} + +static def extensionsWithPublicType(def container, String publicType) { + container.extensions.extensionsSchema.elements.findAll { it.publicType.concreteClass.name == publicType } } void configureGradleEnterprise(gradleEnterprise) { gradleEnterprise.with { - buildScan { - def serverOverride = System.getProperty("com.gradle.enterprise.build_validation.server") - if (serverOverride) { - server = serverOverride - } else if (!server) { - throw new IllegalStateException("A Gradle Enterprise server URL has not been configured.", null) - } + def serverOverride = System.getProperty("com.gradle.enterprise.build_validation.server") + if (serverOverride) { + server = serverOverride + } else if (!server) { + throw new IllegalStateException("A Gradle Enterprise server URL has not been configured.", null) + } + buildScan { // captureTaskInputFiles = true (too late to be set here for Gradle 5, set via sys prop) uploadInBackground = false publishAlways() } - captureBuildScanLinks(buildScan) addCustomData(buildScan) } } -void captureBuildScanLinks(buildScan) { - buildScan.with { - def scanFile = new File(experimentDir, "build-scans.csv") - buildScanPublished { publishedBuildScan -> - def buildScanUri = publishedBuildScan.buildScanUri - def buildScanId = publishedBuildScan.buildScanId - def port = (buildScanUri.port != -1) ? ":" + buildScanUri.port : "" - def baseUrl = "${buildScanUri.scheme}://${buildScanUri.host}${port}" - scanFile.append("${baseUrl},${buildScanUri},${buildScanId}\n") - } - def errorFile = new File(experimentDir, "build-scan-publish-error.txt") - onError { error -> - errorFile.text = error - } - } -} - void addCustomData(buildScan) { def projectProperties = gradle.startParameter.projectProperties From 654dc9069e9d848b4be9511a55efbbe3c2619b0c Mon Sep 17 00:00:00 2001 From: Daz DeBoer Date: Fri, 29 Jul 2022 08:16:31 -0600 Subject: [PATCH 08/22] Fix comment --- .../gradle-init-scripts/configure-gradle-enterprise.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index 3437a08e..cb36d7b9 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -53,7 +53,7 @@ def enableGradleEnterprise = Boolean.getBoolean("com.gradle.enterprise.build_val clearWarnings() -// define a buildScanPublished listener that captures the build scan URL and sends it in a message to the server +// define a buildScanPublished listener that captures the build scan data and appends to a file def buildScanPublishedAction = { def buildScan -> if (buildScan.metaClass.respondsTo(buildScan, 'buildScanPublished', Action)) { def scanFile = new File(experimentDir, "build-scans.csv") @@ -86,8 +86,8 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { pluginManager.apply(initscript.classLoader.loadClass(BUILD_SCAN_PLUGIN_CLASS)) } else { throw new IllegalStateException("The com.gradle.build-scan plugin is missing from the project.\n" + - "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_5_x),\n" + - "or use `--enable-gradle-enterprise` when running the build validation script.") + "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_5_x),\n" + + "or use `--enable-gradle-enterprise` when running the build validation script.") } } From d902539019e7116996d929eafb5434be0ed9a460 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Thu, 29 Dec 2022 11:34:35 -0600 Subject: [PATCH 09/22] Remove empty files leftover from merge --- .../gradle-init-scripts/capture-published-build-scan.gradle | 0 .../gradle/gradle-init-scripts/enable-gradle-enterprise.gradle | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 components/scripts/gradle/gradle-init-scripts/capture-published-build-scan.gradle delete mode 100644 components/scripts/gradle/gradle-init-scripts/enable-gradle-enterprise.gradle diff --git a/components/scripts/gradle/gradle-init-scripts/capture-published-build-scan.gradle b/components/scripts/gradle/gradle-init-scripts/capture-published-build-scan.gradle deleted file mode 100644 index e69de29b..00000000 diff --git a/components/scripts/gradle/gradle-init-scripts/enable-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/enable-gradle-enterprise.gradle deleted file mode 100644 index e69de29b..00000000 From 00c78294c0e5284e923bb7ecac62a22a5e0e074c Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Thu, 29 Dec 2022 11:42:19 -0600 Subject: [PATCH 10/22] Create isScanDump variable --- .../gradle-init-scripts/configure-gradle-enterprise.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index cb36d7b9..4ec36176 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -50,6 +50,7 @@ if (!isTopLevelBuild) { } def enableGradleEnterprise = Boolean.getBoolean("com.gradle.enterprise.build_validation.enableGradleEnterprise") +def isScanDump = System.properties.containsKey("scan.dump") clearWarnings() @@ -109,7 +110,7 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { } } - if (!System.properties.containsKey("scan.dump")) { + if (!isScanDump) { projectsEvaluated { gradle -> configureGradleEnterprise(gradle.rootProject.extensions["gradleEnterprise"]) } @@ -136,7 +137,7 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { } extensionsWithPublicType(settings, GRADLE_ENTERPRISE_EXTENSION_CLASS).collect { settings[it.name] }.each { ext -> - if (!System.properties.containsKey("scan.dump")) { + if (!isScanDump) { configureGradleEnterprise(ext) } buildScanPublishedAction(ext.buildScan) From cda7906889674f36d7d5a1e38186e9350ce1bea4 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Thu, 29 Dec 2022 14:28:51 -0600 Subject: [PATCH 11/22] Do not pass --scan on command line This causes build classpath issues with Gradle 5.x --- components/scripts/lib/gradle.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/components/scripts/lib/gradle.sh b/components/scripts/lib/gradle.sh index 6611da83..52bf0116 100644 --- a/components/scripts/lib/gradle.sh +++ b/components/scripts/lib/gradle.sh @@ -20,9 +20,7 @@ invoke_gradle() { args+=("-Dcom.gradle.enterprise.build_validation.server=${ge_server}") fi - if [[ "${build_scan_publishing_mode}" == "on" ]]; then - args+=("--scan") - else + if [[ "${build_scan_publishing_mode}" == "off" ]]; then args+=("-Dscan.dump") fi From cae969fa11436b2628be28bf5d84bc9b0d9ab154 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Thu, 29 Dec 2022 14:51:53 -0600 Subject: [PATCH 12/22] Remove logger calls in init script These clutter the console --- .../gradle-init-scripts/configure-gradle-enterprise.gradle | 4 ---- 1 file changed, 4 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index 4ec36176..58996044 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -83,7 +83,6 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { } if (!scanPluginComponent) { if (enableGradleEnterprise) { - logger.quiet("Applying $BUILD_SCAN_PLUGIN_CLASS via init script") pluginManager.apply(initscript.classLoader.loadClass(BUILD_SCAN_PLUGIN_CLASS)) } else { throw new IllegalStateException("The com.gradle.build-scan plugin is missing from the project.\n" + @@ -97,7 +96,6 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { } if (!ccudPluginComponent) { if (enableGradleEnterprise) { - logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script") pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS)) } else { logWarningMissingCommonCustomUserDataGradlePlugin() @@ -119,7 +117,6 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { gradle.settingsEvaluated { settings -> if (!settings.pluginManager.hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID)) { if (enableGradleEnterprise) { - logger.quiet("Applying $GRADLE_ENTERPRISE_PLUGIN_CLASS via init script") settings.pluginManager.apply(initscript.classLoader.loadClass(GRADLE_ENTERPRISE_PLUGIN_CLASS)) } else { throw new IllegalStateException("The com.gradle.enterprise plugin is missing from the project.\n" + @@ -129,7 +126,6 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { } if (!settings.pluginManager.hasPlugin(CCUD_PLUGIN_ID)) { if (enableGradleEnterprise) { - logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script") settings.pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS)) } else { logWarningMissingCommonCustomUserDataGradlePlugin() From 7e0594d397484a1d3a84804c87405ddeba07d129 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Mon, 9 Jan 2023 09:49:08 -0600 Subject: [PATCH 13/22] Update Gradle version exception message Co-authored-by: Jim Hurne --- .../gradle-init-scripts/configure-gradle-enterprise.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index 58996044..52e5feee 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -2,7 +2,7 @@ import org.gradle.util.GradleVersion import java.nio.charset.StandardCharsets; if (GradleVersion.current() < GradleVersion.version("5.0")) { - throw new IllegalStateException("Build validation not supported for Gradle ${GradleVersion.current()}. Upgrade your project's build to Gradle 5 or newer.") + throw new IllegalStateException("The Gradle Enterprise Build Validation Scripts are not supported with Gradle ${GradleVersion.current()}. Please upgrade your project's build to Gradle 5 or newer.") } // note that there is no mechanism to share code between the initscript{} block and the main script, so some logic is duplicated From 366df54cd99356fdf333fa1c3c405cc56ad07237 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Sun, 5 Mar 2023 19:18:05 -0500 Subject: [PATCH 14/22] Bump build classpath dependencies in initialization scripts to latest --- .../gradle-init-scripts/configure-gradle-enterprise.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index 52e5feee..aab0ba9b 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -16,8 +16,8 @@ initscript { def enableGradleEnterprise = Boolean.getBoolean("com.gradle.enterprise.build_validation.enableGradleEnterprise") - def gePluginVersion = enableGradleEnterprise ? "3.12.1" : null - def ccudPluginVersion = enableGradleEnterprise ? "1.8.2" : null + def gePluginVersion = enableGradleEnterprise ? "3.12.4" : null + def ccudPluginVersion = enableGradleEnterprise ? "1.9" : null repositories { gradlePluginPortal() From 9872189a8d73d256aeb52a2eb088c28d0a477207 Mon Sep 17 00:00:00 2001 From: Etienne Studer Date: Mon, 6 Mar 2023 17:17:50 -0500 Subject: [PATCH 15/22] Bring init script more in line with the init script for the TC BS plugin --- .../configure-gradle-enterprise.gradle | 157 ++++++++++++------ 1 file changed, 103 insertions(+), 54 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index aab0ba9b..e60261ee 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -1,10 +1,6 @@ import org.gradle.util.GradleVersion import java.nio.charset.StandardCharsets; -if (GradleVersion.current() < GradleVersion.version("5.0")) { - throw new IllegalStateException("The Gradle Enterprise Build Validation Scripts are not supported with Gradle ${GradleVersion.current()}. Please upgrade your project's build to Gradle 5 or newer.") -} - // note that there is no mechanism to share code between the initscript{} block and the main script, so some logic is duplicated // conditionally apply the GE / Build Scan plugin to the classpath so it can be applied to the build further down in this script @@ -14,21 +10,35 @@ initscript { return } - def enableGradleEnterprise = Boolean.getBoolean("com.gradle.enterprise.build_validation.enableGradleEnterprise") + def getInputParam = { String name -> + def envVarName = name.toUpperCase().replace('.', '_').replace('-', '_') + return System.getProperty(name) ?: System.getenv(envVarName) + } + + def pluginRepositoryUrl = getInputParam('com.gradle.enterprise.build_validation.gradle.plugin-repository.url') + def gePluginVersion = getInputParam('com.gradle.enterprise.build_validation.gradle-enterprise.plugin.version') + def ccudPluginVersion = getInputParam('com.gradle.enterprise.build_validation.ccud.plugin.version') + + def atLeastGradle5 = GradleVersion.current() >= GradleVersion.version('5.0') + def atLeastGradle4 = GradleVersion.current() >= GradleVersion.version('4.0') - def gePluginVersion = enableGradleEnterprise ? "3.12.4" : null - def ccudPluginVersion = enableGradleEnterprise ? "1.9" : null + if (gePluginVersion || ccudPluginVersion && atLeastGradle4) { + pluginRepositoryUrl = pluginRepositoryUrl ?: 'https://plugins.gradle.org/m2' + logger.quiet("Gradle Enterprise plugins resolution: $pluginRepositoryUrl") - repositories { - gradlePluginPortal() + repositories { + maven { url pluginRepositoryUrl } + } } dependencies { if (gePluginVersion) { - classpath "com.gradle:gradle-enterprise-gradle-plugin:$gePluginVersion" + classpath atLeastGradle5 ? + "com.gradle:gradle-enterprise-gradle-plugin:$gePluginVersion" : + "com.gradle:build-scan-plugin:1.16" } - if (ccudPluginVersion) { + if (ccudPluginVersion && atLeastGradle4) { classpath "com.gradle:common-custom-user-data-gradle-plugin:$ccudPluginVersion" } } @@ -49,26 +59,38 @@ if (!isTopLevelBuild) { return } -def enableGradleEnterprise = Boolean.getBoolean("com.gradle.enterprise.build_validation.enableGradleEnterprise") -def isScanDump = System.properties.containsKey("scan.dump") +def getInputParam = { String name -> + def envVarName = name.toUpperCase().replace('.', '_').replace('-', '_') + return System.getProperty(name) ?: System.getenv(envVarName) +} -clearWarnings() +def geUrl = getInputParam('com.gradle.enterprise.build_validation.gradle-enterprise.url') +def geAllowUntrustedServer = Boolean.parseBoolean(getInputParam('com.gradle.enterprise.build_validation.gradle-enterprise.allow-untrusted-server')) +def gePluginVersion = getInputParam('com.gradle.enterprise.build_validation.gradle-enterprise.plugin.version') +def gePluginScanDump = getInputParam('com.gradle.enterprise.build_validation.gradle-enterprise.plugin.scan-dump') +def ccudPluginVersion = getInputParam('com.gradle.enterprise.build_validation.ccud.plugin.version') -// define a buildScanPublished listener that captures the build scan data and appends to a file -def buildScanPublishedAction = { def buildScan -> - if (buildScan.metaClass.respondsTo(buildScan, 'buildScanPublished', Action)) { - def scanFile = new File(experimentDir, "build-scans.csv") - buildScan.buildScanPublished { publishedBuildScan -> - def buildScanUri = publishedBuildScan.buildScanUri - def buildScanId = publishedBuildScan.buildScanId - def port = (buildScanUri.port != -1) ? ":" + buildScanUri.port : "" - def baseUrl = "${buildScanUri.scheme}://${buildScanUri.host}${port}" - scanFile.append("${baseUrl},${buildScanUri},${buildScanId}\n") - } - def errorFile = new File(experimentDir, "build-scan-publish-error.txt") - buildScan.onError { error -> - errorFile.text = error - } +def atLeastGradle4 = GradleVersion.current() >= GradleVersion.version('4.0') + +// finish early if configuration parameters passed in via system properties are not valid/supported +if (ccudPluginVersion && isNotAtLeast(ccudPluginVersion, '1.7')) { + logger.warn("Common Custom User Data Gradle plugin must be at least 1.7. Configured version is $ccudPluginVersion.") + return +} + +// define a buildScanPublished listener that captures the build scan URL and id and appends it to a file +def registerBuildScanCallbacks = { def buildScan -> + def scanFile = new File(experimentDir, 'build-scans.csv') + buildScan.buildScanPublished { publishedBuildScan -> + def buildScanUri = publishedBuildScan.buildScanUri + def buildScanId = publishedBuildScan.buildScanId + def port = (buildScanUri.port != -1) ? ':' + buildScanUri.port : '' + def baseUrl = "${buildScanUri.scheme}://${buildScanUri.host}${port}" + scanFile.append("${baseUrl},${buildScanUri},${buildScanId}\n") + } + def errorFile = new File(experimentDir, 'build-scan-publish-error.txt') + buildScan.onError { error -> + errorFile.text = error } } @@ -81,62 +103,90 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { def scanPluginComponent = resolutionResult.allComponents.find { it.moduleVersion.with { group == "com.gradle" && (name == "build-scan-plugin" || name == "gradle-enterprise-gradle-plugin") } } - if (!scanPluginComponent) { - if (enableGradleEnterprise) { + + if (gePluginVersion) { + if (!scanPluginComponent) { + logger.quiet("Applying $BUILD_SCAN_PLUGIN_CLASS via init script") + logger.quiet("Connection to Gradle Enterprise: $geUrl, allowUntrustedServer: $geAllowUntrustedServer") pluginManager.apply(initscript.classLoader.loadClass(BUILD_SCAN_PLUGIN_CLASS)) - } else { + buildScan.server = geUrl + buildScan.allowUntrustedServer = geAllowUntrustedServer + buildScan.publishAlways() + if (buildScan.metaClass.respondsTo(buildScan, 'setUploadInBackground', Boolean)) buildScan.uploadInBackground = false // uploadInBackground not available for build-scan-plugin 1.16 + } + } else { + if (!scanPluginComponent) { throw new IllegalStateException("The com.gradle.build-scan plugin is missing from the project.\n" + - "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_5_x),\n" + - "or use `--enable-gradle-enterprise` when running the build validation script.") + "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_5_x) to the project,\n" + + "or use `--enable-gradle-enterprise` when running the build validation script.") } } def ccudPluginComponent = resolutionResult.allComponents.find { it.moduleVersion.with { group == "com.gradle" && name == "common-custom-user-data-gradle-plugin" } } - if (!ccudPluginComponent) { - if (enableGradleEnterprise) { + + if (ccudPluginVersion && atLeastGradle4) { + if (!ccudPluginComponent) { + logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script") pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS)) - } else { + } + } else { + if (!ccudPluginComponent) { logWarningMissingCommonCustomUserDataGradlePlugin() } } } pluginManager.withPlugin(BUILD_SCAN_PLUGIN_ID) { - buildScanPublishedAction(buildScan) + registerBuildScanCallbacks(buildScan) } } - if (!isScanDump) { + // todo (etst) + if (!gePluginScanDump) { projectsEvaluated { gradle -> configureGradleEnterprise(gradle.rootProject.extensions["gradleEnterprise"]) } } } else { gradle.settingsEvaluated { settings -> - if (!settings.pluginManager.hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID)) { - if (enableGradleEnterprise) { + if (gePluginVersion) { + if (!settings.pluginManager.hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID)) { + logger.quiet("Applying $GRADLE_ENTERPRISE_PLUGIN_CLASS via init script") + logger.quiet("Connection to Gradle Enterprise: $geUrl, allowUntrustedServer: $geAllowUntrustedServer") settings.pluginManager.apply(initscript.classLoader.loadClass(GRADLE_ENTERPRISE_PLUGIN_CLASS)) - } else { + extensionsWithPublicType(settings, GRADLE_ENTERPRISE_EXTENSION_CLASS).collect { settings[it.name] }.each { ext -> + ext.server = geUrl + ext.allowUntrustedServer = geAllowUntrustedServer + ext.buildScan.publishAlways() + ext.buildScan.uploadInBackground = false + } + } + } else { + if (!settings.pluginManager.hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID)) { throw new IllegalStateException("The com.gradle.enterprise plugin is missing from the project.\n" + - "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_6_x_and_later),\n" + - "or use `--enable-gradle-enterprise` when running the build validation script.") + "Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_6_x_and_later),\n" + + "or use `--enable-gradle-enterprise` when running the build validation script.") } } - if (!settings.pluginManager.hasPlugin(CCUD_PLUGIN_ID)) { - if (enableGradleEnterprise) { + + if (ccudPluginVersion) { + if (!settings.pluginManager.hasPlugin(CCUD_PLUGIN_ID)) { + logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script") settings.pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS)) - } else { + } + } else { + if (!settings.pluginManager.hasPlugin(CCUD_PLUGIN_ID)) { logWarningMissingCommonCustomUserDataGradlePlugin() } } extensionsWithPublicType(settings, GRADLE_ENTERPRISE_EXTENSION_CLASS).collect { settings[it.name] }.each { ext -> - if (!isScanDump) { + if (!gePluginScanDump) { configureGradleEnterprise(ext) } - buildScanPublishedAction(ext.buildScan) + registerBuildScanCallbacks(ext.buildScan) } } } @@ -145,6 +195,10 @@ static def extensionsWithPublicType(def container, String publicType) { container.extensions.extensionsSchema.elements.findAll { it.publicType.concreteClass.name == publicType } } +static boolean isNotAtLeast(String versionUnderTest, String referenceVersion) { + GradleVersion.version(versionUnderTest) < GradleVersion.version(referenceVersion) +} + void configureGradleEnterprise(gradleEnterprise) { gradleEnterprise.with { def serverOverride = System.getProperty("com.gradle.enterprise.build_validation.server") @@ -199,11 +253,6 @@ void logWarning(String warning) { warningFile.append(warning + "\n") } -void clearWarnings() { - def warningFile = new File(experimentDir, "warnings.txt") - warningFile.delete() -} - File getExperimentDir() { def projectProperties = gradle.startParameter.projectProperties new File(projectProperties.get("com.gradle.enterprise.build_validation.experimentDir")) From 5d664477c9780dabfb6ede0a265118ca1db4a764 Mon Sep 17 00:00:00 2001 From: Etienne Studer Date: Mon, 6 Mar 2023 18:28:09 -0500 Subject: [PATCH 16/22] Consolidate GE and BS configuration --- .../configure-gradle-enterprise.gradle | 97 ++++++++----------- 1 file changed, 43 insertions(+), 54 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index e60261ee..61024f02 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -1,5 +1,5 @@ import org.gradle.util.GradleVersion -import java.nio.charset.StandardCharsets; +import java.nio.charset.StandardCharsets // note that there is no mechanism to share code between the initscript{} block and the main script, so some logic is duplicated @@ -67,7 +67,6 @@ def getInputParam = { String name -> def geUrl = getInputParam('com.gradle.enterprise.build_validation.gradle-enterprise.url') def geAllowUntrustedServer = Boolean.parseBoolean(getInputParam('com.gradle.enterprise.build_validation.gradle-enterprise.allow-untrusted-server')) def gePluginVersion = getInputParam('com.gradle.enterprise.build_validation.gradle-enterprise.plugin.version') -def gePluginScanDump = getInputParam('com.gradle.enterprise.build_validation.gradle-enterprise.plugin.scan-dump') def ccudPluginVersion = getInputParam('com.gradle.enterprise.build_validation.ccud.plugin.version') def atLeastGradle4 = GradleVersion.current() >= GradleVersion.version('4.0') @@ -78,8 +77,8 @@ if (ccudPluginVersion && isNotAtLeast(ccudPluginVersion, '1.7')) { return } -// define a buildScanPublished listener that captures the build scan URL and id and appends it to a file -def registerBuildScanCallbacks = { def buildScan -> +// register build scan listeners to capture build scan URL/id and to track publishing errors +def registerBuildScanActions = { def buildScan -> def scanFile = new File(experimentDir, 'build-scans.csv') buildScan.buildScanPublished { publishedBuildScan -> def buildScanUri = publishedBuildScan.buildScanUri @@ -88,14 +87,35 @@ def registerBuildScanCallbacks = { def buildScan -> def baseUrl = "${buildScanUri.scheme}://${buildScanUri.host}${port}" scanFile.append("${baseUrl},${buildScanUri},${buildScanId}\n") } + def errorFile = new File(experimentDir, 'build-scan-publish-error.txt') buildScan.onError { error -> errorFile.text = error } } -// register buildScanPublished listener and optionally apply the GE / Build Scan plugin +// configure build scan publishing behavior +def configureBuildScanPublishing = { def buildScan -> + buildScan.publishAlways() + buildScan.captureTaskInputFiles = true // too late to be set here for Gradle 5, set via sys prop + if (buildScan.metaClass.respondsTo(buildScan, 'setUploadInBackground', Boolean)) buildScan.uploadInBackground = false // uploadInBackground not available for build-scan-plugin 1.16 +} + +// add custom data identifying the experiment +def addBuildScanCustomData = { def buildScan -> + def projectProperties = gradle.startParameter.projectProperties + + def expId = projectProperties.get("com.gradle.enterprise.build_validation.expId") + addCustomValueAndSearchLink(buildScan, "Experiment id", expId) + buildScan.tag(expId) + + def runId = projectProperties.get("com.gradle.enterprise.build_validation.runId") + addCustomValueAndSearchLink(buildScan, "Experiment run id", runId) +} + +// configure build scan behavior and optionally apply the GE / Build Scan / CCUD plugin if (GradleVersion.current() < GradleVersion.version('6.0')) { + //noinspection GroovyAssignabilityCheck rootProject { buildscript.configurations.getByName("classpath").incoming.afterResolve { ResolvableDependencies incoming -> def resolutionResult = incoming.resolutionResult @@ -109,10 +129,8 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { logger.quiet("Applying $BUILD_SCAN_PLUGIN_CLASS via init script") logger.quiet("Connection to Gradle Enterprise: $geUrl, allowUntrustedServer: $geAllowUntrustedServer") pluginManager.apply(initscript.classLoader.loadClass(BUILD_SCAN_PLUGIN_CLASS)) - buildScan.server = geUrl - buildScan.allowUntrustedServer = geAllowUntrustedServer - buildScan.publishAlways() - if (buildScan.metaClass.respondsTo(buildScan, 'setUploadInBackground', Boolean)) buildScan.uploadInBackground = false // uploadInBackground not available for build-scan-plugin 1.16 + if (geUrl) buildScan.server = geUrl + if (geAllowUntrustedServer) buildScan.allowUntrustedServer = geAllowUntrustedServer } } else { if (!scanPluginComponent) { @@ -139,14 +157,14 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { } pluginManager.withPlugin(BUILD_SCAN_PLUGIN_ID) { - registerBuildScanCallbacks(buildScan) - } - } - - // todo (etst) - if (!gePluginScanDump) { - projectsEvaluated { gradle -> - configureGradleEnterprise(gradle.rootProject.extensions["gradleEnterprise"]) + afterEvaluate(___ -> { + if (geUrl) buildScan.server = geUrl + if (geAllowUntrustedServer) buildScan.allowUntrustedServer = geAllowUntrustedServer + + registerBuildScanActions(buildScan) + addBuildScanCustomData(buildScan) + configureBuildScanPublishing(buildScan) + }) } } } else { @@ -157,10 +175,8 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { logger.quiet("Connection to Gradle Enterprise: $geUrl, allowUntrustedServer: $geAllowUntrustedServer") settings.pluginManager.apply(initscript.classLoader.loadClass(GRADLE_ENTERPRISE_PLUGIN_CLASS)) extensionsWithPublicType(settings, GRADLE_ENTERPRISE_EXTENSION_CLASS).collect { settings[it.name] }.each { ext -> - ext.server = geUrl - ext.allowUntrustedServer = geAllowUntrustedServer - ext.buildScan.publishAlways() - ext.buildScan.uploadInBackground = false + if (geUrl) ext.server = geUrl + if (geAllowUntrustedServer) ext.allowUntrustedServer = geAllowUntrustedServer } } } else { @@ -183,10 +199,12 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { } extensionsWithPublicType(settings, GRADLE_ENTERPRISE_EXTENSION_CLASS).collect { settings[it.name] }.each { ext -> - if (!gePluginScanDump) { - configureGradleEnterprise(ext) - } - registerBuildScanCallbacks(ext.buildScan) + if (geUrl) ext.server = geUrl + if (geAllowUntrustedServer) ext.allowUntrustedServer = geAllowUntrustedServer + + registerBuildScanActions(ext.buildScan) + addBuildScanCustomData(ext.buildScan) + configureBuildScanPublishing(ext.buildScan) } } } @@ -199,35 +217,6 @@ static boolean isNotAtLeast(String versionUnderTest, String referenceVersion) { GradleVersion.version(versionUnderTest) < GradleVersion.version(referenceVersion) } -void configureGradleEnterprise(gradleEnterprise) { - gradleEnterprise.with { - def serverOverride = System.getProperty("com.gradle.enterprise.build_validation.server") - if (serverOverride) { - server = serverOverride - } else if (!server) { - throw new IllegalStateException("A Gradle Enterprise server URL has not been configured.", null) - } - - buildScan { - // captureTaskInputFiles = true (too late to be set here for Gradle 5, set via sys prop) - uploadInBackground = false - publishAlways() - } - addCustomData(buildScan) - } -} - -void addCustomData(buildScan) { - def projectProperties = gradle.startParameter.projectProperties - - def expId = projectProperties.get("com.gradle.enterprise.build_validation.expId") - addCustomValueAndSearchLink(buildScan, "Experiment id", expId) - buildScan.tag(expId) - - def runId = projectProperties.get("com.gradle.enterprise.build_validation.runId") - addCustomValueAndSearchLink(buildScan, "Experiment run id", runId) -} - void addCustomValueAndSearchLink(buildScan, String label, String value) { buildScan.value(label, value) String server = buildScan.server From 2a93b403e2c62c27eaec254c2dc6132f7a55b728 Mon Sep 17 00:00:00 2001 From: Etienne Studer Date: Tue, 7 Mar 2023 08:34:57 -0500 Subject: [PATCH 17/22] Update sys props passed from shell script to init script --- components/scripts/lib/gradle.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/components/scripts/lib/gradle.sh b/components/scripts/lib/gradle.sh index 52bf0116..b165a158 100644 --- a/components/scripts/lib/gradle.sh +++ b/components/scripts/lib/gradle.sh @@ -13,11 +13,14 @@ invoke_gradle() { args+=(--init-script "${INIT_SCRIPTS_DIR}/configure-gradle-enterprise.gradle") if [ "$enable_ge" == "on" ]; then - args+=("-Dcom.gradle.enterprise.build_validation.enableGradleEnterprise=true") + args+=("-Dcom.gradle.enterprise.build_validation.gradle.plugin-repository.url=https://plugins.gradle.org/m2") + args+=("-Dcom.gradle.enterprise.build_validation.gradle-enterprise.plugin.version=3.12.4") + args+=("-Dcom.gradle.enterprise.build_validation.ccud.plugin.version=1.9") fi if [ -n "${ge_server}" ]; then - args+=("-Dcom.gradle.enterprise.build_validation.server=${ge_server}") + args+=("-Dcom.gradle.enterprise.build_validation.gradle-enterprise.url=${ge_server}") + args+=("-Dcom.gradle.enterprise.build_validation.gradle-enterprise.allow-untrusted-server=false") fi if [[ "${build_scan_publishing_mode}" == "off" ]]; then From a8bf91d232d3f36f7bcc86f0a041bfac2d3612f1 Mon Sep 17 00:00:00 2001 From: Etienne Studer Date: Tue, 7 Mar 2023 09:48:28 -0500 Subject: [PATCH 18/22] Fix Groovy syntax --- .../gradle-init-scripts/configure-gradle-enterprise.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index 61024f02..1c02bef6 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -157,14 +157,14 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) { } pluginManager.withPlugin(BUILD_SCAN_PLUGIN_ID) { - afterEvaluate(___ -> { + afterEvaluate { if (geUrl) buildScan.server = geUrl if (geAllowUntrustedServer) buildScan.allowUntrustedServer = geAllowUntrustedServer registerBuildScanActions(buildScan) addBuildScanCustomData(buildScan) configureBuildScanPublishing(buildScan) - }) + } } } } else { From fd81fd99e5e403f5a37c2c419749c16a2f905841 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Tue, 7 Mar 2023 12:44:36 -0500 Subject: [PATCH 19/22] Remove setting of file input capture from init script --- .../gradle-init-scripts/configure-gradle-enterprise.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index 1c02bef6..1efa6e0e 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -97,7 +97,7 @@ def registerBuildScanActions = { def buildScan -> // configure build scan publishing behavior def configureBuildScanPublishing = { def buildScan -> buildScan.publishAlways() - buildScan.captureTaskInputFiles = true // too late to be set here for Gradle 5, set via sys prop + // buildScan.captureTaskInputFiles = true // too late to be set here for Gradle 5, set via sys prop if (buildScan.metaClass.respondsTo(buildScan, 'setUploadInBackground', Boolean)) buildScan.uploadInBackground = false // uploadInBackground not available for build-scan-plugin 1.16 } From 1ad2263e0fba73761c2e49f1bda07d11d1b63299 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Tue, 7 Mar 2023 12:45:49 -0500 Subject: [PATCH 20/22] Add Build Scan link only if server is readable --- .../configure-gradle-enterprise.gradle | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index 1efa6e0e..eb5283aa 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -219,10 +219,12 @@ static boolean isNotAtLeast(String versionUnderTest, String referenceVersion) { void addCustomValueAndSearchLink(buildScan, String label, String value) { buildScan.value(label, value) - String server = buildScan.server - String searchParams = "search.names=" + urlEncode(label) + "&search.values=" + urlEncode(value) - String url = appendIfMissing(server, "/") + "scans?" + searchParams + "#selection.buildScanB=" + urlEncode("{SCAN_ID}") - buildScan.link(label + " build scans", url) + if (buildScan.metaClass.respondsTo(buildScan, 'getServer')) { + String server = buildScan.server + String searchParams = "search.names=" + urlEncode(label) + "&search.values=" + urlEncode(value) + String url = appendIfMissing(server, "/") + "scans?" + searchParams + "#selection.buildScanB=" + urlEncode("{SCAN_ID}") + buildScan.link(label + " build scans", url) + } } String appendIfMissing(String str, String suffix) { From b2f4c18fa95e374839753a826b8cbf77c5fca2da Mon Sep 17 00:00:00 2001 From: Etienne Studer Date: Tue, 7 Mar 2023 12:52:26 -0500 Subject: [PATCH 21/22] Add clarifying comment --- .../gradle-init-scripts/configure-gradle-enterprise.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index eb5283aa..5c2ea7ee 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -219,7 +219,7 @@ static boolean isNotAtLeast(String versionUnderTest, String referenceVersion) { void addCustomValueAndSearchLink(buildScan, String label, String value) { buildScan.value(label, value) - if (buildScan.metaClass.respondsTo(buildScan, 'getServer')) { + if (buildScan.metaClass.respondsTo(buildScan, 'getServer')) { // required for Gradle 4.x / build-scan-plugin 1.16 String server = buildScan.server String searchParams = "search.names=" + urlEncode(label) + "&search.values=" + urlEncode(value) String url = appendIfMissing(server, "/") + "scans?" + searchParams + "#selection.buildScanB=" + urlEncode("{SCAN_ID}") From 687a9c32fe6b069563bf8b1d573435e57adf17cf Mon Sep 17 00:00:00 2001 From: Etienne Studer Date: Tue, 7 Mar 2023 13:00:24 -0500 Subject: [PATCH 22/22] Make some methods static --- .../gradle-init-scripts/configure-gradle-enterprise.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle index 5c2ea7ee..0e197b53 100644 --- a/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle +++ b/components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle @@ -217,7 +217,7 @@ static boolean isNotAtLeast(String versionUnderTest, String referenceVersion) { GradleVersion.version(versionUnderTest) < GradleVersion.version(referenceVersion) } -void addCustomValueAndSearchLink(buildScan, String label, String value) { +static void addCustomValueAndSearchLink(buildScan, String label, String value) { buildScan.value(label, value) if (buildScan.metaClass.respondsTo(buildScan, 'getServer')) { // required for Gradle 4.x / build-scan-plugin 1.16 String server = buildScan.server @@ -227,11 +227,11 @@ void addCustomValueAndSearchLink(buildScan, String label, String value) { } } -String appendIfMissing(String str, String suffix) { +static String appendIfMissing(String str, String suffix) { return str.endsWith(suffix) ? str : str + suffix } -String urlEncode(String str) { +static String urlEncode(String str) { return URLEncoder.encode(str, StandardCharsets.UTF_8.name()) }