Skip to content

Commit 422822e

Browse files
Project names are displayed in summary when access to Gradle Enterprise API is not available (#400)
* Fix typo * Include rootProjectName in build-scans.csv for Gradle * Include rootProjectName in build-scans.csv for Maven * Set project name from build-scans.csv in scripts * Polish a bit * Use same override logic for Build Scan IDs as Build Scan URLs --------- Co-authored-by: Etienne Studer <etienne@gradle.com>
1 parent eed0515 commit 422822e

File tree

6 files changed

+104
-15
lines changed

6 files changed

+104
-15
lines changed

components/configure-gradle-enterprise-maven-extension/src/main/java/com/gradle/ConfigureGradleEnterprise.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@ public class ConfigureGradleEnterprise implements GradleEnterpriseListener {
2323

2424
private static final String EXPERIMENT_DIR = System.getProperty("com.gradle.enterprise.build-validation.expDir");
2525

26+
private final RootProjectExtractor rootProjectExtractor;
2627
private final Logger logger;
2728

2829
@Inject
29-
public ConfigureGradleEnterprise(Logger logger) {
30+
public ConfigureGradleEnterprise(RootProjectExtractor rootProjectExtractor, Logger logger) {
31+
this.rootProjectExtractor = rootProjectExtractor;
3032
this.logger = logger;
3133
}
3234

@@ -46,11 +48,13 @@ public void configure(GradleEnterpriseApi api, MavenSession session) {
4648
buildScan.setAllowUntrustedServer(Boolean.parseBoolean(geAllowUntrustedServer));
4749
}
4850

49-
registerBuildScanActions(buildScan);
51+
String rootProjectName = rootProjectExtractor.extractRootProject(session).getName();
52+
53+
registerBuildScanActions(buildScan, rootProjectName);
5054
configureBuildScanPublishing(buildScan);
5155
}
5256

53-
private static void registerBuildScanActions(BuildScanApi buildScan) {
57+
private static void registerBuildScanActions(BuildScanApi buildScan, String rootProjectName) {
5458
buildScan.buildFinished(buildResult -> {
5559
// communicate via error file that no GE server is set
5660
boolean omitServerUrlValidation = parseBoolean(System.getProperty("com.gradle.enterprise.build-validation.omitServerUrlValidation"));
@@ -81,7 +85,7 @@ private static void registerBuildScanActions(BuildScanApi buildScan) {
8185
String baseUrl = String.format("%s://%s%s", buildScanUri.getScheme(), buildScanUri.getHost(), port);
8286

8387
File scanFile = new File(EXPERIMENT_DIR, "build-scans.csv");
84-
append(scanFile, String.format("%s,%s,%s,%s\n", runNum, baseUrl, buildScanUri, buildScanId));
88+
append(scanFile, String.format("%s,%s,%s,%s,%s\n", runNum, rootProjectName, baseUrl, buildScanUri, buildScanId));
8589
});
8690
}
8791

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.gradle;
2+
3+
import org.apache.maven.execution.MavenExecutionRequest;
4+
import org.apache.maven.execution.MavenSession;
5+
import org.apache.maven.model.building.ModelProcessor;
6+
import org.apache.maven.project.MavenProject;
7+
import org.apache.maven.project.ProjectBuilder;
8+
import org.apache.maven.project.ProjectBuildingException;
9+
import org.codehaus.plexus.logging.Logger;
10+
11+
import javax.inject.Inject;
12+
import java.io.File;
13+
import java.util.*;
14+
15+
import static java.util.Collections.emptyList;
16+
17+
public class RootProjectExtractor {
18+
19+
private final ProjectBuilder projectBuilder;
20+
private final ModelProcessor modelProcessor;
21+
private final Logger logger;
22+
23+
@Inject
24+
public RootProjectExtractor(ProjectBuilder projectBuilder, ModelProcessor modelProcessor, Logger logger) {
25+
this.projectBuilder = projectBuilder;
26+
this.modelProcessor = modelProcessor;
27+
this.logger = logger;
28+
}
29+
30+
public MavenProject extractRootProject(MavenSession session) {
31+
List<MavenProject> allProjects = discoverAllProjects(session.getAllProjects());
32+
File workspaceDirectory = getWorkspaceDirectory(session);
33+
34+
if (workspaceDirectory.equals(allProjects.get(0).getBasedir())) {
35+
return allProjects.get(0);
36+
}
37+
38+
File workspaceDirectoryPom = modelProcessor.locatePom(workspaceDirectory);
39+
if (workspaceDirectoryPom.exists()) {
40+
try {
41+
return projectBuilder.build(workspaceDirectoryPom, session.getProjectBuildingRequest()).getProject();
42+
} catch (ProjectBuildingException e) {
43+
logger.error("Error locating the top level project", e);
44+
}
45+
}
46+
47+
// return the first project if the top level project was not identified successfully
48+
return allProjects.get(0);
49+
}
50+
51+
private File getWorkspaceDirectory(MavenSession session) {
52+
MavenExecutionRequest request = session.getRequest();
53+
try {
54+
return request.getMultiModuleProjectDirectory();
55+
} catch (NoSuchMethodError ignored) {
56+
return new File(session.getExecutionRootDirectory());
57+
}
58+
}
59+
60+
private List<MavenProject> discoverAllProjects(Collection<MavenProject> sessionProjects) {
61+
Set<MavenProject> allProjects = new LinkedHashSet<>(sessionProjects);
62+
sessionProjects.stream().flatMap(p -> Optional.ofNullable(p.getCollectedProjects()).orElse(emptyList()).stream()).forEach(allProjects::add);
63+
return new ArrayList<MavenProject>(allProjects);
64+
}
65+
66+
}

components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/api/client/AuthenticationConfigurator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ private static Optional<String> lookupAccessKey(URL url, ConsoleLogger logger) {
5353

5454
return Optional.ofNullable(accessKeysByHost.getProperty(url.getHost()));
5555
} catch (IOException e) {
56-
logger.debug("Error whole trying to read access keys: " + e.getMessage() + ". Will try fetching build scan data without authentication.");
56+
logger.debug("Error while trying to read access keys: " + e.getMessage() + ". Will try fetching build scan data without authentication.");
5757
logger.debug(e);
5858
return Optional.empty();
5959
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ if (ccudPluginVersion && isNotAtLeast(ccudPluginVersion, '1.7')) {
9494
}
9595

9696
// register build scan listeners to capture build scan URL/id and to track publishing errors
97-
def registerBuildScanActions = { def buildScan ->
97+
def registerBuildScanActions = { def buildScan, def rootProjectName ->
9898
buildScan.buildScanPublished { publishedBuildScan ->
9999
// defer reading the `runNum` system property until execution time since it does not affect
100100
// the configuration of the build, and given its value changes between consecutive build invocations
@@ -111,7 +111,7 @@ def registerBuildScanActions = { def buildScan ->
111111
def baseUrl = "${buildScanUri.scheme}://${buildScanUri.host}${port}"
112112

113113
def scanFile = new File(expDir, 'build-scans.csv')
114-
scanFile.append("${runNum},${baseUrl},${buildScanUri},${buildScanId}\n")
114+
scanFile.append("${runNum},${rootProjectName},${baseUrl},${buildScanUri},${buildScanId}\n")
115115
}
116116

117117
buildScan.onError { error ->
@@ -212,7 +212,7 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) {
212212
"or use `--gradle-enterprise-server` when running the build validation script.")
213213
}
214214

215-
registerBuildScanActions(buildScan)
215+
registerBuildScanActions(buildScan, rootProject.name)
216216
configureBuildScanPublishing(buildScan)
217217
addBuildScanCustomData(buildScan)
218218
}
@@ -261,7 +261,7 @@ if (GradleVersion.current() < GradleVersion.version('6.0')) {
261261
"or use `--gradle-enterprise-server` when running the build validation script.")
262262
}
263263

264-
registerBuildScanActions(ext.buildScan)
264+
registerBuildScanActions(ext.buildScan, settings.rootProject.name)
265265
configureBuildScanPublishing(ext.buildScan)
266266
addBuildScanCustomData(ext.buildScan)
267267
}

components/scripts/lib/build-scan-online.sh

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,14 @@ read_build_scan_metadata() {
2424
debug ""
2525
fi
2626

27-
while IFS=, read -r run_num field_1 field_2 field_3; do
28-
base_urls[$run_num]="$field_1"
29-
build_scan_urls[$run_num]="$field_2"
30-
build_scan_ids[$run_num]="$field_3"
27+
local run_num project_name base_url build_scan_url build_scan_id
28+
29+
# shellcheck disable=SC2034
30+
while IFS=, read -r run_num project_name base_url build_scan_url build_scan_id; do
31+
project_names[$run_num]="${project_name}"
32+
base_urls[$run_num]="${base_url}"
33+
build_scan_urls[$run_num]="${build_scan_url}"
34+
build_scan_ids[$run_num]="${build_scan_id}"
3135
done <<< "${build_scan_metadata}"
3236
fi
3337
}

components/scripts/lib/build-scan-parse.sh

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,17 @@ parse_build_scan_row() {
8080
while IFS=, read -r run_num field_1 field_2 field_3 field_4 field_5 field_6 field_7 field_8 field_9 field_10 field_11 field_12 field_13 field_14 field_15 field_16 field_17 field_18 field_19 field_20 field_21; do
8181
debug "Build Scan $field_4 is for build $run_num"
8282

83-
project_names[run_num]="${field_1}"
83+
# The project_name should be overridden by Build Scan data if it is
84+
# available. This is so that the project names displayed in the summary are
85+
# consistent with what is shown in the Build Scan.
86+
87+
if [ -n "${field_1}" ]; then
88+
project_names[run_num]="${field_1}"
89+
fi
90+
91+
# If the following fields are already valued, then they should not be
92+
# overridden by Build Scan data. For locally executed builds, this data is
93+
# determined by the scripts as a result of execution.
8494

8595
if [ -z "${base_urls[run_num]}" ]; then
8696
base_urls[run_num]="${field_2}"
@@ -90,7 +100,9 @@ parse_build_scan_row() {
90100
build_scan_urls[run_num]="${field_3}"
91101
fi
92102

93-
build_scan_ids[run_num]="${field_4}"
103+
if [ -z "${build_scan_ids[run_num]}" ]; then
104+
build_scan_ids[run_num]="${field_4}"
105+
fi
94106

95107
if [ -z "${git_repos[run_num]}" ]; then
96108
git_repos[run_num]="${field_5}"
@@ -112,6 +124,9 @@ parse_build_scan_row() {
112124
build_outcomes[run_num]="${field_9}"
113125
fi
114126

127+
# The below fields are always set by Build Scan data regardless of their
128+
# previous value and are always safe to override.
129+
115130
remote_build_cache_urls[run_num]="${field_10}"
116131
remote_build_cache_shards[run_num]="${field_11}"
117132

0 commit comments

Comments
 (0)