Merge pull request #304 from gradle/dd/test-init-scripts
Improve init scripts and add test coverage The build-scan-capture init script will now capture results from builds that do not publish a build-scan, with and without the configuration-cache. Fixes #292
This commit is contained in:
		
						commit
						44e1837ae3
					
				
							
								
								
									
										23
									
								
								.github/workflows/ci-init-script-check.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.github/workflows/ci-init-script-check.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | name: CI-init-script-check | ||||||
|  | 
 | ||||||
|  | on: | ||||||
|  |   push: | ||||||
|  | 
 | ||||||
|  | jobs: | ||||||
|  |   test-init-scripts: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     steps: | ||||||
|  |     - name: Checkout sources | ||||||
|  |       uses: actions/checkout@v3 | ||||||
|  |     - name: Setup Java | ||||||
|  |       uses: actions/setup-java@v3 | ||||||
|  |       with: | ||||||
|  |         distribution: temurin | ||||||
|  |         java-version: 8 | ||||||
|  |     - name: Setup Gradle | ||||||
|  |       uses: ./ | ||||||
|  |       with: | ||||||
|  |         cache-read-only: false # For testing, allow writing cache entries on non-default branches | ||||||
|  |     - name: Run integration tests | ||||||
|  |       working-directory: test/test-init-scripts | ||||||
|  |       run: ./gradlew check | ||||||
							
								
								
									
										5
									
								
								.github/workflows/demo-job-summary.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.github/workflows/demo-job-summary.yml
									
									
									
									
										vendored
									
									
								
							| @ -23,10 +23,13 @@ jobs: | |||||||
|     - name: Build kotlin-dsl project |     - name: Build kotlin-dsl project | ||||||
|       working-directory: .github/workflow-samples/kotlin-dsl |       working-directory: .github/workflow-samples/kotlin-dsl | ||||||
|       run: ./gradlew assemble |       run: ./gradlew assemble | ||||||
|  |     - name: Build kotlin-dsl project without build scan | ||||||
|  |       working-directory: .github/workflow-samples/kotlin-dsl | ||||||
|  |       run: ./gradlew check --no-scan | ||||||
|     - name: Build groovy-dsl project |     - name: Build groovy-dsl project | ||||||
|       working-directory: .github/workflow-samples/groovy-dsl |       working-directory: .github/workflow-samples/groovy-dsl | ||||||
|       run: ./gradlew assemble |       run: ./gradlew assemble | ||||||
|     - name: Build kotlin-dsl project again |     - name: Build kotlin-dsl project with multiple gradle invocations | ||||||
|       working-directory: .github/workflow-samples/kotlin-dsl |       working-directory: .github/workflow-samples/kotlin-dsl | ||||||
|       run: |  |       run: |  | ||||||
|          ./gradlew tasks --no-daemon |          ./gradlew tasks --no-daemon | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								.github/workflows/integ-test-execution.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.github/workflows/integ-test-execution.yml
									
									
									
									
										vendored
									
									
								
							| @ -56,19 +56,26 @@ jobs: | |||||||
