Skip to content

Commit 9c12129

Browse files
committed
Refactor init-script to be more similar to gold standard
1 parent 885a927 commit 9c12129

File tree

1 file changed

+83
-68
lines changed

1 file changed

+83
-68
lines changed

components/scripts/gradle/gradle-init-scripts/configure-gradle-enterprise.gradle

Lines changed: 83 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,78 @@
11
import org.gradle.util.GradleVersion
22
import java.nio.charset.StandardCharsets;
33

4-
// Don't run against the included builds (if the main build has any).
4+
if (GradleVersion.current() < GradleVersion.version("5.0")) {
5+
throw new IllegalStateException("Build validation not supported for Gradle ${GradleVersion.current()}. Upgrade your project's build to Gradle 5 or newer.")
6+
}
7+
8+
// note that there is no mechanism to share code between the initscript{} block and the main script, so some logic is duplicated
9+
10+
// conditionally apply the GE / Build Scan plugin to the classpath so it can be applied to the build further down in this script
511
initscript {
612
def isTopLevelBuild = !gradle.parent
713
if (!isTopLevelBuild) {
814
return
915
}
1016

11-
def enableGradleEnterprise = System.getProperty("com.gradle.enterprise.build_validation.enableGradleEnterprise")
12-
if (!enableGradleEnterprise) {
13-
return
14-
}
17+
def enableGradleEnterprise = Boolean.getBoolean("com.gradle.enterprise.build_validation.enableGradleEnterprise")
1518

16-
def gradleEnterprisePluginVersion = "3.10.3"
17-
def commonCustomUserDataPluginVersion = "1.7.2"
19+
def gePluginVersion = enableGradleEnterprise ? "3.10.3" : null
20+
def ccudPluginVersion = enableGradleEnterprise ? "1.7.2" : null
1821

1922
repositories {
2023
gradlePluginPortal()
2124
}
2225

2326
dependencies {
24-
classpath("com.gradle:gradle-enterprise-gradle-plugin:${gradleEnterprisePluginVersion}")
25-
classpath("com.gradle:common-custom-user-data-gradle-plugin:${commonCustomUserDataPluginVersion}")
26-
}
27-
}
27+
if (gePluginVersion) {
28+
classpath "com.gradle:gradle-enterprise-gradle-plugin:$gePluginVersion"
29+
}
2830

29-
// Don't run against the included builds (if the main build has any).
30-
def isTopLevelBuild = !gradle.parent
31-
if (!isTopLevelBuild) {
32-
return
31+
if (ccudPluginVersion) {
32+
classpath "com.gradle:common-custom-user-data-gradle-plugin:$ccudPluginVersion"
33+
}
34+
}
3335
}
3436

37+
def BUILD_SCAN_PLUGIN_ID = 'com.gradle.build-scan'
3538
def BUILD_SCAN_PLUGIN_CLASS = 'com.gradle.scan.plugin.BuildScanPlugin'
3639

3740
def GRADLE_ENTERPRISE_PLUGIN_ID = 'com.gradle.enterprise'
3841
def GRADLE_ENTERPRISE_PLUGIN_CLASS = 'com.gradle.enterprise.gradleplugin.GradleEnterprisePlugin'
42+
def GRADLE_ENTERPRISE_EXTENSION_CLASS = 'com.gradle.enterprise.gradleplugin.GradleEnterpriseExtension'
3943

4044
def CCUD_PLUGIN_ID = 'com.gradle.common-custom-user-data-gradle-plugin'
4145
def CCUD_PLUGIN_CLASS = 'com.gradle.CommonCustomUserDataGradlePlugin'
4246

43-
def enableGradleEnterprise = System.getProperty("com.gradle.enterprise.build_validation.enableGradleEnterprise")
47+
def isTopLevelBuild = !gradle.parent
48+
if (!isTopLevelBuild) {
49+
return
50+
}
4451

45-
def version = GradleVersion.current().baseVersion
46-
def atLeastGradle5 = version >= GradleVersion.version("5.0")
47-
def atLeastGradle6 = version >= GradleVersion.version("6.0")
52+
def enableGradleEnterprise = Boolean.getBoolean("com.gradle.enterprise.build_validation.enableGradleEnterprise")
4853

4954
clearWarnings()
5055

