diff --git a/components/capture-build-scan-url-maven-extension/src/main/java/com/gradle/CaptureBuildScansListener.java b/components/capture-build-scan-url-maven-extension/src/main/java/com/gradle/CaptureBuildScansListener.java index ee57289f..63d40f7f 100644 --- a/components/capture-build-scan-url-maven-extension/src/main/java/com/gradle/CaptureBuildScansListener.java +++ b/components/capture-build-scan-url-maven-extension/src/main/java/com/gradle/CaptureBuildScansListener.java @@ -4,7 +4,6 @@ import com.gradle.maven.extension.api.GradleEnterpriseListener; import com.gradle.maven.extension.api.scan.BuildScanApi; import org.apache.maven.execution.MavenSession; -import org.apache.maven.project.MavenProject; import org.codehaus.plexus.logging.Logger; import javax.inject.Inject; @@ -20,12 +19,10 @@ public class CaptureBuildScansListener implements GradleEnterpriseListener { private static final String EXPERIMENT_DIR = System.getProperty("com.gradle.enterprise.build_validation.experimentDir"); - private final RootProjectExtractor rootProjectExtractor; private final Logger logger; @Inject - public CaptureBuildScansListener(RootProjectExtractor rootProjectExtractor, Logger logger) { - this.rootProjectExtractor = rootProjectExtractor; + public CaptureBuildScansListener(Logger logger) { this.logger = logger; } @@ -36,7 +33,7 @@ public void configure(GradleEnterpriseApi api, MavenSession session) throws Exce BuildScanApi buildScan = api.getBuildScan(); addCustomDataOnBuildFinished(buildScan); - capturePublishedBuildScan(buildScan, rootProjectExtractor.extractRootProject(session)); + capturePublishedBuildScan(buildScan); } private static void addCustomDataOnBuildFinished(BuildScanApi buildScan) { @@ -71,7 +68,7 @@ private static String urlEncode(String str) { } } - private void capturePublishedBuildScan(BuildScanApi buildScan, MavenProject rootProject) { + private void capturePublishedBuildScan(BuildScanApi buildScan) { buildScan.buildScanPublished(scan -> { logger.debug("Saving build scan data to build-scans.csv"); String port = scan.getBuildScanUri().getPort() != -1 ? ":" + scan.getBuildScanUri().getPort() : ""; @@ -80,7 +77,7 @@ private void capturePublishedBuildScan(BuildScanApi buildScan, MavenProject root try (FileWriter fw = new FileWriter(EXPERIMENT_DIR + "/build-scans.csv", true); BufferedWriter bw = new BufferedWriter(fw); PrintWriter out = new PrintWriter(bw)) { - out.println(String.format("%s,%s,%s,%s", rootProject.getName(), baseUrl, scan.getBuildScanUri(), scan.getBuildScanId())); + out.println(String.format("%s,%s,%s", baseUrl, scan.getBuildScanUri(), scan.getBuildScanId())); } catch (IOException e) { logger.error("Unable to save scan data to build-scans.csv: " + e.getMessage(), e); throw new RuntimeException("Unable to save scan data to build-scans.csv: " + e.getMessage(), e); diff --git a/components/capture-build-scan-url-maven-extension/src/main/java/com/gradle/RootProjectExtractor.java b/components/capture-build-scan-url-maven-extension/src/main/java/com/gradle/RootProjectExtractor.java deleted file mode 100644 index c93864e2..00000000 --- a/components/capture-build-scan-url-maven-extension/src/main/java/com/gradle/RootProjectExtractor.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.gradle; - -import org.apache.maven.execution.ExecutionEvent; -import org.apache.maven.execution.MavenExecutionRequest; -import org.apache.maven.execution.MavenSession; -import org.apache.maven.model.building.ModelProcessor; -import org.apache.maven.project.MavenProject; -import org.apache.maven.project.ProjectBuilder; -import org.apache.maven.project.ProjectBuildingException; -import org.codehaus.plexus.logging.Logger; - -import javax.inject.Inject; -import java.io.File; -import java.util.*; - -import static java.util.Collections.emptyList; - -public class RootProjectExtractor { - private final ProjectBuilder projectBuilder; - private final ModelProcessor modelProcessor; - private final Logger logger; - - @Inject - public RootProjectExtractor(ProjectBuilder projectBuilder, ModelProcessor modelProcessor, Logger logger) { - this.projectBuilder = projectBuilder; - this.modelProcessor = modelProcessor; - this.logger = logger; - } - - public MavenProject extractRootProject(ExecutionEvent event) { - return extractRootProject(event.getSession()); - } - - public MavenProject extractRootProject(MavenSession session) { - List allProjects = discoverAllProjects(session.getAllProjects()); - File workspaceDirectory = getWorkspaceDirectory(session); - - if (workspaceDirectory.equals(allProjects.get(0).getBasedir())) { - return allProjects.get(0); - } - - File workspaceDirectoryPom = modelProcessor.locatePom(workspaceDirectory); - if (workspaceDirectoryPom.exists()) { - try { - return projectBuilder.build(workspaceDirectoryPom, session.getProjectBuildingRequest()).getProject(); - } catch (ProjectBuildingException e) { - logger.error("Exception locating the top level project", e); - } - } - - // We didn't successfully identify the root project, so just return the first project. - return allProjects.get(0); - } - - private File getWorkspaceDirectory(MavenSession session) { - MavenExecutionRequest request = session.getRequest(); - try { - return request.getMultiModuleProjectDirectory(); - } catch (NoSuchMethodError ignored) { - return new File(session.getExecutionRootDirectory()); - } - } - - /** - * Older Maven versions under-reported the list of discovered projects. - * This method discovers all their submodules. For newer Maven versions it is a no-op. - */ - private List discoverAllProjects(Collection sessionProjects) { - Set allProjects = new LinkedHashSet<>(sessionProjects); - sessionProjects.stream().flatMap(p -> Optional.ofNullable(p.getCollectedProjects()).orElse(emptyList()).stream()).forEach(allProjects::add); - return new ArrayList(allProjects); - } -} diff --git a/components/scripts/gradle/01-validate-incremental-building.sh b/components/scripts/gradle/01-validate-incremental-building.sh index 8c637ca1..a0938574 100755 --- a/components/scripts/gradle/01-validate-incremental-building.sh +++ b/components/scripts/gradle/01-validate-incremental-building.sh @@ -155,8 +155,7 @@ print_gradle_command() { fetch_build_cache_metrics() { if [ "$build_scan_publishing_mode" == "on" ]; then - read_build_scan_metadata - fetch_and_read_build_scan_data build_cache_metrics_only "${build_scan_urls[@]}" + process_build_scan_data_online else find_and_read_build_scan_dumps fi @@ -300,7 +299,6 @@ EOF } explain_and_print_summary() { - read_build_scan_metadata local text if [[ "${build_scan_publishing_mode}" == "on" ]]; then IFS='' read -r -d '' text <}" } -fetch_build_cache_metrics() { - read_build_scan_metadata - fetch_and_read_build_scan_data build_cache_metrics_only "${build_scan_urls[@]}" -} - # Overrides info.sh#print_performance_metrics print_performance_metrics() { print_performance_characteristics @@ -505,7 +500,6 @@ generate_command_to_repeat_experiment() { } explain_and_print_summary() { - read_build_scan_metadata local text IFS='' read -r -d '' text < if (!gradle.rootProject.pluginManager.hasPlugin("com.gradle.build-scan")) { throw new IllegalStateException("The com.gradle.build-scan plugin is missing from the project (see https://docs.gradle.com/enterprise/gradle-plugin/#gradle_5_x).") } - registerCallbacks(gradle.rootProject.extensions["gradleEnterprise"], gradle.rootProject.name) + registerCallbacks(gradle.rootProject.extensions["gradleEnterprise"]) } } else { throw new IllegalStateException("Build validation not supported for Gradle ${GradleVersion.current()}. Upgrade your project's build to Gradle 5 or newer.") } } -def registerCallbacks(gradleEnterprise, rootProjectName) { +void registerCallbacks(gradleEnterprise) { gradleEnterprise.with { buildScan { def scanFile = new File(experimentDir, "build-scans.csv") @@ -35,7 +35,7 @@ def registerCallbacks(gradleEnterprise, rootProjectName) { def buildScanId = buildScan.buildScanId def port = (buildScanUri.port != -1) ? ":" + buildScanUri.port : "" def baseUrl = "${buildScanUri.scheme}://${buildScanUri.host}${port}" - scanFile.append("${rootProjectName},${baseUrl},${buildScanUri},${buildScanId}\n") + scanFile.append("${baseUrl},${buildScanUri},${buildScanId}\n") } def errorFile = new File(experimentDir, "build-scan-publish-error.txt") onError { error -> diff --git a/components/scripts/lib/build_scan.sh b/components/scripts/lib/build_scan.sh index 08e57a08..bcd5d75b 100644 --- a/components/scripts/lib/build_scan.sh +++ b/components/scripts/lib/build_scan.sh @@ -2,16 +2,33 @@ readonly FETCH_BUILD_SCAN_DATA_JAR="${LIB_DIR}/export-api-clients/fetch-build-scan-data-cmdline-tool-${SCRIPT_VERSION}-all.jar" +# This is a helper function for the common pattern of reading Build Scan metadata +# from the build-scans.csv file, then retrieving build metrics using the Gradle +# Enterprise API. +process_build_scan_data_online() { + read_build_scan_metadata + fetch_and_read_build_scan_data build_cache_metrics_only "${build_scan_urls[@]}" +} + read_build_scan_metadata() { # This isn't the most robust way to read a CSV, # but we control the CSV so we don't have to worry about various CSV edge cases if [ -f "${BUILD_SCAN_FILE}" ]; then - while IFS=, read -r field_1 field_2 field_3 field_4; do - project_names+=("$field_1") - base_urls+=("$field_2") - build_scan_urls+=("$field_3") - build_scan_ids+=("$field_4") - done < "${BUILD_SCAN_FILE}" + local build_scan_metadata + build_scan_metadata=$(< "${BUILD_SCAN_FILE}") + + if [[ "$_arg_debug" == "on" ]]; then + debug "Raw Build Scan metadata (build-scans.csv)" + debug "---------------------------" + debug "${build_scan_metadata}" + debug "" + fi + + while IFS=, read -r field_1 field_2 field_3; do + base_urls+=("$field_1") + build_scan_urls+=("$field_2") + build_scan_ids+=("$field_3") + done <<< "${build_scan_metadata}" fi } diff --git a/components/scripts/lib/info.sh b/components/scripts/lib/info.sh index b1da332e..d7c04b94 100644 --- a/components/scripts/lib/info.sh +++ b/components/scripts/lib/info.sh @@ -89,8 +89,6 @@ print_warnings() { } print_summary() { - #defined in build_scan.sh - read_build_scan_metadata #defined in build_scan.sh detect_warnings_from_build_scans diff --git a/components/scripts/maven/01-validate-local-build-caching-same-location.sh b/components/scripts/maven/01-validate-local-build-caching-same-location.sh index 50ae293b..80648673 100755 --- a/components/scripts/maven/01-validate-local-build-caching-same-location.sh +++ b/components/scripts/maven/01-validate-local-build-caching-same-location.sh @@ -159,8 +159,7 @@ print_maven_command() { fetch_build_cache_metrics() { if [ "$build_scan_publishing_mode" == "on" ]; then - read_build_scan_metadata - fetch_and_read_build_scan_data build_cache_metrics_only "${build_scan_urls[@]}" + process_build_scan_data_online else find_and_read_build_scan_dumps fi @@ -305,7 +304,6 @@ EOF } explain_and_print_summary() { - read_build_scan_metadata local text if [[ "${build_scan_publishing_mode}" == "on" ]]; then IFS='' read -r -d '' text <}" } -fetch_build_cache_metrics() { - read_build_scan_metadata - fetch_and_read_build_scan_data build_cache_metrics_only "${build_scan_urls[@]}" -} - # Overrides info.sh#print_performance_metrics print_performance_metrics() { print_performance_characteristics @@ -512,7 +507,6 @@ generate_command_to_repeat_experiment() { } explain_and_print_summary() { - read_build_scan_metadata local text IFS='' read -r -d '' text <