1
1
import org.gradle.util.GradleVersion
2
- import java.nio.charset.StandardCharsets ;
3
-
4
- if (GradleVersion . current() < GradleVersion . version(" 5.0" )) {
5
- 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." )
6
- }
2
+ import java.nio.charset.StandardCharsets
7
3
8
4
// note that there is no mechanism to share code between the initscript{} block and the main script, so some logic is duplicated
9
5
@@ -14,21 +10,35 @@ initscript {
14
10
return
15
11
}
16
12
17
- def enableGradleEnterprise = Boolean . getBoolean(" com.gradle.enterprise.build_validation.enableGradleEnterprise" )
13
+ def getInputParam = { String name ->
14
+ def envVarName = name. toUpperCase(). replace(' .' , ' _' ). replace(' -' , ' _' )
15
+ return System . getProperty(name) ?: System . getenv(envVarName)
16
+ }
17
+
18
+ def pluginRepositoryUrl = getInputParam(' com.gradle.enterprise.build_validation.gradle.plugin-repository.url' )
19
+ def gePluginVersion = getInputParam(' com.gradle.enterprise.build_validation.gradle-enterprise.plugin.version' )
20
+ def ccudPluginVersion = getInputParam(' com.gradle.enterprise.build_validation.ccud.plugin.version' )
21
+
22
+ def atLeastGradle5 = GradleVersion . current() >= GradleVersion . version(' 5.0' )
23
+ def atLeastGradle4 = GradleVersion . current() >= GradleVersion . version(' 4.0' )
18
24
19
- def gePluginVersion = enableGradleEnterprise ? " 3.12.4" : null
20
- def ccudPluginVersion = enableGradleEnterprise ? " 1.9" : null
25
+ if (gePluginVersion || ccudPluginVersion && atLeastGradle4) {
26
+ pluginRepositoryUrl = pluginRepositoryUrl ?: ' https://plugins.gradle.org/m2'
27
+ logger. quiet(" Gradle Enterprise plugins resolution: $pluginRepositoryUrl " )
21
28
22
- repositories {
23
- gradlePluginPortal()
29
+ repositories {
30
+ maven { url pluginRepositoryUrl }
31
+ }
24
32
}
25
33
26
34
dependencies {
27
35
if (gePluginVersion) {
28
- classpath " com.gradle:gradle-enterprise-gradle-plugin:$gePluginVersion "
36
+ classpath atLeastGradle5 ?
37
+ " com.gradle:gradle-enterprise-gradle-plugin:$gePluginVersion " :
38
+ " com.gradle:build-scan-plugin:1.16"
29
39
}
30
40
31
- if (ccudPluginVersion) {
41
+ if (ccudPluginVersion && atLeastGradle4 ) {
32
42
classpath " com.gradle:common-custom-user-data-gradle-plugin:$ccudPluginVersion "
33
43
}
34
44
}
@@ -49,94 +59,152 @@ if (!isTopLevelBuild) {
49
59
return
50
60
}
51
61
52
- def enableGradleEnterprise = Boolean . getBoolean(" com.gradle.enterprise.build_validation.enableGradleEnterprise" )
53
- def isScanDump = System . properties. containsKey(" scan.dump" )
62
+ def getInputParam = { String name ->
63
+ def envVarName = name. toUpperCase(). replace(' .' , ' _' ). replace(' -' , ' _' )
64
+ return System . getProperty(name) ?: System . getenv(envVarName)
65
+ }
54
66
55
- clearWarnings()
67
+ def geUrl = getInputParam(' com.gradle.enterprise.build_validation.gradle-enterprise.url' )
68
+ def geAllowUntrustedServer = Boolean . parseBoolean(getInputParam(' com.gradle.enterprise.build_validation.gradle-enterprise.allow-untrusted-server' ))
69
+ def gePluginVersion = getInputParam(' com.gradle.enterprise.build_validation.gradle-enterprise.plugin.version' )
70
+ def ccudPluginVersion = getInputParam(' com.gradle.enterprise.build_validation.ccud.plugin.version' )
56
71
57
- // define a buildScanPublished listener that captures the build scan data and appends to a file
58
- def buildScanPublishedAction = { def buildScan ->
59
- if (buildScan. metaClass. respondsTo(buildScan, ' buildScanPublished' , Action )) {
60
- def scanFile = new File (experimentDir, " build-scans.csv" )
61
- buildScan. buildScanPublished { publishedBuildScan ->
62
- def buildScanUri = publishedBuildScan. buildScanUri
63
- def buildScanId = publishedBuildScan. buildScanId
64
- def port = (buildScanUri. port != -1 ) ? " :" + buildScanUri. port : " "
65
- def baseUrl = " ${ buildScanUri.scheme} ://${ buildScanUri.host}${ port} "
66
- scanFile. append(" ${ baseUrl} ,${ buildScanUri} ,${ buildScanId} \n " )
67
- }
68
- def errorFile = new File (experimentDir, " build-scan-publish-error.txt" )
69
- buildScan. onError { error ->
70
- errorFile. text = error
71
- }
72
+ def atLeastGradle4 = GradleVersion . current() >= GradleVersion . version(' 4.0' )
73
+
74
+ // finish early if configuration parameters passed in via system properties are not valid/supported
75
+ if (ccudPluginVersion && isNotAtLeast(ccudPluginVersion, ' 1.7' )) {
76
+ logger. warn(" Common Custom User Data Gradle plugin must be at least 1.7. Configured version is $ccudPluginVersion . " )
77
+ return
78
+ }
79
+
80
+ // register build scan listeners to capture build scan URL/id and to track publishing errors
81
+ def registerBuildScanActions = { def buildScan ->
82
+ def scanFile = new File (experimentDir, ' build-scans.csv' )
83
+ buildScan. buildScanPublished { publishedBuildScan ->
84
+ def buildScanUri = publishedBuildScan. buildScanUri
85
+ def buildScanId = publishedBuildScan. buildScanId
86
+ def port = (buildScanUri. port != -1 ) ? ' :' + buildScanUri. port : ' '
87
+ def baseUrl = " ${ buildScanUri.scheme} ://${ buildScanUri.host}${ port} "
88
+ scanFile. append(" ${ baseUrl} ,${ buildScanUri} ,${ buildScanId} \n " )
89
+ }
90
+
91
+ def errorFile = new File (experimentDir, ' build-scan-publish-error.txt' )
92
+ buildScan. onError { error ->
93
+ errorFile. text = error
72
94
}
73
95
}
74
96
75
- // register buildScanPublished listener and optionally apply the GE / Build Scan plugin
97
+ // configure build scan publishing behavior
98
+ def configureBuildScanPublishing = { def buildScan ->
99
+ buildScan. publishAlways()
100
+ // buildScan.captureTaskInputFiles = true // too late to be set here for Gradle 5, set via sys prop
101
+ if (buildScan. metaClass. respondsTo(buildScan, ' setUploadInBackground' , Boolean )) buildScan. uploadInBackground = false // uploadInBackground not available for build-scan-plugin 1.16
102
+ }
103
+
104
+ // add custom data identifying the experiment
105
+ def addBuildScanCustomData = { def buildScan ->
106
+ def projectProperties = gradle. startParameter. projectProperties
107
+
108
+ def expId = projectProperties. get(" com.gradle.enterprise.build_validation.expId" )
109
+ addCustomValueAndSearchLink(buildScan, " Experiment id" , expId)
110
+ buildScan. tag(expId)
111
+
112
+ def runId = projectProperties. get(" com.gradle.enterprise.build_validation.runId" )
113
+ addCustomValueAndSearchLink(buildScan, " Experiment run id" , runId)
114
+ }
115
+
116
+ // configure build scan behavior and optionally apply the GE / Build Scan / CCUD plugin
76
117
if (GradleVersion . current() < GradleVersion . version(' 6.0' )) {
118
+ // noinspection GroovyAssignabilityCheck
77
119
rootProject {
78
120
buildscript. configurations. getByName(" classpath" ). incoming. afterResolve { ResolvableDependencies incoming ->
79
121
def resolutionResult = incoming. resolutionResult
80
122
81
123
def scanPluginComponent = resolutionResult. allComponents. find {
82
124
it. moduleVersion. with { group == " com.gradle" && (name == " build-scan-plugin" || name == " gradle-enterprise-gradle-plugin" ) }
83
125
}
84
- if (! scanPluginComponent) {
85
- if (enableGradleEnterprise) {
126
+
127
+ if (gePluginVersion) {
128
+ if (! scanPluginComponent) {
129
+ logger. quiet(" Applying $BUILD_SCAN_PLUGIN_CLASS via init script" )
130
+ logger. quiet(" Connection to Gradle Enterprise: $geUrl , allowUntrustedServer: $geAllowUntrustedServer " )
86
131
pluginManager. apply(initscript. classLoader. loadClass(BUILD_SCAN_PLUGIN_CLASS ))
87
- } else {
132
+ if (geUrl) buildScan. server = geUrl
133
+ if (geAllowUntrustedServer) buildScan. allowUntrustedServer = geAllowUntrustedServer
134
+ }
135
+ } else {
136
+ if (! scanPluginComponent) {
88
137
throw new IllegalStateException (" The com.gradle.build-scan plugin is missing from the project.\n " +
89
- " Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_5_x),\n " +
90
- " or use `--enable-gradle-enterprise` when running the build validation script." )
138
+ " Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_5_x) to the project ,\n " +
139
+ " or use `--enable-gradle-enterprise` when running the build validation script." )
91
140
}
92
141
}
93
142
94
143
def ccudPluginComponent = resolutionResult. allComponents. find {
95
144
it. moduleVersion. with { group == " com.gradle" && name == " common-custom-user-data-gradle-plugin" }
96
145
}
97
- if (! ccudPluginComponent) {
98
- if (enableGradleEnterprise) {
146
+
147
+ if (ccudPluginVersion && atLeastGradle4) {
148
+ if (! ccudPluginComponent) {
149
+ logger. quiet(" Applying $CCUD_PLUGIN_CLASS via init script" )
99
150
pluginManager. apply(initscript. classLoader. loadClass(CCUD_PLUGIN_CLASS ))
100
- } else {
151
+ }
152
+ } else {
153
+ if (! ccudPluginComponent) {
101
154
logWarningMissingCommonCustomUserDataGradlePlugin()
102
155
}
103
156
}
104
157
}
105
158
106
159
pluginManager. withPlugin(BUILD_SCAN_PLUGIN_ID ) {
107
- buildScanPublishedAction(buildScan)
108
- }
109
- }
160
+ afterEvaluate {
161
+ if (geUrl) buildScan . server = geUrl
162
+ if (geAllowUntrustedServer) buildScan . allowUntrustedServer = geAllowUntrustedServer
110
163
111
- if (! isScanDump) {
112
- projectsEvaluated { gradle ->
113
- configureGradleEnterprise(gradle. rootProject. extensions[" gradleEnterprise" ])
164
+ registerBuildScanActions(buildScan)
165
+ addBuildScanCustomData(buildScan)
166
+ configureBuildScanPublishing(buildScan)
167
+ }
114
168
}
115
169
}
116
170
} else {
117
171
gradle. settingsEvaluated { settings ->
118
- if (! settings. pluginManager. hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID )) {
119
- if (enableGradleEnterprise) {
172
+ if (gePluginVersion) {
173
+ if (! settings. pluginManager. hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID )) {
174
+ logger. quiet(" Applying $GRADLE_ENTERPRISE_PLUGIN_CLASS via init script" )
175
+ logger. quiet(" Connection to Gradle Enterprise: $geUrl , allowUntrustedServer: $geAllowUntrustedServer " )
120
176
settings. pluginManager. apply(initscript. classLoader. loadClass(GRADLE_ENTERPRISE_PLUGIN_CLASS ))
121
- } else {
177
+ extensionsWithPublicType(settings, GRADLE_ENTERPRISE_EXTENSION_CLASS ). collect { settings[it. name] }. each { ext ->
178
+ if (geUrl) ext. server = geUrl
179
+ if (geAllowUntrustedServer) ext. allowUntrustedServer = geAllowUntrustedServer
180
+ }
181
+ }
182
+ } else {
183
+ if (! settings. pluginManager. hasPlugin(GRADLE_ENTERPRISE_PLUGIN_ID )) {
122
184
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." )
185
+ " Either apply it directly (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_6_x_and_later),\n " +
186
+ " or use `--enable-gradle-enterprise` when running the build validation script." )
125
187
}
126
188
}
127
- if (! settings. pluginManager. hasPlugin(CCUD_PLUGIN_ID )) {
128
- if (enableGradleEnterprise) {
189
+
190
+ if (ccudPluginVersion) {
191
+ if (! settings. pluginManager. hasPlugin(CCUD_PLUGIN_ID )) {
192
+ logger. quiet(" Applying $CCUD_PLUGIN_CLASS via init script" )
129
193
settings. pluginManager. apply(initscript. classLoader. loadClass(CCUD_PLUGIN_CLASS ))
130
- } else {
194
+ }
195
+ } else {
196
+ if (! settings. pluginManager. hasPlugin(CCUD_PLUGIN_ID )) {
131
197
logWarningMissingCommonCustomUserDataGradlePlugin()
132
198
}
133
199
}
134
200
135
201
extensionsWithPublicType(settings, GRADLE_ENTERPRISE_EXTENSION_CLASS ). collect { settings[it. name] }. each { ext ->
136
- if (! isScanDump) {
137
- configureGradleEnterprise(ext)
138
- }
139
- buildScanPublishedAction(ext. buildScan)
202
+ if (geUrl) ext. server = geUrl
203
+ if (geAllowUntrustedServer) ext. allowUntrustedServer = geAllowUntrustedServer
204
+
205
+ registerBuildScanActions(ext. buildScan)
206
+ addBuildScanCustomData(ext. buildScan)
207
+ configureBuildScanPublishing(ext. buildScan)
140
208
}
141
209
}
142
210
}
@@ -145,48 +213,25 @@ static def extensionsWithPublicType(def container, String publicType) {
145
213
container. extensions. extensionsSchema. elements. findAll { it. publicType. concreteClass. name == publicType }
146
214
}
147
215
148
- void configureGradleEnterprise (gradleEnterprise ) {
149
- gradleEnterprise. with {
150
- def serverOverride = System . getProperty(" com.gradle.enterprise.build_validation.server" )
151
- if (serverOverride) {
152
- server = serverOverride
153
- } else if (! server) {
154
- throw new IllegalStateException (" A Gradle Enterprise server URL has not been configured." , null )
155
- }
156
-
157
- buildScan {
158
- // captureTaskInputFiles = true (too late to be set here for Gradle 5, set via sys prop)
159
- uploadInBackground = false
160
- publishAlways()
161
- }
162
- addCustomData(buildScan)
163
- }
164
- }
165
-
166
- void addCustomData (buildScan ) {
167
- def projectProperties = gradle. startParameter. projectProperties
168
-
169
- def expId = projectProperties. get(" com.gradle.enterprise.build_validation.expId" )
170
- addCustomValueAndSearchLink(buildScan, " Experiment id" , expId)
171
- buildScan. tag(expId)
172
-
173
- def runId = projectProperties. get(" com.gradle.enterprise.build_validation.runId" )
174
- addCustomValueAndSearchLink(buildScan, " Experiment run id" , runId)
216
+ static boolean isNotAtLeast (String versionUnderTest , String referenceVersion ) {
217
+ GradleVersion . version(versionUnderTest) < GradleVersion . version(referenceVersion)
175
218
}
176
219
177
- void addCustomValueAndSearchLink (buildScan , String label , String value ) {
220
+ static void addCustomValueAndSearchLink (buildScan , String label , String value ) {
178
221
buildScan. value(label, value)
179
- String server = buildScan. server
180
- String searchParams = " search.names=" + urlEncode(label) + " &search.values=" + urlEncode(value)
181
- String url = appendIfMissing(server, " /" ) + " scans?" + searchParams + " #selection.buildScanB=" + urlEncode(" {SCAN_ID}" )
182
- buildScan. link(label + " build scans" , url)
222
+ if (buildScan. metaClass. respondsTo(buildScan, ' getServer' )) { // required for Gradle 4.x / build-scan-plugin 1.16
223
+ String server = buildScan. server
224
+ String searchParams = " search.names=" + urlEncode(label) + " &search.values=" + urlEncode(value)
225
+ String url = appendIfMissing(server, " /" ) + " scans?" + searchParams + " #selection.buildScanB=" + urlEncode(" {SCAN_ID}" )
226
+ buildScan. link(label + " build scans" , url)
227
+ }
183
228
}
184
229
185
- String appendIfMissing (String str , String suffix ) {
230
+ static String appendIfMissing (String str , String suffix ) {
186
231
return str. endsWith(suffix) ? str : str + suffix
187
232
}
188
233
189
- String urlEncode (String str ) {
234
+ static String urlEncode (String str ) {
190
235
return URLEncoder . encode(str, StandardCharsets . UTF_8 . name())
191
236
}
192
237
@@ -199,11 +244,6 @@ void logWarning(String warning) {
199
244
warningFile. append(warning + " \n " )
200
245
}
201
246
202
- void clearWarnings () {
203
- def warningFile = new File (experimentDir, " warnings.txt" )
204
- warningFile. delete()
205
- }
206
-
207
247
File getExperimentDir () {
208
248
def projectProperties = gradle. startParameter. projectProperties
209
249
new File (projectProperties. get(" com.gradle.enterprise.build_validation.experimentDir" ))
0 commit comments