Skip to content

Commit 8881142

Browse files
committed
Support Develocity 2024.2 API
1 parent 477fc6d commit 8881142

File tree

6 files changed

+158
-12
lines changed

6 files changed

+158
-12
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ java {
2525
}
2626

2727
develocityApi {
28-
version = "2024.1"
28+
version = "2024.2"
2929
}
3030

3131
val test by testing.suites.getting(JvmTestSuite::class) {

buildSrc/src/main/kotlin/conventions.develocity-api.gradle.kts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@file:Suppress("UnstableApiUsage", "unused")
1+
@file:Suppress("UnstableApiUsage", "unused", "HasPlatformType")
22

33
plugins {
44
id("java")
@@ -85,10 +85,20 @@ val generateDevelocityApiModels by tasks.registering(Sync::class) {
8585
into(layout.buildDirectory.dir(name))
8686
}
8787

88+
val checkSupportedBuildModels by tasks.registering(CheckSupportedBuildModels::class) {
89+
inputSpecification = resolvableDevelocityApiSpecification
90+
sources = sourceSets.main.map { it.java.sourceDirectories }
91+
outputReportDirectory = layout.buildDirectory.dir("reports/$name")
92+
}
93+
8894
val generate by tasks.registering {
8995
dependsOn(generateDevelocityApiModels)
9096
}
9197

98+
val check by tasks.getting {
99+
dependsOn(checkSupportedBuildModels)
100+
}
101+
92102
sourceSets {
93103
main {
94104
java {
@@ -118,3 +128,34 @@ abstract class PostProcessDevelocityApiSpecification : DefaultTask() {
118128
}
119129

120130
}
131+
132+
abstract class CheckSupportedBuildModels : DefaultTask() {
133+
134+
@get:InputFiles
135+
abstract val inputSpecification: Property<FileCollection>
136+
137+
@get:InputFiles
138+
abstract val sources: Property<FileCollection>
139+
140+
@get:OutputDirectory
141+
abstract val outputReportDirectory: DirectoryProperty
142+
143+
@TaskAction
144+
fun action() {
145+
val buildModelJava = sources.get().asFileTree.matching { include("**/BuildModel.java") }.singleFile.readText()
146+
val requiredBuildModels = inputSpecification.get()
147+
.singleFile
148+
.readLines()
149+
.filter { it.startsWith(" /api/builds/{id}") && it.endsWith(":") && it != " /api/builds/{id}:" }
150+
.map { it.removeSurrounding(" /api/builds/{id}/", ":") }
151+
val unsupportedBuildModels = requiredBuildModels.filter { !buildModelJava.contains(it) }
152+
if (unsupportedBuildModels.isNotEmpty()) {
153+
throw GradleException("Unsupported build models: ${unsupportedBuildModels.sorted().joinToString(", ")}")
154+
}
155+
outputReportDirectory.get()
156+
.asFile
157+
.resolve("supported-models.txt")
158+
.writeText(requiredBuildModels.subtract(unsupportedBuildModels).sorted().joinToString("\n"))
159+
}
160+
161+
}

src/main/java/dev/erichaag/develocity/api/BazelBuild.java

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,16 @@
44
import java.time.Instant;
55
import java.util.List;
66
import java.util.Objects;
7+
import java.util.Optional;
78
import java.util.Set;
9+
import java.util.stream.Stream;
810

11+
import static dev.erichaag.develocity.api.AttributesNotPresentException.attributesNotPresent;
12+
import static dev.erichaag.develocity.api.BuildModel.BAZEL_ATTRIBUTES;
13+
import static dev.erichaag.develocity.api.BuildModel.BAZEL_CRITICAL_PATH;
914
import static dev.erichaag.develocity.api.MethodNotSupportedException.methodNotSupportedForBazel;
10-
import static java.util.Collections.emptySet;
15+
import static java.util.Optional.ofNullable;
16+
import static java.util.stream.Collectors.toUnmodifiableSet;
1117

1218
public final class BazelBuild implements Build {
1319

@@ -39,12 +45,18 @@ public String getBuildAgentVersion() {
3945

4046
@Override
4147
public Instant getStartTime() {
42-
throw methodNotSupportedForBazel("getStartTime()");
48+
return getAttributes()
49+
.map(BazelAttributes::getBuildStartTime)
50+
.map(Instant::ofEpochMilli)
51+
.orElseThrow(attributesNotPresent("getStartTime()"));
4352
}
4453

4554
@Override
4655
public Duration getDuration() {
47-
throw methodNotSupportedForBazel("getDuration()");
56+
return getAttributes()
57+
.map(BazelAttributes::getBuildDuration)
58+
.map(Duration::ofMillis)
59+
.orElseThrow(attributesNotPresent("getDuration()"));
4860
}
4961

5062
@Override
@@ -54,7 +66,9 @@ public String getProjectName() {
5466

5567
@Override
5668
public List<String> getRequestedWorkUnits() {
57-
throw methodNotSupportedForBazel("getRequestedWorkUnits()");
69+
return getAttributes()
70+
.map(BazelAttributes::getTargetPatterns)
71+
.orElseThrow(attributesNotPresent("getRequestedWorkUnits()"));
5872
}
5973

6074
@Override
@@ -64,29 +78,52 @@ public boolean hasFailed() {
6478

6579
@Override
6680
public String getUser() {
67-
throw methodNotSupportedForBazel("getUser()");
81+
return getAttributes()
82+
.map(BazelAttributes::getUser)
83+
.orElseThrow(attributesNotPresent("getUser()"));
6884
}
6985

7086
@Override
7187
public List<String> getTags() {
72-
throw methodNotSupportedForBazel("getTags()");
88+
return getAttributes()
89+
.map(BazelAttributes::getTags)
90+
.orElseThrow(attributesNotPresent("getTags()"));
7391
}
7492

7593
@Override
7694
public List<Value> getValues() {
77-
throw methodNotSupportedForBazel("getValues()");
95+
return getAttributes()
96+
.orElseThrow(attributesNotPresent("getValues()"))
97+
.getValues()
98+
.stream()
99+
.map(Value::new)
100+
.toList();
78101
}
79-
80102
@Override
81103
public Set<BuildModel> getAvailableBuildModels() {
82-
return emptySet();
104+
final var buildModels = Stream.<BuildModel>builder();
105+
if (getAttributes().isPresent()) buildModels.add(BAZEL_ATTRIBUTES);
106+
if (getCriticalPath().isPresent()) buildModels.add(BAZEL_CRITICAL_PATH);
107+
return buildModels.build().collect(toUnmodifiableSet());
83108
}
84109

85110
@Override
86111
public ApiBuild getBuild() {
87112
return build;
88113
}
89114

115+
public Optional<BazelAttributes> getAttributes() {
116+
return ofNullable(build.getModels())
117+
.map(BuildModels::getBazelAttributes)
118+
.map(BuildModelsBazelAttributes::getModel);
119+
}
120+
121+
public Optional<BazelCriticalPath> getCriticalPath() {
122+
return ofNullable(build.getModels())
123+
.map(BuildModels::getBazelCriticalPath)
124+
.map(BuildModelsBazelCriticalPath::getModel);
125+
}
126+
90127
@Override
91128
public boolean equals(Object o) {
92129
if (this == o) return true;

src/main/java/dev/erichaag/develocity/api/BuildModel.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,26 @@
33
public enum BuildModel {
44

55
ALL_MODELS("*", null),
6+
BAZEL_ATTRIBUTES("bazel-attributes", BazelBuild.class),
7+
BAZEL_CRITICAL_PATH("bazel-critical-path", BazelBuild.class),
68
GRADLE_ARTIFACT_TRANSFORM_EXECUTIONS("gradle-artifact-transform-executions", GradleBuild.class),
79
GRADLE_ATTRIBUTES("gradle-attributes", GradleBuild.class),
810
GRADLE_BUILD_CACHE_PERFORMANCE("gradle-build-cache-performance", GradleBuild.class),
11+
GRADLE_BUILD_PROFILE_OVERVIEW("gradle-build-profile-overview", GradleBuild.class),
12+
GRADLE_CONFIGURATION_CACHE("gradle-configuration-cache", GradleBuild.class),
913
GRADLE_DEPRECATIONS("gradle-deprecations", GradleBuild.class),
1014
GRADLE_NETWORK_ACTIVITY("gradle-network-activity", GradleBuild.class),
15+
GRADLE_PLUGINS("gradle-plugins", GradleBuild.class),
1116
GRADLE_PROJECTS("gradle-projects", GradleBuild.class),
17+
GRADLE_RESOURCE_USAGE("gradle-resource-usage", GradleBuild.class),
1218
MAVEN_ATTRIBUTES("maven-attributes", MavenBuild.class),
1319
MAVEN_BUILD_CACHE_PERFORMANCE("maven-build-cache-performance", MavenBuild.class),
20+
MAVEN_BUILD_PROFILE_OVERVIEW("maven-build-profile-overview", MavenBuild.class),
1421
MAVEN_DEPENDENCY_RESOLUTION("maven-dependency-resolution", MavenBuild.class),
15-
MAVEN_MODULES("maven-modules", MavenBuild.class);
22+
MAVEN_MODULES("maven-modules", MavenBuild.class),
23+
MAVEN_PLUGINS("maven-plugins", MavenBuild.class),
24+
MAVEN_RESOURCE_USAGE("maven-resource-usage", MavenBuild.class),
25+
;
1626

1727
private final String modelName;
1828
private final Class<? extends Build> modelFor;

src/main/java/dev/erichaag/develocity/api/GradleBuild.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,16 @@
99
import java.util.stream.Stream;
1010

1111
import static dev.erichaag.develocity.api.AttributesNotPresentException.attributesNotPresent;
12+
import static dev.erichaag.develocity.api.BuildModel.GRADLE_ARTIFACT_TRANSFORM_EXECUTIONS;
1213
import static dev.erichaag.develocity.api.BuildModel.GRADLE_ATTRIBUTES;
1314
import static dev.erichaag.develocity.api.BuildModel.GRADLE_BUILD_CACHE_PERFORMANCE;
15+
import static dev.erichaag.develocity.api.BuildModel.GRADLE_BUILD_PROFILE_OVERVIEW;
16+
import static dev.erichaag.develocity.api.BuildModel.GRADLE_CONFIGURATION_CACHE;
1417
import static dev.erichaag.develocity.api.BuildModel.GRADLE_DEPRECATIONS;
1518
import static dev.erichaag.develocity.api.BuildModel.GRADLE_NETWORK_ACTIVITY;
19+
import static dev.erichaag.develocity.api.BuildModel.GRADLE_PLUGINS;
1620
import static dev.erichaag.develocity.api.BuildModel.GRADLE_PROJECTS;
21+
import static dev.erichaag.develocity.api.BuildModel.GRADLE_RESOURCE_USAGE;
1722
import static java.util.Optional.ofNullable;
1823
import static java.util.stream.Collectors.toUnmodifiableSet;
1924

@@ -110,11 +115,16 @@ public List<Value> getValues() {
110115
@Override
111116
public Set<BuildModel> getAvailableBuildModels() {
112117
final var buildModels = Stream.<BuildModel>builder();
118+
if (getArtifactTransformExecutions().isPresent()) buildModels.add(GRADLE_ARTIFACT_TRANSFORM_EXECUTIONS);
113119
if (getAttributes().isPresent()) buildModels.add(GRADLE_ATTRIBUTES);
114120
if (getBuildCachePerformance().isPresent()) buildModels.add(GRADLE_BUILD_CACHE_PERFORMANCE);
121+
if (getBuildProfileOverview().isPresent()) buildModels.add(GRADLE_BUILD_PROFILE_OVERVIEW);
122+
if (getConfigurationCache().isPresent()) buildModels.add(GRADLE_CONFIGURATION_CACHE);
115123
if (getDeprecations().isPresent()) buildModels.add(GRADLE_DEPRECATIONS);
116124
if (getNetworkActivity().isPresent()) buildModels.add(GRADLE_NETWORK_ACTIVITY);
125+
if (getPlugins().isPresent()) buildModels.add(GRADLE_PLUGINS);
117126
if (getProjects().isPresent()) buildModels.add(GRADLE_PROJECTS);
127+
if (getResourceUsage().isPresent()) buildModels.add(GRADLE_RESOURCE_USAGE);
118128
return buildModels.build().collect(toUnmodifiableSet());
119129
}
120130

@@ -142,6 +152,18 @@ public Optional<GradleBuildCachePerformance> getBuildCachePerformance() {
142152
.map(BuildModelsGradleBuildCachePerformance::getModel);
143153
}
144154

155+
public Optional<GradleBuildProfileOverview> getBuildProfileOverview() {
156+
return ofNullable(build.getModels())
157+
.map(BuildModels::getGradleBuildProfileOverview)
158+
.map(BuildModelsGradleBuildProfileOverview::getModel);
159+
}
160+
161+
public Optional<GradleConfigurationCache> getConfigurationCache() {
162+
return ofNullable(build.getModels())
163+
.map(BuildModels::getGradleConfigurationCache)
164+
.map(BuildModelsGradleConfigurationCache::getModel);
165+
}
166+
145167
public Optional<List<GradleDeprecationEntry>> getDeprecations() {
146168
return ofNullable(build.getModels())
147169
.map(BuildModels::getGradleDeprecations)
@@ -155,12 +177,24 @@ public Optional<GradleNetworkActivity> getNetworkActivity() {
155177
.map(BuildModelsGradleNetworkActivity::getModel);
156178
}
157179

180+
public Optional<GradlePlugins> getPlugins() {
181+
return ofNullable(build.getModels())
182+
.map(BuildModels::getGradlePlugins)
183+
.map(BuildModelsGradlePlugins::getModel);
184+
}
185+
158186
public Optional<List<GradleProject>> getProjects() {
159187
return ofNullable(build.getModels())
160188
.map(BuildModels::getGradleProjects)
161189
.map(BuildModelsGradleProjects::getModel);
162190
}
163191

192+
public Optional<GradleResourceUsage> getResourceUsage() {
193+
return ofNullable(build.getModels())
194+
.map(BuildModels::getGradleResourceUsage)
195+
.map(BuildModelsGradleResourceUsage::getModel);
196+
}
197+
164198
@Override
165199
public boolean equals(Object o) {
166200
if (this == o) return true;

src/main/java/dev/erichaag/develocity/api/MavenBuild.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111
import static dev.erichaag.develocity.api.AttributesNotPresentException.attributesNotPresent;
1212
import static dev.erichaag.develocity.api.BuildModel.MAVEN_ATTRIBUTES;
1313
import static dev.erichaag.develocity.api.BuildModel.MAVEN_BUILD_CACHE_PERFORMANCE;
14+
import static dev.erichaag.develocity.api.BuildModel.MAVEN_BUILD_PROFILE_OVERVIEW;
1415
import static dev.erichaag.develocity.api.BuildModel.MAVEN_DEPENDENCY_RESOLUTION;
1516
import static dev.erichaag.develocity.api.BuildModel.MAVEN_MODULES;
17+
import static dev.erichaag.develocity.api.BuildModel.MAVEN_PLUGINS;
18+
import static dev.erichaag.develocity.api.BuildModel.MAVEN_RESOURCE_USAGE;
1619
import static java.util.Optional.ofNullable;
1720
import static java.util.stream.Collectors.toUnmodifiableSet;
1821

@@ -111,8 +114,11 @@ public Set<BuildModel> getAvailableBuildModels() {
111114
final var buildModels = Stream.<BuildModel>builder();
112115
if (getAttributes().isPresent()) buildModels.add(MAVEN_ATTRIBUTES);
113116
if (getBuildCachePerformance().isPresent()) buildModels.add(MAVEN_BUILD_CACHE_PERFORMANCE);
117+
if (getBuildProfileOverview().isPresent()) buildModels.add(MAVEN_BUILD_PROFILE_OVERVIEW);
114118
if (getDependencyResolution().isPresent()) buildModels.add(MAVEN_DEPENDENCY_RESOLUTION);
115119
if (getModules().isPresent()) buildModels.add(MAVEN_MODULES);
120+
if (getPlugins().isPresent()) buildModels.add(MAVEN_PLUGINS);
121+
if (getResourceUsage().isPresent()) buildModels.add(MAVEN_RESOURCE_USAGE);
116122
return buildModels.build().collect(toUnmodifiableSet());
117123
}
118124

@@ -133,6 +139,12 @@ public Optional<MavenBuildCachePerformance> getBuildCachePerformance() {
133139
.map(BuildModelsMavenBuildCachePerformance::getModel);
134140
}
135141

142+
public Optional<MavenBuildProfileOverview> getBuildProfileOverview() {
143+
return ofNullable(build.getModels())
144+
.map(BuildModels::getMavenBuildProfileOverview)
145+
.map(BuildModelsMavenBuildProfileOverview::getModel);
146+
}
147+
136148
public Optional<MavenDependencyResolution> getDependencyResolution() {
137149
return ofNullable(build.getModels())
138150
.map(BuildModels::getMavenDependencyResolution)
@@ -145,6 +157,18 @@ public Optional<List<MavenModule>> getModules() {
145157
.map(BuildModelsMavenModules::getModel);
146158
}
147159

160+
public Optional<MavenPlugins> getPlugins() {
161+
return ofNullable(build.getModels())
162+
.map(BuildModels::getMavenPlugins)
163+
.map(BuildModelsMavenPlugins::getModel);
164+
}
165+
166+
public Optional<MavenResourceUsage> getResourceUsage() {
167+
return ofNullable(build.getModels())
168+
.map(BuildModels::getMavenResourceUsage)
169+
.map(BuildModelsMavenResourceUsage::getModel);
170+
}
171+
148172
@Override
149173
public boolean equals(Object o) {
150174
if (this == o) return true;

0 commit comments

Comments
 (0)