|   gradle-versions: |   gradle-versions: | ||||||
|     strategy: |     strategy: | ||||||
|       matrix: |       matrix: | ||||||
|         gradle: [7.3, 6.9, 5.6.4, 4.10.3] |         gradle: [7.3, 6.9, 5.6.4, 4.10.3, 3.5.1] | ||||||
|         os: ${{fromJSON(inputs.runner-os)}} |         os: ${{fromJSON(inputs.runner-os)}} | ||||||
|         include: |         include: | ||||||
|           - gradle: 5.6.4 |           - gradle: 5.6.4 | ||||||
|             build-root-suffix: -gradle-5 |             build-root-suffix: -gradle-5 | ||||||
|           - gradle: 4.10.3 |           - gradle: 4.10.3 | ||||||
|             build-root-suffix: -gradle-4 |             build-root-suffix: -gradle-4 | ||||||
|  |           - gradle: 3.5.1 | ||||||
|  |             build-root-suffix: -gradle-4 | ||||||
|     runs-on: ${{ matrix.os }} |     runs-on: ${{ matrix.os }} | ||||||
|     steps: |     steps: | ||||||
|     - name: Checkout sources |     - name: Checkout sources | ||||||
|       uses: actions/checkout@v3 |       uses: actions/checkout@v3 | ||||||
|     - name: Download distribution if required |     - name: Download distribution if required | ||||||
|       uses: ./.github/actions/download-dist |       uses: ./.github/actions/download-dist | ||||||
|  |     - name: Setup Java | ||||||
|  |       uses: actions/setup-java@v3 | ||||||
|  |       with: | ||||||
|  |         distribution: temurin | ||||||
|  |         java-version: 8 | ||||||
|     - name: Run Gradle build |     - name: Run Gradle build | ||||||
|       uses: ./ |       uses: ./ | ||||||
|       id: gradle |       id: gradle | ||||||
|  | |||||||
| @ -59,19 +59,26 @@ jobs: | |||||||
|   gradle-versions: |   gradle-versions: | ||||||
|     strategy: |     strategy: | ||||||
|       matrix: |       matrix: | ||||||
|         gradle: [7.3, 6.9, 5.6.4, 4.10.3] |         gradle: [7.3, 6.9, 5.6.4, 4.10.3, 3.5.1] | ||||||
|         os: ${{fromJSON(inputs.runner-os)}} |         os: ${{fromJSON(inputs.runner-os)}} | ||||||
|         include: |         include: | ||||||
|           - gradle: 5.6.4 |           - gradle: 5.6.4 | ||||||
|             build-root-suffix: -gradle-5 |             build-root-suffix: -gradle-5 | ||||||
|           - gradle: 4.10.3 |           - gradle: 4.10.3 | ||||||
|             build-root-suffix: -gradle-4 |             build-root-suffix: -gradle-4 | ||||||
|  |           - gradle: 3.5.1 | ||||||
|  |             build-root-suffix: -gradle-4 | ||||||
|     runs-on: ${{ matrix.os }} |     runs-on: ${{ matrix.os }} | ||||||
|     steps: |     steps: | ||||||
|     - name: Checkout sources |     - name: Checkout sources | ||||||
|       uses: actions/checkout@v3 |       uses: actions/checkout@v3 | ||||||
|     - name: Download distribution if required |     - name: Download distribution if required | ||||||
|       uses: ./.github/actions/download-dist |       uses: ./.github/actions/download-dist | ||||||
|  |     - name: Setup Java | ||||||
|  |       uses: actions/setup-java@v3 | ||||||
|  |       with: | ||||||
|  |         distribution: temurin | ||||||
|  |         java-version: 8 | ||||||
|     - name: Setup Gradle |     - name: Setup Gradle | ||||||
|       uses: ./ |       uses: ./ | ||||||
|       with: |       with: | ||||||
|  | |||||||
							
								
								
									
										17
									
								
								dist/main/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								dist/main/index.js
									
									
									
									
										vendored
									
									
								
							| @ -64967,6 +64967,7 @@ class GradleStateCache { | |||||||
|         fs_1.default.appendFileSync(propertiesFile, 'org.gradle.daemon=false'); |         fs_1.default.appendFileSync(propertiesFile, 'org.gradle.daemon=false'); | ||||||
|         const initScriptFilenames = [ |         const initScriptFilenames = [ | ||||||
|             'build-result-capture.init.gradle', |             'build-result-capture.init.gradle', | ||||||
|  |             'build-result-capture-service.plugin.groovy', | ||||||
|             'project-root-capture.init.gradle', |             'project-root-capture.init.gradle', | ||||||
|             'project-root-capture.plugin.groovy' |             'project-root-capture.plugin.groovy' | ||||||
|         ]; |         ]; | ||||||
| @ -65291,7 +65292,7 @@ class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor { | |||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|     getProjectRoots() { |     getProjectRoots() { | ||||||
|         const projectList = path_1.default.resolve(this.gradleUserHome, cache_base_1.PROJECT_ROOTS_FILE); |         const projectList = path_1.default.resolve(process.env['RUNNER_TEMP'], cache_base_1.PROJECT_ROOTS_FILE); | ||||||
|         if (!fs_1.default.existsSync(projectList)) { |         if (!fs_1.default.existsSync(projectList)) { | ||||||
|             core.info(`Missing project list file ${projectList}`); |             core.info(`Missing project list file ${projectList}`); | ||||||
|             return []; |             return []; | ||||||
| @ -65559,7 +65560,7 @@ function isCacheDisabled() { | |||||||
| } | } | ||||||
| exports.isCacheDisabled = isCacheDisabled; | exports.isCacheDisabled = isCacheDisabled; | ||||||
| function isCacheReadOnly() { | function isCacheReadOnly() { | ||||||
|     return core.getBooleanInput(CACHE_READONLY_PARAMETER); |     return !isCacheWriteOnly() && core.getBooleanInput(CACHE_READONLY_PARAMETER); | ||||||
| } | } | ||||||
| exports.isCacheReadOnly = isCacheReadOnly; | exports.isCacheReadOnly = isCacheReadOnly; | ||||||
| function isCacheWriteOnly() { | function isCacheWriteOnly() { | ||||||
| @ -66031,14 +66032,12 @@ function writeSummaryTable(results) { | |||||||
|     core.summary.addRaw('\n'); |     core.summary.addRaw('\n'); | ||||||
| } | } | ||||||
| function renderOutcome(result) { | function renderOutcome(result) { | ||||||
|     const badgeUrl = result.buildFailed |     const labelPart = result.buildScanUri ? 'Build%20Scan%E2%84%A2' : 'Build'; | ||||||
|         ? 'https://img.shields.io/badge/Build%20Scan%E2%84%A2-FAILED-red?logo=Gradle' |     const outcomePart = result.buildFailed ? 'FAILED-red' : 'SUCCESS-brightgreen'; | ||||||
|         : 'https://img.shields.io/badge/Build%20Scan%E2%84%A2-SUCCESS-brightgreen?logo=Gradle'; |     const badgeUrl = `https://img.shields.io/badge/${labelPart}-${outcomePart}?logo=Gradle`; | ||||||
|     const badgeHtml = `<img src="${badgeUrl}" alt="Gradle Build">`; |     const badgeHtml = `<img src="${badgeUrl}" alt="Gradle Build">`; | ||||||
|     if (result.buildScanUri) { |     const targetUrl = result.buildScanUri ? result.buildScanUri : '#'; | ||||||
|         return `<a href="${result.buildScanUri}" rel="nofollow">${badgeHtml}</a>`; |     return `<a href="${targetUrl}" rel="nofollow">${badgeHtml}</a>`; | ||||||
|     } |  | ||||||
|     return badgeHtml; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								dist/main/index.js.map
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								dist/main/index.js.map
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										17
									
								
								dist/post/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								dist/post/index.js
									
									
									
									
										vendored
									
									
								
							| @ -64018,6 +64018,7 @@ class GradleStateCache { | |||||||
|         fs_1.default.appendFileSync(propertiesFile, 'org.gradle.daemon=false'); |         fs_1.default.appendFileSync(propertiesFile, 'org.gradle.daemon=false'); | ||||||
|         const initScriptFilenames = [ |         const initScriptFilenames = [ | ||||||
|             'build-result-capture.init.gradle', |             'build-result-capture.init.gradle', | ||||||
|  |             'build-result-capture-service.plugin.groovy', | ||||||
|             'project-root-capture.init.gradle', |             'project-root-capture.init.gradle', | ||||||
|             'project-root-capture.plugin.groovy' |             'project-root-capture.plugin.groovy' | ||||||
|         ]; |         ]; | ||||||
| @ -64342,7 +64343,7 @@ class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor { | |||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|     getProjectRoots() { |     getProjectRoots() { | ||||||
|         const projectList = path_1.default.resolve(this.gradleUserHome, cache_base_1.PROJECT_ROOTS_FILE); |         const projectList = path_1.default.resolve(process.env['RUNNER_TEMP'], cache_base_1.PROJECT_ROOTS_FILE); | ||||||
|         if (!fs_1.default.existsSync(projectList)) { |         if (!fs_1.default.existsSync(projectList)) { | ||||||
|             core.info(`Missing project list file ${projectList}`); |             core.info(`Missing project list file ${projectList}`); | ||||||
|             return []; |             return []; | ||||||
| @ -64610,7 +64611,7 @@ function isCacheDisabled() { | |||||||
| } | } | ||||||
| exports.isCacheDisabled = isCacheDisabled; | exports.isCacheDisabled = isCacheDisabled; | ||||||
| function isCacheReadOnly() { | function isCacheReadOnly() { | ||||||
|     return core.getBooleanInput(CACHE_READONLY_PARAMETER); |     return !isCacheWriteOnly() && core.getBooleanInput(CACHE_READONLY_PARAMETER); | ||||||
| } | } | ||||||
| exports.isCacheReadOnly = isCacheReadOnly; | exports.isCacheReadOnly = isCacheReadOnly; | ||||||
| function isCacheWriteOnly() { | function isCacheWriteOnly() { | ||||||
| @ -64951,14 +64952,12 @@ function writeSummaryTable(results) { | |||||||
|     core.summary.addRaw('\n'); |     core.summary.addRaw('\n'); | ||||||
| } | } | ||||||
| function renderOutcome(result) { | function renderOutcome(result) { | ||||||
|     const badgeUrl = result.buildFailed |     const labelPart = result.buildScanUri ? 'Build%20Scan%E2%84%A2' : 'Build'; | ||||||
|         ? 'https://img.shields.io/badge/Build%20Scan%E2%84%A2-FAILED-red?logo=Gradle' |     const outcomePart = result.buildFailed ? 'FAILED-red' : 'SUCCESS-brightgreen'; | ||||||
|         : 'https://img.shields.io/badge/Build%20Scan%E2%84%A2-SUCCESS-brightgreen?logo=Gradle'; |     const badgeUrl = `https://img.shields.io/badge/${labelPart}-${outcomePart}?logo=Gradle`; | ||||||
|     const badgeHtml = `<img src="${badgeUrl}" alt="Gradle Build">`; |     const badgeHtml = `<img src="${badgeUrl}" alt="Gradle Build">`; | ||||||
|     if (result.buildScanUri) { |     const targetUrl = result.buildScanUri ? result.buildScanUri : '#'; | ||||||
|         return `<a href="${result.buildScanUri}" rel="nofollow">${badgeHtml}</a>`; |     return `<a href="${targetUrl}" rel="nofollow">${badgeHtml}</a>`; | ||||||
|     } |  | ||||||
|     return badgeHtml; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								dist/post/index.js.map
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								dist/post/index.js.map
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -172,6 +172,7 @@ export class GradleStateCache { | |||||||
| 
 | 
 | ||||||
|         const initScriptFilenames = [ |         const initScriptFilenames = [ | ||||||
|             'build-result-capture.init.gradle', |             'build-result-capture.init.gradle', | ||||||
|  |             'build-result-capture-service.plugin.groovy', | ||||||
|             'project-root-capture.init.gradle', |             'project-root-capture.init.gradle', | ||||||
|             'project-root-capture.plugin.groovy' |             'project-root-capture.plugin.groovy' | ||||||
|         ] |         ] | ||||||
|  | |||||||
| @ -387,7 +387,7 @@ export class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor { | |||||||
|      * set of project roots, to allow saving of configuration-cache entries for each. |      * set of project roots, to allow saving of configuration-cache entries for each. | ||||||
|      */ |      */ | ||||||
|     private getProjectRoots(): string[] { |     private getProjectRoots(): string[] { | ||||||
|         const projectList = path.resolve(this.gradleUserHome, PROJECT_ROOTS_FILE) |         const projectList = path.resolve(process.env['RUNNER_TEMP']!, PROJECT_ROOTS_FILE) | ||||||
|         if (!fs.existsSync(projectList)) { |         if (!fs.existsSync(projectList)) { | ||||||
|             core.info(`Missing project list file ${projectList}`) |             core.info(`Missing project list file ${projectList}`) | ||||||
|             return [] |             return [] | ||||||
|  | |||||||
| @ -60,13 +60,10 @@ function writeSummaryTable(results: BuildResult[]): void { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function renderOutcome(result: BuildResult): string { | function renderOutcome(result: BuildResult): string { | ||||||
|     const badgeUrl = result.buildFailed |     const labelPart = result.buildScanUri ? 'Build%20Scan%E2%84%A2' : 'Build' | ||||||
|         ? 'https://img.shields.io/badge/Build%20Scan%E2%84%A2-FAILED-red?logo=Gradle' |     const outcomePart = result.buildFailed ? 'FAILED-red' : 'SUCCESS-brightgreen' | ||||||
|         : 'https://img.shields.io/badge/Build%20Scan%E2%84%A2-SUCCESS-brightgreen?logo=Gradle' |     const badgeUrl = `https://img.shields.io/badge/${labelPart}-${outcomePart}?logo=Gradle` | ||||||
|     const badgeHtml = `<img src="${badgeUrl}" alt="Gradle Build">` |     const badgeHtml = `<img src="${badgeUrl}" alt="Gradle Build">` | ||||||
| 
 |     const targetUrl = result.buildScanUri ? result.buildScanUri : '#' | ||||||
|     if (result.buildScanUri) { |     return `<a href="${targetUrl}" rel="nofollow">${badgeHtml}</a>` | ||||||
|         return `<a href="${result.buildScanUri}" rel="nofollow">${badgeHtml}</a>` |  | ||||||
|     } |  | ||||||
|     return badgeHtml |  | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										46
									
								
								src/resources/build-result-capture-service.plugin.groovy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/resources/build-result-capture-service.plugin.groovy
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | |||||||
|  | import org.gradle.tooling.events.* | ||||||
|  | import org.gradle.tooling.events.task.* | ||||||
|  | import org.gradle.util.GradleVersion | ||||||
|  | 
 | ||||||
|  | // Can't use settingsEvaluated since this script is applied inside a settingsEvaluated handler | ||||||
|  | // But projectsEvaluated is good enough, since the build service won't catch configuration failures anyway | ||||||
|  | projectsEvaluated { | ||||||
|  |     def projectTracker = gradle.sharedServices.registerIfAbsent("gradle-build-action-buildResultsRecorder", BuildResultsRecorder, { spec -> | ||||||
|  |         spec.getParameters().getRootProject().set(gradle.rootProject.name) | ||||||
|  |         spec.getParameters().getRequestedTasks().set(gradle.startParameter.taskNames.join(" ")) | ||||||
|  |         spec.getParameters().getInvocationId().set(gradle.ext.invocationId) | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     gradle.services.get(BuildEventsListenerRegistry).onTaskCompletion(projectTracker) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | abstract class BuildResultsRecorder implements BuildService<BuildResultsRecorder.Params>, OperationCompletionListener, AutoCloseable { | ||||||
|  |     private boolean buildFailed = false | ||||||
|  |     interface Params extends BuildServiceParameters { | ||||||
|  |         Property<String> getRootProject() | ||||||
|  |         Property<String> getRequestedTasks() | ||||||
|  |         Property<String> getInvocationId() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void onFinish(FinishEvent finishEvent) { | ||||||
|  |         if (finishEvent instanceof TaskFinishEvent && finishEvent.result instanceof TaskFailureResult) { | ||||||
|  |             buildFailed = true | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void close() { | ||||||
|  |         def buildResults = [ | ||||||
|  |             rootProject: getParameters().getRootProject().get(),  | ||||||
|  |             requestedTasks: getParameters().getRequestedTasks().get(),  | ||||||
|  |             gradleVersion: GradleVersion.current().version,  | ||||||
|  |             buildFailed: buildFailed, | ||||||
|  |             buildScanUri: null | ||||||
|  |         ] | ||||||
|  | 
 | ||||||
|  |         def buildResultsDir = new File(System.getenv("RUNNER_TEMP"), ".build-results") | ||||||
|  |         buildResultsDir.mkdirs() | ||||||
|  |         def buildResultsFile = new File(buildResultsDir, System.getenv("GITHUB_ACTION") + getParameters().getInvocationId().get() + ".json") | ||||||
|  |         buildResultsFile << groovy.json.JsonOutput.toJson(buildResults) | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -7,25 +7,38 @@ import org.gradle.util.GradleVersion | |||||||
| def isTopLevelBuild = gradle.getParent() == null | def isTopLevelBuild = gradle.getParent() == null | ||||||
| if (isTopLevelBuild) { | if (isTopLevelBuild) { | ||||||
|     def version = GradleVersion.current().baseVersion |     def version = GradleVersion.current().baseVersion | ||||||
|     def atLeastGradle4 = version >= GradleVersion.version("4.0") | 
 | ||||||
|  |     def atLeastGradle3 = version >= GradleVersion.version("3.0") | ||||||
|     def atLeastGradle6 = version >= GradleVersion.version("6.0") |     def atLeastGradle6 = version >= GradleVersion.version("6.0") | ||||||
| 
 | 
 | ||||||
|  |     def invocationId = "-${System.currentTimeMillis()}" | ||||||
|  | 
 | ||||||
|     if (atLeastGradle6) { |     if (atLeastGradle6) { | ||||||
|  |         def useBuildService = version >= GradleVersion.version("6.6") | ||||||
|         settingsEvaluated { settings -> |         settingsEvaluated { settings -> | ||||||
|  |             // The `buildScanPublished` hook is the only way to capture the build scan URI. | ||||||
|             if (settings.pluginManager.hasPlugin("com.gradle.enterprise")) { |             if (settings.pluginManager.hasPlugin("com.gradle.enterprise")) { | ||||||
|                 registerCallbacks(settings.extensions["gradleEnterprise"].buildScan, settings.rootProject.name) |                 captureUsingBuildScanPublished(settings.extensions["gradleEnterprise"].buildScan, settings.rootProject.name, invocationId) | ||||||
|  |             } | ||||||
|  |             // We also need to add hooks in case the plugin is applied but no build scan is published  | ||||||
|  |             if (useBuildService) { | ||||||
|  |                 captureUsingBuildService(settings, invocationId) | ||||||
|  |             } else { | ||||||
|  |                 captureUsingBuildFinished(gradle, invocationId) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } else if (atLeastGradle4) { |     } else if (atLeastGradle3) { | ||||||
|         projectsEvaluated { gradle -> |         projectsEvaluated { gradle -> | ||||||
|             if (gradle.rootProject.pluginManager.hasPlugin("com.gradle.build-scan")) { |             if (gradle.rootProject.pluginManager.hasPlugin("com.gradle.build-scan")) { | ||||||
|                 registerCallbacks(gradle.rootProject.extensions["buildScan"], gradle.rootProject.name) |                 captureUsingBuildScanPublished(gradle.rootProject.extensions["buildScan"], gradle.rootProject.name, invocationId) | ||||||
|             } |             } | ||||||
|  |             // We  need to capture in buildFinished in case the plugin is applied but no build scan is published  | ||||||
|  |             captureUsingBuildFinished(gradle, invocationId) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| def registerCallbacks(buildScanExtension, rootProjectName) { | def captureUsingBuildScanPublished(buildScanExtension, rootProjectName, invocationId) { | ||||||
|     buildScanExtension.with { |     buildScanExtension.with { | ||||||
|         def requestedTasks = gradle.startParameter.taskNames.join(" ") |         def requestedTasks = gradle.startParameter.taskNames.join(" ") | ||||||
|         def gradleVersion = GradleVersion.current().version |         def gradleVersion = GradleVersion.current().version | ||||||
| @ -36,10 +49,6 @@ def registerCallbacks(buildScanExtension, rootProjectName) { | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         buildScanPublished { buildScan -> |         buildScanPublished { buildScan -> | ||||||
|             def buildResultsDir = new File(System.getenv("RUNNER_TEMP"), ".build-results") |  | ||||||
|             buildResultsDir.mkdirs() |  | ||||||
|              |  | ||||||
|             def buildResultsFile = new File(buildResultsDir, System.getenv("GITHUB_ACTION") + System.currentTimeMillis() + ".json") |  | ||||||
| 
 | 
 | ||||||
|             def buildScanUri = buildScan.buildScanUri.toASCIIString() |             def buildScanUri = buildScan.buildScanUri.toASCIIString() | ||||||
|             def buildResults = [ |             def buildResults = [ | ||||||
| @ -49,9 +58,41 @@ def registerCallbacks(buildScanExtension, rootProjectName) { | |||||||
|                 buildFailed: buildFailed,  |                 buildFailed: buildFailed,  | ||||||
|                 buildScanUri: buildScanUri |                 buildScanUri: buildScanUri | ||||||
|             ] |             ] | ||||||
|  | 
 | ||||||
|  |             def buildResultsDir = new File(System.getenv("RUNNER_TEMP"), ".build-results") | ||||||
|  |             buildResultsDir.mkdirs() | ||||||
|  |             def buildResultsFile = new File(buildResultsDir, System.getenv("GITHUB_ACTION") + invocationId + ".json") | ||||||
|  | 
 | ||||||
|  |             // Overwrite any contents written by buildFinished or build service, since this result is a superset. | ||||||
|  |             if (buildResultsFile.exists()) { | ||||||
|  |                 buildResultsFile.text = groovy.json.JsonOutput.toJson(buildResults)  | ||||||
|  |             } else { | ||||||
|                 buildResultsFile << groovy.json.JsonOutput.toJson(buildResults) |                 buildResultsFile << groovy.json.JsonOutput.toJson(buildResults) | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             println("::set-output name=build-scan-url::${buildScan.buildScanUri}") |             println("::set-output name=build-scan-url::${buildScan.buildScanUri}") | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | def captureUsingBuildFinished(gradle, invocationId) { | ||||||
|  |     gradle.buildFinished { result -> | ||||||
|  |         def buildResults = [ | ||||||
|  |             rootProject: gradle.rootProject.name,  | ||||||
|  |             requestedTasks: gradle.startParameter.taskNames.join(" "), | ||||||
|  |             gradleVersion: GradleVersion.current().version,  | ||||||
|  |             buildFailed: result.failure != null, | ||||||
|  |             buildScanUri: null | ||||||
|  |         ] | ||||||
|  | 
 | ||||||
|  |         def buildResultsDir = new File(System.getenv("RUNNER_TEMP"), ".build-results") | ||||||
|  |         buildResultsDir.mkdirs() | ||||||
|  |         def buildResultsFile = new File(buildResultsDir, System.getenv("GITHUB_ACTION") + invocationId + ".json") | ||||||
|  |         buildResultsFile << groovy.json.JsonOutput.toJson(buildResults) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | def captureUsingBuildService(settings, invocationId) { | ||||||
|  |     gradle.ext.invocationId = invocationId | ||||||
|  |     apply from: 'build-result-capture-service.plugin.groovy' | ||||||
|  | } | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ import org.gradle.tooling.events.* | |||||||
| 
 | 
 | ||||||
| settingsEvaluated { settings -> | settingsEvaluated { settings -> | ||||||
|     def rootDir = settings.rootDir.absolutePath |     def rootDir = settings.rootDir.absolutePath | ||||||
|     def rootListLocation = new File(settings.gradle.gradleUserHomeDir, "project-roots.txt").absolutePath |     def rootListLocation = new File(System.getenv("RUNNER_TEMP"), "project-roots.txt").absolutePath | ||||||
| 
 | 
 | ||||||
|     def projectTracker = gradle.sharedServices.registerIfAbsent("gradle-build-action-projectRootTracker", ProjectTracker, { spec -> |     def projectTracker = gradle.sharedServices.registerIfAbsent("gradle-build-action-projectRootTracker", ProjectTracker, { spec -> | ||||||
|         spec.getParameters().getRootDir().set(rootDir); |         spec.getParameters().getRootDir().set(rootDir); | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								test/test-init-scripts/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								test/test-init-scripts/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | build | ||||||
|  | .gradle | ||||||
							
								
								
									
										29
									
								
								test/test-init-scripts/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								test/test-init-scripts/build.gradle
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | plugins { | ||||||
|  |     id 'groovy' | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | java { | ||||||
|  |     toolchain { | ||||||
|  |         languageVersion = JavaLanguageVersion.of(8) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | repositories { | ||||||
|  |     mavenCentral() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | dependencies { | ||||||
|  |     testImplementation gradleTestKit() | ||||||
|  |     testImplementation 'org.spockframework:spock-core:2.1-groovy-3.0' | ||||||
|  |     testImplementation('org.spockframework:spock-junit4:2.1-groovy-3.0') | ||||||
|  | 
 | ||||||
|  |     testImplementation ('io.ratpack:ratpack-groovy-test:1.9.0') { | ||||||
|  |         exclude group: 'org.codehaus.groovy', module: 'groovy-all' | ||||||
|  |     } | ||||||
|  |     testImplementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.13.3' | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | test { | ||||||
|  |     useJUnitPlatform() | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								test/test-init-scripts/gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								test/test-init-scripts/gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										5
									
								
								test/test-init-scripts/gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								test/test-init-scripts/gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | distributionBase=GRADLE_USER_HOME | ||||||
|  | distributionPath=wrapper/dists | ||||||
|  | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip | ||||||
|  | zipStoreBase=GRADLE_USER_HOME | ||||||
|  | zipStorePath=wrapper/dists | ||||||
							
								
								
									
										234
									
								
								test/test-init-scripts/gradlew
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										234
									
								
								test/test-init-scripts/gradlew
									
									
									
									
										vendored
									
									
										Executable file
									
								
							| @ -0,0 +1,234 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | 
 | ||||||
|  | # | ||||||
|  | # Copyright © 2015-2021 the original authors. | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #      https://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | ############################################################################## | ||||||
|  | # | ||||||
|  | #   Gradle start up script for POSIX generated by Gradle. | ||||||
|  | # | ||||||
|  | #   Important for running: | ||||||
|  | # | ||||||
|  | #   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is | ||||||
|  | #       noncompliant, but you have some other compliant shell such as ksh or | ||||||
|  | #       bash, then to run this script, type that shell name before the whole | ||||||
|  | #       command line, like: | ||||||
|  | # | ||||||
|  | #           ksh Gradle | ||||||
|  | # | ||||||
|  | #       Busybox and similar reduced shells will NOT work, because this script | ||||||
|  | #       requires all of these POSIX shell features: | ||||||
|  | #         * functions; | ||||||
|  | #         * expansions «$var», «${var}», «${var:-default}», «${var+SET}», | ||||||
|  | #           «${var#prefix}», «${var%suffix}», and «$( cmd )»; | ||||||
|  | #         * compound commands having a testable exit status, especially «case»; | ||||||
|  | #         * various built-in commands including «command», «set», and «ulimit». | ||||||
|  | # | ||||||
|  | #   Important for patching: | ||||||
|  | # | ||||||
|  | #   (2) This script targets any POSIX shell, so it avoids extensions provided | ||||||
|  | #       by Bash, Ksh, etc; in particular arrays are avoided. | ||||||
|  | # | ||||||
|  | #       The "traditional" practice of packing multiple parameters into a | ||||||
|  | #       space-separated string is a well documented source of bugs and security | ||||||
|  | #       problems, so this is (mostly) avoided, by progressively accumulating | ||||||
|  | #       options in "$@", and eventually passing that to Java. | ||||||
|  | # | ||||||
|  | #       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, | ||||||
|  | #       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; | ||||||
|  | #       see the in-line comments for details. | ||||||
|  | # | ||||||
|  | #       There are tweaks for specific operating systems such as AIX, CygWin, | ||||||
|  | #       Darwin, MinGW, and NonStop. | ||||||
|  | # | ||||||
|  | #   (3) This script is generated from the Groovy template | ||||||
|  | #       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt | ||||||
|  | #       within the Gradle project. | ||||||
|  | # | ||||||
|  | #       You can find Gradle at https://github.com/gradle/gradle/. | ||||||
|  | # | ||||||
|  | ############################################################################## | ||||||
|  | 
 | ||||||
|  | # Attempt to set APP_HOME | ||||||
|  | 
 | ||||||
|  | # Resolve links: $0 may be a link | ||||||
|  | app_path=$0 | ||||||
|  | 
 | ||||||
|  | # Need this for daisy-chained symlinks. | ||||||
|  | while | ||||||
|  |     APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path | ||||||
|  |     [ -h "$app_path" ] | ||||||
|  | do | ||||||
|  |     ls=$( ls -ld "$app_path" ) | ||||||
|  |     link=${ls#*' -> '} | ||||||
|  |     case $link in             #( | ||||||
|  |       /*)   app_path=$link ;; #( | ||||||
|  |       *)    app_path=$APP_HOME$link ;; | ||||||
|  |     esac | ||||||
|  | done | ||||||
|  | 
 | ||||||
|  | APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit | ||||||
|  | 
 | ||||||
|  | APP_NAME="Gradle" | ||||||
|  | APP_BASE_NAME=${0##*/} | ||||||
|  | 
 | ||||||
|  | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||||
|  | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | ||||||
|  | 
 | ||||||
|  | # Use the maximum available, or set MAX_FD != -1 to use that value. | ||||||
|  | MAX_FD=maximum | ||||||
|  | 
 | ||||||
|  | warn () { | ||||||
|  |     echo "$*" | ||||||
|  | } >&2 | ||||||
|  | 
 | ||||||
|  | die () { | ||||||
|  |     echo | ||||||
|  |     echo "$*" | ||||||
|  |     echo | ||||||
|  |     exit 1 | ||||||
|  | } >&2 | ||||||
|  | 
 | ||||||
|  | # OS specific support (must be 'true' or 'false'). | ||||||
|  | cygwin=false | ||||||
|  | msys=false | ||||||
|  | darwin=false | ||||||
|  | nonstop=false | ||||||
|  | case "$( uname )" in                #( | ||||||
|  |   CYGWIN* )         cygwin=true  ;; #( | ||||||
|  |   Darwin* )         darwin=true  ;; #( | ||||||
|  |   MSYS* | MINGW* )  msys=true    ;; #( | ||||||
|  |   NONSTOP* )        nonstop=true ;; | ||||||
|  | esac | ||||||
|  | 
 | ||||||
|  | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Determine the Java command to use to start the JVM. | ||||||
|  | if [ -n "$JAVA_HOME" ] ; then | ||||||
|  |     if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | ||||||
|  |         # IBM's JDK on AIX uses strange locations for the executables | ||||||
|  |         JAVACMD=$JAVA_HOME/jre/sh/java | ||||||
|  |     else | ||||||
|  |         JAVACMD=$JAVA_HOME/bin/java | ||||||
|  |     fi | ||||||
|  |     if [ ! -x "$JAVACMD" ] ; then | ||||||
|  |         die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | ||||||
|  | 
 | ||||||
|  | Please set the JAVA_HOME variable in your environment to match the | ||||||
|  | location of your Java installation." | ||||||
|  |     fi | ||||||
|  | else | ||||||
|  |     JAVACMD=java | ||||||
|  |     which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||||
|  | 
 | ||||||
|  | Please set the JAVA_HOME variable in your environment to match the | ||||||
|  | location of your Java installation." | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Increase the maximum file descriptors if we can. | ||||||
|  | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then | ||||||
|  |     case $MAX_FD in #( | ||||||
|  |       max*) | ||||||
|  |         MAX_FD=$( ulimit -H -n ) || | ||||||
|  |             warn "Could not query maximum file descriptor limit" | ||||||
|  |     esac | ||||||
|  |     case $MAX_FD in  #( | ||||||
|  |       '' | soft) :;; #( | ||||||
|  |       *) | ||||||
|  |         ulimit -n "$MAX_FD" || | ||||||
|  |             warn "Could not set maximum file descriptor limit to $MAX_FD" | ||||||
|  |     esac | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Collect all arguments for the java command, stacking in reverse order: | ||||||
|  | #   * args from the command line | ||||||
|  | #   * the main class name | ||||||
|  | #   * -classpath | ||||||
|  | #   * -D...appname settings | ||||||
|  | #   * --module-path (only if needed) | ||||||
|  | #   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. | ||||||
|  | 
 | ||||||
|  | # For Cygwin or MSYS, switch paths to Windows format before running java | ||||||
|  | if "$cygwin" || "$msys" ; then | ||||||
|  |     APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) | ||||||
|  |     CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) | ||||||
|  | 
 | ||||||
|  |     JAVACMD=$( cygpath --unix "$JAVACMD" ) | ||||||
|  | 
 | ||||||
|  |     # Now convert the arguments - kludge to limit ourselves to /bin/sh | ||||||
|  |     for arg do | ||||||
|  |         if | ||||||
|  |             case $arg in                                #( | ||||||
|  |               -*)   false ;;                            # don't mess with options #( | ||||||
|  |               /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath | ||||||
|  |                     [ -e "$t" ] ;;                      #( | ||||||
|  |               *)    false ;; | ||||||
|  |             esac | ||||||
|  |         then | ||||||
|  |             arg=$( cygpath --path --ignore --mixed "$arg" ) | ||||||
|  |         fi | ||||||
|  |         # Roll the args list around exactly as many times as the number of | ||||||
|  |         # args, so each arg winds up back in the position where it started, but | ||||||
|  |         # possibly modified. | ||||||
|  |         # | ||||||
|  |         # NB: a `for` loop captures its iteration list before it begins, so | ||||||
|  |         # changing the positional parameters here affects neither the number of | ||||||
|  |         # iterations, nor the values presented in `arg`. | ||||||
|  |         shift                   # remove old arg | ||||||
|  |         set -- "$@" "$arg"      # push replacement arg | ||||||
|  |     done | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Collect all arguments for the java command; | ||||||
|  | #   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of | ||||||
|  | #     shell script including quotes and variable substitutions, so put them in | ||||||
|  | #     double quotes to make sure that they get re-expanded; and | ||||||
|  | #   * put everything else in single quotes, so that it's not re-expanded. | ||||||
|  | 
 | ||||||
|  | set -- \ | ||||||
|  |         "-Dorg.gradle.appname=$APP_BASE_NAME" \ | ||||||
|  |         -classpath "$CLASSPATH" \ | ||||||
|  |         org.gradle.wrapper.GradleWrapperMain \ | ||||||
|  |         "$@" | ||||||
|  | 
 | ||||||
|  | # Use "xargs" to parse quoted args. | ||||||
|  | # | ||||||
|  | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. | ||||||
|  | # | ||||||
|  | # In Bash we could simply go: | ||||||
|  | # | ||||||
|  | #   readarray ARGS < <( xargs -n1 <<<"$var" ) && | ||||||
|  | #   set -- "${ARGS[@]}" "$@" | ||||||
|  | # | ||||||
|  | # but POSIX shell has neither arrays nor command substitution, so instead we | ||||||
|  | # post-process each arg (as a line of input to sed) to backslash-escape any | ||||||
|  | # character that might be a shell metacharacter, then use eval to reverse | ||||||
|  | # that process (while maintaining the separation between arguments), and wrap | ||||||
|  | # the whole thing up as a single "set" statement. | ||||||
|  | # | ||||||
|  | # This will of course break if any of these variables contains a newline or | ||||||
|  | # an unmatched quote. | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | eval "set -- $( | ||||||
|  |         printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | | ||||||
|  |         xargs -n1 | | ||||||
|  |         sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | | ||||||
|  |         tr '\n' ' ' | ||||||
|  |     )" '"$@"' | ||||||
|  | 
 | ||||||
|  | exec "$JAVACMD" "$@" | ||||||
							
								
								
									
										89
									
								
								test/test-init-scripts/gradlew.bat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								test/test-init-scripts/gradlew.bat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,89 @@ | |||||||
|  | @rem | ||||||
|  | @rem Copyright 2015 the original author or authors. | ||||||
|  | @rem | ||||||
|  | @rem Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | @rem you may not use this file except in compliance with the License. | ||||||
|  | @rem You may obtain a copy of the License at | ||||||
|  | @rem | ||||||
|  | @rem      https://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | @rem | ||||||
|  | @rem Unless required by applicable law or agreed to in writing, software | ||||||
|  | @rem distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | @rem See the License for the specific language governing permissions and | ||||||
|  | @rem limitations under the License. | ||||||
|  | @rem | ||||||
|  | 
 | ||||||
|  | @if "%DEBUG%" == "" @echo off | ||||||
|  | @rem ########################################################################## | ||||||
|  | @rem | ||||||
|  | @rem  Gradle startup script for Windows | ||||||
|  | @rem | ||||||
|  | @rem ########################################################################## | ||||||
|  | 
 | ||||||
|  | @rem Set local scope for the variables with windows NT shell | ||||||
|  | if "%OS%"=="Windows_NT" setlocal | ||||||
|  | 
 | ||||||
|  | set DIRNAME=%~dp0 | ||||||
|  | if "%DIRNAME%" == "" set DIRNAME=. | ||||||
|  | set APP_BASE_NAME=%~n0 | ||||||
|  | set APP_HOME=%DIRNAME% | ||||||
|  | 
 | ||||||
|  | @rem Resolve any "." and ".." in APP_HOME to make it shorter. | ||||||
|  | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi | ||||||
|  | 
 | ||||||
|  | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||||
|  | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | ||||||
|  | 
 | ||||||
|  | @rem Find java.exe | ||||||
|  | if defined JAVA_HOME goto findJavaFromJavaHome | ||||||
|  | 
 | ||||||
|  | set JAVA_EXE=java.exe | ||||||
|  | %JAVA_EXE% -version >NUL 2>&1 | ||||||
|  | if "%ERRORLEVEL%" == "0" goto execute | ||||||
|  | 
 | ||||||
|  | echo. | ||||||
|  | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||||
|  | echo. | ||||||
|  | echo Please set the JAVA_HOME variable in your environment to match the | ||||||
|  | echo location of your Java installation. | ||||||
|  | 
 | ||||||
|  | goto fail | ||||||
|  | 
 | ||||||
|  | :findJavaFromJavaHome | ||||||
|  | set JAVA_HOME=%JAVA_HOME:"=% | ||||||
|  | set JAVA_EXE=%JAVA_HOME%/bin/java.exe | ||||||
|  | 
 | ||||||
|  | if exist "%JAVA_EXE%" goto execute | ||||||
|  | 
 | ||||||
|  | echo. | ||||||
|  | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | ||||||
|  | echo. | ||||||
|  | echo Please set the JAVA_HOME variable in your environment to match the | ||||||
|  | echo location of your Java installation. | ||||||
|  | 
 | ||||||
|  | goto fail | ||||||
|  | 
 | ||||||
|  | :execute | ||||||
|  | @rem Setup the command line | ||||||
|  | 
 | ||||||
|  | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @rem Execute Gradle | ||||||
|  | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* | ||||||
|  | 
 | ||||||
|  | :end | ||||||
|  | @rem End local scope for the variables with windows NT shell | ||||||
|  | if "%ERRORLEVEL%"=="0" goto mainEnd | ||||||
|  | 
 | ||||||
|  | :fail | ||||||
|  | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | ||||||
|  | rem the _cmd.exe /c_ return code! | ||||||
|  | if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | ||||||
|  | exit /b 1 | ||||||
|  | 
 | ||||||
|  | :mainEnd | ||||||
|  | if "%OS%"=="Windows_NT" endlocal | ||||||
|  | 
 | ||||||
|  | :omega | ||||||
							
								
								
									
										1
									
								
								test/test-init-scripts/settings.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/test-init-scripts/settings.gradle
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | rootProject.name = 'test-init-scripts' | ||||||
| @ -0,0 +1,240 @@ | |||||||
|  | package com.gradle.gradlebuildaction | ||||||
|  | 
 | ||||||
|  | import com.fasterxml.jackson.core.JsonFactory | ||||||
|  | import com.fasterxml.jackson.databind.ObjectMapper | ||||||
|  | import com.fasterxml.jackson.dataformat.smile.SmileFactory | ||||||
|  | import org.gradle.testkit.runner.BuildResult | ||||||
|  | import org.gradle.testkit.runner.GradleRunner | ||||||
|  | import org.gradle.testkit.runner.internal.DefaultGradleRunner | ||||||
|  | import org.gradle.util.GradleVersion | ||||||
|  | import ratpack.groovy.test.embed.GroovyEmbeddedApp | ||||||
|  | import spock.lang.AutoCleanup | ||||||
|  | import spock.lang.Specification | ||||||
|  | import spock.lang.TempDir | ||||||
|  | 
 | ||||||
|  | import java.nio.file.Files | ||||||
|  | import java.util.zip.GZIPOutputStream | ||||||
|  | 
 | ||||||
|  | class BaseInitScriptTest extends Specification { | ||||||
|  | 
 | ||||||
|  |     static final TestGradleVersion GRADLE_3_5 = new TestGradleVersion(GradleVersion.version('3.5.1'), 7, 9) | ||||||
|  |     static final TestGradleVersion GRADLE_4_0 = new TestGradleVersion(GradleVersion.version('4.0.2'), 7, 9) | ||||||
|  |     static final TestGradleVersion GRADLE_4_10 = new TestGradleVersion(GradleVersion.version('4.10.3'), 7, 10) | ||||||
|  |     static final TestGradleVersion GRADLE_5_0 = new TestGradleVersion(GradleVersion.version('5.0'), 8, 11) | ||||||
|  |     static final TestGradleVersion GRADLE_5_6 = new TestGradleVersion(GradleVersion.version('5.6.4'), 8, 12) | ||||||
|  |     static final TestGradleVersion GRADLE_6_0 = new TestGradleVersion(GradleVersion.version('6.0.1'), 8, 13) | ||||||
|  |     static final TestGradleVersion GRADLE_6_7 = new TestGradleVersion(GradleVersion.version('6.7'), 8, 15) | ||||||
|  |     static final TestGradleVersion GRADLE_7_0 = new TestGradleVersion(GradleVersion.version('7.0.2'), 8, 16) | ||||||
|  |     static final TestGradleVersion GRADLE_7_4 = new TestGradleVersion(GradleVersion.version('7.4.2'), 8, 17) | ||||||
|  | 
 | ||||||
|  |     static final List<TestGradleVersion> ALL_VERSIONS = [ | ||||||
|  |         GRADLE_3_5, // First version where TestKit supports environment variables | ||||||
|  |         GRADLE_4_0, | ||||||
|  |         GRADLE_4_10, | ||||||
|  |         GRADLE_5_0, | ||||||
|  |         GRADLE_5_6, | ||||||
|  |         GRADLE_6_0, | ||||||
|  |         GRADLE_6_7, | ||||||
|  |         GRADLE_7_0, | ||||||
|  |         GRADLE_7_4, | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     static final List<TestGradleVersion> CONFIGURATION_CACHE_VERSIONS = | ||||||
|  |         [GRADLE_7_0, GRADLE_7_4] | ||||||
|  | 
 | ||||||
|  |     static final String PUBLIC_BUILD_SCAN_ID = 'i2wepy2gr7ovw' | ||||||
|  |     static final String DEFAULT_SCAN_UPLOAD_TOKEN = 'scan-upload-token' | ||||||
|  |     static final String ROOT_PROJECT_NAME = 'test-init-script' | ||||||
|  | 
 | ||||||
|  |     File settingsFile | ||||||
|  |     File buildFile | ||||||
|  | 
 | ||||||
|  |     @TempDir | ||||||
|  |     File testProjectDir | ||||||
|  | 
 | ||||||
|  |     @AutoCleanup | ||||||
|  |     def mockScansServer = GroovyEmbeddedApp.of { | ||||||
|  |         def jsonWriter = new ObjectMapper(new JsonFactory()).writer() | ||||||
|  |         def smileWriter = new ObjectMapper(new SmileFactory()).writer() | ||||||
|  | 
 | ||||||
|  |         handlers { | ||||||
|  |             post('in/:gradleVersion/:pluginVersion') { | ||||||
|  |                 def scanUrlString = "${mockScansServer.address}s/$PUBLIC_BUILD_SCAN_ID" | ||||||
|  |                 def body = [ | ||||||
|  |                     id     : PUBLIC_BUILD_SCAN_ID, | ||||||
|  |                     scanUrl: scanUrlString.toString(), | ||||||
|  |                 ] | ||||||
|  |                 def out = new ByteArrayOutputStream() | ||||||
|  |                 new GZIPOutputStream(out).withStream { smileWriter.writeValue(it, body) } | ||||||
|  |                 context.response | ||||||
|  |                     .contentType('application/vnd.gradle.scan-ack') | ||||||
|  |                     .send(out.toByteArray()) | ||||||
|  |             } | ||||||
|  |             prefix('scans/publish') { | ||||||
|  |                 post('gradle/:pluginVersion/token') { | ||||||
|  |                     def pluginVersion = context.pathTokens.pluginVersion | ||||||
|  |                     def scanUrlString = "${mockScansServer.address}s/$PUBLIC_BUILD_SCAN_ID" | ||||||
|  |                     def body = [ | ||||||
|  |                         id             : PUBLIC_BUILD_SCAN_ID, | ||||||
|  |                         scanUrl        : scanUrlString.toString(), | ||||||
|  |                         scanUploadUrl  : "${mockScansServer.address.toString()}scans/publish/gradle/$pluginVersion/upload".toString(), | ||||||
|  |                         scanUploadToken: DEFAULT_SCAN_UPLOAD_TOKEN | ||||||
|  |                     ] | ||||||
|  |                     context.response | ||||||
|  |                         .contentType('application/vnd.gradle.scan-ack+json') | ||||||
|  |                         .send(jsonWriter.writeValueAsBytes(body)) | ||||||
|  |                 } | ||||||
|  |                 post('gradle/:pluginVersion/upload') { | ||||||
|  |                     context.request.getBody(1024 * 1024 * 10).then { | ||||||
|  |                         context.response | ||||||
|  |                             .contentType('application/vnd.gradle.scan-upload-ack+json') | ||||||
|  |                             .send() | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 notFound() | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     def setup() { | ||||||
|  |         settingsFile = new File(testProjectDir, 'settings.gradle') | ||||||
|  |         buildFile = new File(testProjectDir, 'build.gradle') | ||||||
|  | 
 | ||||||
|  |         File srcInitScriptsDir = new File("../../src/resources") | ||||||
|  |         File targetInitScriptsDir = new File(testProjectDir, "initScripts") | ||||||
|  |         targetInitScriptsDir.mkdirs() | ||||||
|  | 
 | ||||||
|  |         for (File srcInitScript : srcInitScriptsDir.listFiles()) { | ||||||
|  |             File targetInitScript = new File(targetInitScriptsDir, srcInitScript.name) | ||||||
|  |             Files.copy(srcInitScript.toPath(), targetInitScript.toPath()) | ||||||
|  |         } | ||||||
|  |         settingsFile << "rootProject.name = '${ROOT_PROJECT_NAME}'\n" | ||||||
|  |         buildFile << '' | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     def declareGePluginApplication(GradleVersion gradleVersion) { | ||||||
|  |         settingsFile.text = maybeAddPluginsToSettings(gradleVersion) + settingsFile.text | ||||||
|  |         buildFile.text = maybeAddPluginsToRootProject(gradleVersion) + buildFile.text | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     String maybeAddPluginsToSettings(GradleVersion gradleVersion) { | ||||||
|  |         if (gradleVersion < GradleVersion.version('5.0')) { | ||||||
|  |             '' // applied in build.gradle | ||||||
|  |         } else if (gradleVersion < GradleVersion.version('6.0')) { | ||||||
|  |             '' // applied in build.gradle | ||||||
|  |         } else { | ||||||
|  |             """ | ||||||
|  |               plugins { | ||||||
|  |                 id 'com.gradle.enterprise' version '3.4.1' | ||||||
|  |               } | ||||||
|  |               gradleEnterprise { | ||||||
|  |                 server = '$mockScansServer.address' | ||||||
|  |                 buildScan { | ||||||
|  |                   publishAlways() | ||||||
|  |                 } | ||||||
|  |               } | ||||||
|  |             """ | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     String maybeAddPluginsToRootProject(GradleVersion gradleVersion) { | ||||||
|  |         if (gradleVersion < GradleVersion.version('5.0')) { | ||||||
|  |             """ | ||||||
|  |               plugins { | ||||||
|  |                 id 'com.gradle.build-scan' version '1.16' | ||||||
|  |               } | ||||||
|  |               buildScan { | ||||||
|  |                 server = '$mockScansServer.address' | ||||||
|  |                 publishAlways() | ||||||
|  |               } | ||||||
|  |             """ | ||||||
|  |         } else if (gradleVersion < GradleVersion.version('6.0')) { | ||||||
|  |             """ | ||||||
|  |               plugins { | ||||||
|  |                 id 'com.gradle.build-scan' version '3.4.1' | ||||||
|  |               } | ||||||
|  |               gradleEnterprise { | ||||||
|  |                 server = '$mockScansServer.address' | ||||||
|  |                 buildScan { | ||||||
|  |                   publishAlways() | ||||||
|  |                 } | ||||||
|  |               } | ||||||
|  |             """ | ||||||
|  |         } else { | ||||||
|  |             '' // applied in settings.gradle | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     def addFailingTaskToBuild() { | ||||||
|  |         buildFile << ''' | ||||||
|  | task expectFailure { | ||||||
|  |     doLast { | ||||||
|  |         throw new RuntimeException("Expected to fail") | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | ''' | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     BuildResult run(List<String> args, String initScript, GradleVersion gradleVersion = GradleVersion.current(), List<String> jvmArgs = [], Map<String, String> envVars = [:]) { | ||||||
|  |         createRunner(initScript, args, gradleVersion, jvmArgs, envVars).build() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     BuildResult runAndFail(List<String> args, String initScript, GradleVersion gradleVersion = GradleVersion.current(), List<String> jvmArgs = [], Map<String, String> envVars = [:]) { | ||||||
|  |         createRunner(initScript, args, gradleVersion, jvmArgs, envVars).buildAndFail() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     GradleRunner createRunner(String initScript, List<String> args, GradleVersion gradleVersion = GradleVersion.current(), List<String> jvmArgs = [], Map<String, String> envVars = [:]) { | ||||||
|  |         File initScriptsDir = new File(testProjectDir, "initScripts") | ||||||
|  |         args << '-I' << new File(initScriptsDir, initScript).absolutePath | ||||||
|  | 
 | ||||||
|  |         envVars['RUNNER_TEMP'] = testProjectDir.absolutePath | ||||||
|  |         envVars['GITHUB_ACTION'] = 'github-step-id' | ||||||
|  | 
 | ||||||
|  |         def runner = ((DefaultGradleRunner) GradleRunner.create()) | ||||||
|  |             .withJvmArguments(jvmArgs) | ||||||
|  |             .withGradleVersion(gradleVersion.version) | ||||||
|  |             .withProjectDir(testProjectDir) | ||||||
|  |             .withArguments(args) | ||||||
|  |             .forwardOutput() | ||||||
|  | 
 | ||||||
|  |         if (envVars) { | ||||||
|  |             runner.withEnvironment(envVars) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         runner | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     static final class TestGradleVersion { | ||||||
|  | 
 | ||||||
|  |         final GradleVersion gradleVersion | ||||||
|  |         private final Integer jdkMin | ||||||
|  |         private final Integer jdkMax | ||||||
|  | 
 | ||||||
|  |         TestGradleVersion(GradleVersion gradleVersion, Integer jdkMin, Integer jdkMax) { | ||||||
|  |             this.gradleVersion = gradleVersion | ||||||
|  |             this.jdkMin = jdkMin | ||||||
|  |             this.jdkMax = jdkMax | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         boolean isCompatibleWithCurrentJvm() { | ||||||
|  |             def jvmVersion = getJvmVersion() | ||||||
|  |             jdkMin <= jvmVersion && jvmVersion <= jdkMax | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static int getJvmVersion() { | ||||||
|  |             String version = System.getProperty('java.version') | ||||||
|  |             if (version.startsWith('1.')) { | ||||||
|  |                 Integer.parseInt(version.substring(2, 3)) | ||||||
|  |             } else { | ||||||
|  |                 Integer.parseInt(version.substring(0, version.indexOf('.'))) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         String toString() { | ||||||
|  |             return "Gradle " + gradleVersion.version | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,138 @@ | |||||||
|  | package com.gradle.gradlebuildaction | ||||||
|  | 
 | ||||||
|  | import groovy.json.JsonSlurper | ||||||
|  | 
 | ||||||
|  | import static org.junit.Assume.assumeTrue | ||||||
|  | 
 | ||||||
|  | class TestBuildResultRecorder extends BaseInitScriptTest { | ||||||
|  |     def initScript = 'build-result-capture.init.gradle' | ||||||
|  | 
 | ||||||
|  |     def "produces build results file for build with #testGradleVersion"() { | ||||||
|  |         assumeTrue testGradleVersion.compatibleWithCurrentJvm | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         run(['help'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertResults('help', testGradleVersion, false, false) | ||||||
|  | 
 | ||||||
|  |         where: | ||||||
|  |         testGradleVersion << ALL_VERSIONS | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     def "produces build results file for failing build with #testGradleVersion"() { | ||||||
|  |         assumeTrue testGradleVersion.compatibleWithCurrentJvm | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         addFailingTaskToBuild() | ||||||
|  |         runAndFail(['expectFailure'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertResults('expectFailure', testGradleVersion, true, false) | ||||||
|  | 
 | ||||||
|  |         where: | ||||||
|  |         testGradleVersion << ALL_VERSIONS | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     def "produces build results file for build with --configuration-cache on #testGradleVersion"() { | ||||||
|  |         assumeTrue testGradleVersion.compatibleWithCurrentJvm | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         run(['help', '--configuration-cache'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertResults('help', testGradleVersion, false, false) | ||||||
|  |         assert buildResultFile.delete() | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         run(['help', '--configuration-cache'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertResults('help', testGradleVersion, false, false) | ||||||
|  | 
 | ||||||
|  |         where: | ||||||
|  |         testGradleVersion << CONFIGURATION_CACHE_VERSIONS | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     def "produces build results file for #testGradleVersion with build scan published"() { | ||||||
|  |         assumeTrue testGradleVersion.compatibleWithCurrentJvm | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         declareGePluginApplication(testGradleVersion.gradleVersion) | ||||||
|  |         run(['help'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertResults('help', testGradleVersion, false, true) | ||||||
|  | 
 | ||||||
|  |         where: | ||||||
|  |         testGradleVersion << ALL_VERSIONS | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     def "produces build results file for #testGradleVersion with ge-plugin and no build scan published"() { | ||||||
|  |         assumeTrue testGradleVersion.compatibleWithCurrentJvm | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         declareGePluginApplication(testGradleVersion.gradleVersion) | ||||||
|  |         run(['help', '--no-scan'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertResults('help', testGradleVersion, false, false) | ||||||
|  | 
 | ||||||
|  |         where: | ||||||
|  |         testGradleVersion << ALL_VERSIONS | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     def "produces build results file for failing build on #testGradleVersion with build scan published"() { | ||||||
|  |         assumeTrue testGradleVersion.compatibleWithCurrentJvm | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         declareGePluginApplication(testGradleVersion.gradleVersion) | ||||||
|  |         addFailingTaskToBuild() | ||||||
|  |         runAndFail(['expectFailure'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertResults('expectFailure', testGradleVersion, true, true) | ||||||
|  | 
 | ||||||
|  |         where: | ||||||
|  |         testGradleVersion << ALL_VERSIONS | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     def "produces build results file for build with --configuration-cache on #testGradleVersion with build scan published"() { | ||||||
|  |         assumeTrue testGradleVersion.compatibleWithCurrentJvm | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         declareGePluginApplication(testGradleVersion.gradleVersion) | ||||||
|  |         run(['help', '--configuration-cache'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertResults('help', testGradleVersion, false, true) | ||||||
|  |         assert buildResultFile.delete() | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         run(['help', '--configuration-cache'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertResults('help', testGradleVersion, false, true) | ||||||
|  | 
 | ||||||
|  |         where: | ||||||
|  |         testGradleVersion << CONFIGURATION_CACHE_VERSIONS | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     void assertResults(String task, TestGradleVersion testGradleVersion, boolean hasFailure, boolean hasBuildScan) { | ||||||
|  |         def results = new JsonSlurper().parse(buildResultFile) | ||||||
|  |         assert results['rootProject'] == ROOT_PROJECT_NAME | ||||||
|  |         assert results['requestedTasks'] == task | ||||||
|  |         assert results['gradleVersion'] == testGradleVersion.gradleVersion.version | ||||||
|  |         assert results['buildFailed'] == hasFailure | ||||||
|  |         assert results['buildScanUri'] == (hasBuildScan ? "${mockScansServer.address}s/${PUBLIC_BUILD_SCAN_ID}" : null) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private File getBuildResultFile() { | ||||||
|  |         def buildResultsDir = new File(testProjectDir, '.build-results') | ||||||
|  |         assert buildResultsDir.directory | ||||||
|  |         assert buildResultsDir.listFiles().size() == 1 | ||||||
|  |         def resultsFile = buildResultsDir.listFiles()[0] | ||||||
|  |         assert resultsFile.name.startsWith('github-step-id') | ||||||
|  |         return resultsFile | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,77 @@ | |||||||
|  | package com.gradle.gradlebuildaction | ||||||
|  | 
 | ||||||
|  | import static org.junit.Assume.assumeTrue | ||||||
|  | 
 | ||||||
|  | class TestProjectRootCapture extends BaseInitScriptTest { | ||||||
|  |     def initScript = 'project-root-capture.init.gradle' | ||||||
|  | 
 | ||||||
|  |     def "captures project root on #testGradleVersion"() { | ||||||
|  |         assumeTrue testGradleVersion.compatibleWithCurrentJvm | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         run(['help'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertCapturesProjectRoot() | ||||||
|  | 
 | ||||||
|  |         where: | ||||||
|  |         testGradleVersion << CONFIGURATION_CACHE_VERSIONS | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     def "captures project root on #testGradleVersion when build fails"() { | ||||||
|  |         assumeTrue testGradleVersion.compatibleWithCurrentJvm | ||||||
|  | 
 | ||||||
|  |         addFailingTaskToBuild() | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         runAndFail(['expectFailure'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertCapturesProjectRoot() | ||||||
|  | 
 | ||||||
|  |         where: | ||||||
|  |         testGradleVersion << CONFIGURATION_CACHE_VERSIONS | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     def "captures project root on #testGradleVersion with --configuration-cache"() { | ||||||
|  |         assumeTrue testGradleVersion.compatibleWithCurrentJvm | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         run(['help', '--configuration-cache'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertCapturesProjectRoot() | ||||||
|  |         assert projectRootList.delete() | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         run(['help', '--configuration-cache'], initScript, testGradleVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assertCapturesProjectRoot() | ||||||
|  | 
 | ||||||
|  |         where: | ||||||
|  |         testGradleVersion << CONFIGURATION_CACHE_VERSIONS | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     def "has no effect on #testVersion"() { | ||||||
|  |         assumeTrue testVersion.compatibleWithCurrentJvm | ||||||
|  | 
 | ||||||
|  |         when: | ||||||
|  |         run(['help'], initScript, testVersion.gradleVersion) | ||||||
|  | 
 | ||||||
|  |         then: | ||||||
|  |         assert !projectRootList.exists() | ||||||
|  | 
 | ||||||
|  |         where: | ||||||
|  |         testVersion << (ALL_VERSIONS - CONFIGURATION_CACHE_VERSIONS) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void assertCapturesProjectRoot() { | ||||||
|  |         assert projectRootList.exists() | ||||||
|  |         assert new File(projectRootList.text.trim()).canonicalPath == testProjectDir.canonicalPath | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private File getProjectRootList() { | ||||||
|  |         new File(testProjectDir, 'project-roots.txt') | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user