51-
if (atLeastGradle6) {
52-
settingsEvaluated { settings ->
53-
if (!settings.pluginManager.hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID)) {
54-
if (enableGradleEnterprise) {
55-
logger.quiet("Applying $GRADLE_ENTERPRISE_PLUGIN_CLASS via init script")
56-
settings.pluginManager.apply(initscript.classLoader.loadClass(GRADLE_ENTERPRISE_PLUGIN_CLASS))
57-
} else {
58-
throw new IllegalStateException("The com.gradle.enterprise plugin is missing from the project.\n" +
59-
"Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_6_x_and_later),\n" +
60-
"or use `--enable-gradle-enterprise` when running the build validation script.")
61-
}
56+
// define a buildScanPublished listener that captures the build scan URL and sends it in a message to the server
57+
def buildScanPublishedAction = { def buildScan, rootProjectName ->
58+
if (buildScan.metaClass.respondsTo(buildScan, 'buildScanPublished', Action)) {
59+
def scanFile = new File(experimentDir, "build-scans.csv")
60+
buildScan.buildScanPublished { publishedBuildScan ->
61+
def buildScanUri = publishedBuildScan.buildScanUri
62+
def buildScanId = publishedBuildScan.buildScanId
63+
def port = (buildScanUri.port != -1) ? ":" + buildScanUri.port : ""
64+
def baseUrl = "${buildScanUri.scheme}://${buildScanUri.host}${port}"
65+
scanFile.append("${rootProjectName},${baseUrl},${buildScanUri},${buildScanId}\n")
6266
}
63-
if (!settings.pluginManager.hasPlugin(CCUD_PLUGIN_ID)) {
64-
if (enableGradleEnterprise) {
65-
logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script")
66-
settings.pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS))
67-
} else {
68-
logWarningMissingCommonCustomUserDataGradlePlugin()
69-
}
67+
def errorFile = new File(experimentDir, "build-scan-publish-error.txt")
68+
buildScan.onError { error ->
69+
errorFile.text = error
7070
}
71-
72-
configureGradleEnterprise(settings.extensions["gradleEnterprise"], settings.rootProject.name)
7371
}
74-
} else if (atLeastGradle5) {
72+
}
73+
74+
// register buildScanPublished listener and optionally apply the GE / Build Scan plugin
75+
if (GradleVersion.current() < GradleVersion.version('6.0')) {
7576
rootProject {
7677
buildscript.configurations.getByName("classpath").incoming.afterResolve { ResolvableDependencies incoming ->
7778
def resolutionResult = incoming.resolutionResult
@@ -102,51 +103,65 @@ if (atLeastGradle6) {
102103
}
103104
}
104105
}
106+
107+
pluginManager.withPlugin(BUILD_SCAN_PLUGIN_ID) {
108+
buildScanPublishedAction(buildScan, gradle.rootProject.name)
109+
}
105110
}
106111

107112
projectsEvaluated { gradle ->
108-
configureGradleEnterprise(gradle.rootProject.extensions["gradleEnterprise"], gradle.rootProject.name)
113+
configureGradleEnterprise(gradle.rootProject.extensions["gradleEnterprise"])
109114
}
110115
} else {
111-
throw new IllegalStateException("Build validation not supported for Gradle ${GradleVersion.current()}. Upgrade your project's build to Gradle 5 or newer.")
116+
gradle.settingsEvaluated { settings ->
117+
if (!settings.pluginManager.hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID)) {
118+
if (enableGradleEnterprise) {
119+
logger.quiet("Applying $GRADLE_ENTERPRISE_PLUGIN_CLASS via init script")
120+
settings.pluginManager.apply(initscript.classLoader.loadClass(GRADLE_ENTERPRISE_PLUGIN_CLASS))
121+
} else {
122+
throw new IllegalStateException("The com.gradle.enterprise plugin is missing from the project.\n" +
123+
"Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_6_x_and_later),\n" +
124+
"or use `--enable-gradle-enterprise` when running the build validation script.")
125+
}
126+
}
127+
if (!settings.pluginManager.hasPlugin(CCUD_PLUGIN_ID)) {
128+
if (enableGradleEnterprise) {
129+
logger.quiet("Applying $CCUD_PLUGIN_CLASS via init script")
130+
settings.pluginManager.apply(initscript.classLoader.loadClass(CCUD_PLUGIN_CLASS))
131+
} else {
132+
logWarningMissingCommonCustomUserDataGradlePlugin()
133+
}
134+
}
135+
136+
extensionsWithPublicType(settings, GRADLE_ENTERPRISE_EXTENSION_CLASS).collect { settings[it.name] }.each { ext ->
137+
configureGradleEnterprise(ext)
138+
buildScanPublishedAction(ext.buildScan, settings.rootProject.name)
139+
}
140+
}
112141
}
113142

114-
void configureGradleEnterprise(gradleEnterprise, rootProjectName) {
143+
static def extensionsWithPublicType(def container, String publicType) {
144+
container.extensions.extensionsSchema.elements.findAll { it.publicType.concreteClass.name == publicType }
145+
}
146+
147+
void configureGradleEnterprise(gradleEnterprise) {
115148
gradleEnterprise.with {
116-
buildScan {
117-
def serverOverride = System.getProperty("com.gradle.enterprise.build_validation.server")
118-
if (serverOverride) {
119-
server = serverOverride
120-
} else if (!server) {
121-
throw new IllegalStateException("A Gradle Enterprise server URL has not been configured.", null)
122-
}
149+
def serverOverride = System.getProperty("com.gradle.enterprise.build_validation.server")
150+
if (serverOverride) {
151+
server = serverOverride
152+
} else if (!server) {
153+
throw new IllegalStateException("A Gradle Enterprise server URL has not been configured.", null)
154+
}
123155

156+
buildScan {
124157
// captureTaskInputFiles = true (too late to be set here for Gradle 5, set via sys prop)
125158
uploadInBackground = false
126159
publishAlways()
127160
}
128-
captureBuildScanLinks(buildScan, rootProjectName)
129161
addCustomData(buildScan)
130162
}
131163
}
132164

133-
def captureBuildScanLinks(buildScan, rootProjectName) {
134-
buildScan.with {
135-
def scanFile = new File(experimentDir, "build-scans.csv")
136-
buildScanPublished { publishedBuildScan ->
137-
def buildScanUri = publishedBuildScan.buildScanUri
138-
def buildScanId = publishedBuildScan.buildScanId
139-
def port = (buildScanUri.port != -1) ? ":" + buildScanUri.port : ""
140-
def baseUrl = "${buildScanUri.scheme}://${buildScanUri.host}${port}"
141-
scanFile.append("${rootProjectName},${baseUrl},${buildScanUri},${buildScanId}\n")
142-
}
143-
def errorFile = new File(experimentDir, "build-scan-publish-error.txt")
144-
onError { error ->
145-
errorFile.text = error
146-
}
147-
}
148-
}
149-
150165
void addCustomData(buildScan) {
151166
def projectProperties = gradle.startParameter.projectProperties
152167

0 commit comments

Comments
 (0)