Skip to content

Commit 1661b1d

Browse files
committed
Use fully-resolved properties/config to determine build metadata
Fixes problems with tags/values being added in the wrong module or with the wrong value, because we were not considering user overrides or per-module overrides.
1 parent 0f40f55 commit 1661b1d

14 files changed

+304
-204
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
*
3+
* * Hibernate Search, full-text search for your domain model
4+
* *
5+
* * License: GNU Lesser General Public License (LGPL), version 2.1 or later
6+
* * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
7+
*
8+
*/
9+
package org.hibernate.search.develocity;
10+
11+
import org.hibernate.search.develocity.util.MavenMojoExecutionConfig;
12+
import org.hibernate.search.develocity.util.MavenProperties;
13+
14+
import com.gradle.maven.extension.api.cache.MojoMetadataProvider;
15+
import com.gradle.maven.extension.api.scan.BuildScanApi;
16+
17+
@FunctionalInterface
18+
public interface GoalMetadataProvider {
19+
void configure(Context context);
20+
21+
class Context {
22+
private final BuildScanApi buildScanApi;
23+
private final MojoMetadataProvider.Context metadataContext;
24+
private final MavenProperties properties;
25+
private final MavenMojoExecutionConfig configuration;
26+
27+
28+
public Context(BuildScanApi buildScanApi, MojoMetadataProvider.Context metadataContext) {
29+
this.buildScanApi = buildScanApi;
30+
this.metadataContext = metadataContext;
31+
this.properties = new MavenProperties( metadataContext.getSession(), metadataContext.getMojoExecution() );
32+
this.configuration = new MavenMojoExecutionConfig( metadataContext.getMojoExecution() );
33+
}
34+
35+
public BuildScanApi buildScan() {
36+
return buildScanApi;
37+
}
38+
39+
public MojoMetadataProvider.Context metadata() {
40+
return metadataContext;
41+
}
42+
43+
public MavenProperties properties() {
44+
return properties;
45+
}
46+
47+
public MavenMojoExecutionConfig configuration() {
48+
return configuration;
49+
}
50+
51+
public void buildScanDeduplicatedValue(String key, String value) {
52+
buildScanApi.executeOnce( key + value, ignored -> buildScanApi.value( key, value ) );
53+
}
54+
}
55+
}

src/main/java/org/hibernate/search/develocity/HibernateSearchProjectDevelocityListener.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@ public class HibernateSearchProjectDevelocityListener implements GradleEnterpris
2626

2727

2828
@Override
29-
public void configure(GradleEnterpriseApi gradleEnterpriseApi, MavenSession mavenSession) throws Exception {
29+
public void configure(GradleEnterpriseApi gradleEnterpriseApi, MavenSession mavenSession) {
3030
gradleEnterpriseApi.getBuildScan().publishAlways();
3131
((BuildScanApiInternal) gradleEnterpriseApi.getBuildScan()).publishIfAuthenticated();
32-
BuildScanMetadata.addMetadataToBuildScan(gradleEnterpriseApi.getBuildScan(), mavenSession);
32+
33+
BuildScanMetadata.addMainMetadata(gradleEnterpriseApi.getBuildScan());
3334

3435
Normalization.configureNormalization(gradleEnterpriseApi.getBuildCache());
3536

src/main/java/org/hibernate/search/develocity/SimpleConfiguredPlugin.java

+24-31
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@
55
import java.util.Map.Entry;
66
import java.util.function.Function;
77

8+
import org.hibernate.search.develocity.scan.BuildScanMetadata;
89
import org.hibernate.search.develocity.util.JavaVersions;
9-
import org.hibernate.search.develocity.util.MavenConfigs;
1010

1111
import com.gradle.maven.extension.api.GradleEnterpriseApi;
1212
import com.gradle.maven.extension.api.cache.MojoMetadataProvider;
13-
import com.gradle.maven.extension.api.cache.NormalizationProvider;
14-
import com.gradle.maven.extension.api.scan.BuildScanApi;
1513
import org.apache.maven.execution.MavenSession;
1614
import org.apache.maven.project.MavenProject;
1715

@@ -27,16 +25,17 @@ public void configureBuildCache(GradleEnterpriseApi gradleEnterpriseApi, MavenSe
2725
return;
2826
}
2927

30-
Map<String, GoalMetadataProvider> goalMetadataProviders = Collections.unmodifiableMap(getGoalMetadataProviders(gradleEnterpriseApi.getBuildScan()));
28+
Map<String, GoalMetadataProvider> goalMetadataProviders = Collections.unmodifiableMap(getGoalMetadataProviders());
3129

3230
Log.debug(getPluginName(), "Build cache is enabled. Configuring metadata providers.");
3331
Log.debug(getPluginName(), "Configuring metadata for goals: " + goalMetadataProviders.keySet());
3432

35-
for (Entry<String, GoalMetadataProvider> goalMetadataProviderEntry : goalMetadataProviders.entrySet()) {
36-
if (goalMetadataProviderEntry.getKey().equalsIgnoreCase(context.getMojoExecution().getGoal())) {
37-
goalMetadataProviderEntry.getValue().configure(context);
38-
}
39-
}
33+
for ( Entry<String, GoalMetadataProvider> goalMetadataProviderEntry : goalMetadataProviders.entrySet() ) {
34+
if ( goalMetadataProviderEntry.getKey().equalsIgnoreCase( context.getMojoExecution().getGoal() ) ) {
35+
goalMetadataProviderEntry.getValue()
36+
.configure( new GoalMetadataProvider.Context( gradleEnterpriseApi.getBuildScan(), context ) );
37+
}
38+
}
4039
});
4140
});
4241
}
@@ -47,10 +46,11 @@ protected boolean isBuildCacheEnabled(MavenProject project) {
4746
return true;
4847
}
4948

50-
protected abstract Map<String, GoalMetadataProvider> getGoalMetadataProviders(BuildScanApi buildScanApi);
49+
protected abstract Map<String, GoalMetadataProvider> getGoalMetadataProviders();
5150

52-
protected static void dependsOnGav(MojoMetadataProvider.Context.Inputs inputs, MojoMetadataProvider.Context context) {
53-
inputs.property("_internal_gav", context.getProject().getGroupId() + ":" + context.getProject().getArtifactId() + ":" + context.getProject().getVersion());
51+
protected static void dependsOnGav(MojoMetadataProvider.Context.Inputs inputs, GoalMetadataProvider.Context context) {
52+
var project = context.metadata().getProject();
53+
inputs.property("_internal_gav", project.getGroupId() + ":" + project.getArtifactId() + ":" + project.getVersion());
5454
}
5555

5656

@@ -65,31 +65,24 @@ protected static void dependsOnMavenJavaVersion(MojoMetadataProvider.Context.Inp
6565
}
6666

6767
protected static void dependsOnConfigurableJavaExecutable(MojoMetadataProvider.Context.Inputs inputs,
68-
MojoMetadataProvider.Context context, String configChildName,
68+
GoalMetadataProvider.Context context, String configChildName, Boolean skipped,
6969
Function<String, String> executableToVersion) {
70-
var configChild = context.getMojoExecution().getConfiguration().getChild( configChildName );
71-
String javaExecutable = configChild == null ? null : configChild.getValue();
70+
String javaExecutable = context.configuration().getString( configChildName );
7271
String javaVersion = executableToVersion.apply( javaExecutable );
72+
boolean canCacheExactVersion = context.properties().cacheExactJavaVersion();
7373
inputs.property( "_internal_" + configChildName + "_java_version",
74-
MavenConfigs.cacheExactJavaVersion( context.getSession() )
74+
canCacheExactVersion
7575
? javaVersion
7676
: JavaVersions.toJdkMajor( javaVersion, javaVersion ) );
77-
Log.info(
78-
context.getMojoExecution().getPlugin().getArtifactId(),
79-
"Using %s at path '%s'; resolved version: %s"
80-
.formatted( configChildName, javaExecutable, javaVersion.replace( '\n', ' ' ).trim() )
81-
);
82-
}
83-
84-
@FunctionalInterface
85-
public interface PluginNormalizationProvider {
8677

87-
void configure(NormalizationProvider.Context context);
78+
if ( skipped == null || !skipped ) {
79+
BuildScanMetadata.addJavaExecutableVersion( context, javaExecutable, javaVersion, canCacheExactVersion );
80+
Log.info(
81+
context.metadata().getMojoExecution().getPlugin().getArtifactId(),
82+
"Using %s at path '%s'; resolved version: %s"
83+
.formatted( configChildName, javaExecutable, javaVersion.replace( '\n', ' ' ).trim() )
84+
);
85+
}
8886
}
8987

90-
@FunctionalInterface
91-
public interface GoalMetadataProvider {
92-
93-
void configure(MojoMetadataProvider.Context context);
94-
}
9588
}

src/main/java/org/hibernate/search/develocity/plugins/CompilerConfiguredPlugin.java

+8-7
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
import java.util.Map;
44

5+
import org.hibernate.search.develocity.GoalMetadataProvider;
56
import org.hibernate.search.develocity.SimpleConfiguredPlugin;
67
import org.hibernate.search.develocity.util.JavaVersions;
78

8-
import com.gradle.maven.extension.api.cache.MojoMetadataProvider;
9-
import com.gradle.maven.extension.api.scan.BuildScanApi;
10-
119
public class CompilerConfiguredPlugin extends SimpleConfiguredPlugin {
1210

1311
@Override
@@ -16,16 +14,19 @@ protected String getPluginName() {
1614
}
1715

1816
@Override
19-
protected Map<String, GoalMetadataProvider> getGoalMetadataProviders(BuildScanApi buildScanApi) {
17+
protected Map<String, GoalMetadataProvider> getGoalMetadataProviders() {
2018
return Map.of(
2119
"compile", CompilerConfiguredPlugin::configureCompile,
2220
"testCompile", CompilerConfiguredPlugin::configureCompile
2321
);
2422
}
2523

26-
private static void configureCompile(MojoMetadataProvider.Context context) {
27-
context.inputs( inputs -> {
28-
dependsOnConfigurableJavaExecutable( inputs, context, "executable", JavaVersions::forJavacExecutable );
24+
private static void configureCompile(GoalMetadataProvider.Context context) {
25+
var metadata = context.metadata();
26+
metadata.inputs( inputs -> {
27+
dependsOnConfigurableJavaExecutable( inputs, context, "executable",
28+
context.configuration().getBoolean( "skip" ),
29+
JavaVersions::forJavacExecutable );
2930
} );
3031
}
3132
}

src/main/java/org/hibernate/search/develocity/plugins/EnforcerConfiguredPlugin.java

+7-8
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33
import java.util.Map;
44
import java.util.stream.Collectors;
55

6+
import org.hibernate.search.develocity.GoalMetadataProvider;
67
import org.hibernate.search.develocity.SimpleConfiguredPlugin;
78

8-
import com.gradle.maven.extension.api.cache.MojoMetadataProvider;
9-
import com.gradle.maven.extension.api.scan.BuildScanApi;
10-
119
public class EnforcerConfiguredPlugin extends SimpleConfiguredPlugin {
1210

1311
@Override
@@ -16,20 +14,21 @@ protected String getPluginName() {
1614
}
1715

1816
@Override
19-
protected Map<String, GoalMetadataProvider> getGoalMetadataProviders(BuildScanApi buildScanApi) {
17+
protected Map<String, GoalMetadataProvider> getGoalMetadataProviders() {
2018
return Map.of(
2119
"enforce", EnforcerConfiguredPlugin::configureEnforce);
2220
}
2321

24-
private static void configureEnforce(MojoMetadataProvider.Context context) {
25-
context.inputs(inputs -> {
22+
private static void configureEnforce(GoalMetadataProvider.Context context) {
23+
var metadata = context.metadata();
24+
metadata.inputs(inputs -> {
2625
dependsOnGav(inputs, context);
2726
inputs.properties("skip", "fail", "failFast", "failIfNoRules", "rules", "rulesToExecute", "rulesToSkip",
2827
"ignoreCache");
2928
dependsOnOs(inputs);
3029
dependsOnMavenJavaVersion(inputs);
3130

32-
String dependencies = context.getProject().getArtifacts().stream()
31+
String dependencies = metadata.getProject().getArtifacts().stream()
3332
.map(a -> a.getGroupId() + ":" + a.getArtifactId() + ":" + a.getVersion() + ":" + a.getClassifier())
3433
.sorted()
3534
.collect(Collectors.joining("\n"));
@@ -39,7 +38,7 @@ private static void configureEnforce(MojoMetadataProvider.Context context) {
3938
inputs.ignore("project", "mojoExecution", "session");
4039
});
4140

42-
context.outputs(outputs -> {
41+
metadata.outputs(outputs -> {
4342
outputs.cacheable("If the inputs and dependencies are identical, we should have the same output");
4443
});
4544
}

src/main/java/org/hibernate/search/develocity/plugins/FailsafeConfiguredPlugin.java

+22-18
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,10 @@
22

33
import java.util.Map;
44

5+
import org.hibernate.search.develocity.GoalMetadataProvider;
56
import org.hibernate.search.develocity.scan.BuildScanMetadata;
6-
import org.hibernate.search.develocity.util.MavenConfigs;
77

88
import com.gradle.maven.extension.api.cache.MojoMetadataProvider;
9-
import com.gradle.maven.extension.api.scan.BuildScanApi;
10-
11-
import org.apache.maven.plugin.MojoExecution;
129

1310
public class FailsafeConfiguredPlugin extends SurefireConfiguredPlugin {
1411

@@ -18,47 +15,54 @@ protected String getPluginName() {
1815
}
1916

2017
@Override
21-
protected Map<String, GoalMetadataProvider> getGoalMetadataProviders(BuildScanApi buildScanApi) {
18+
protected Map<String, GoalMetadataProvider> getGoalMetadataProviders() {
2219
return Map.of(
23-
"integration-test", context -> configureIntegrationTest( context, buildScanApi )
20+
"integration-test", this::configureIntegrationTest
2421
);
2522
}
2623

27-
private static void configureIntegrationTest(MojoMetadataProvider.Context context, BuildScanApi buildScanApi) {
24+
private void configureIntegrationTest(GoalMetadataProvider.Context context) {
2825
configureTest( context );
29-
context.inputs( inputs -> {
26+
context.metadata().inputs( inputs -> {
3027
// We try to be smart about which container is used for the build scan,
3128
// because an error would be of little consequence there,
3229
// but here it could lead to missing important regressions.
3330
// So we just consider all Dockerfiles are used in all integration tests,
3431
// and invalidate all integration test caches as soon as one Dockerfile changes.
35-
var containersPath = MavenConfigs.getFailsafeSystemProperty( context.getMojoExecution(),
36-
"org.hibernate.search.integrationtest.container.directory" );
32+
var containersPath = context.configuration()
33+
.getFailsafeSystemProperty( "org.hibernate.search.integrationtest.container.directory" );
3734
if ( containersPath != null ) {
3835
inputs.fileSet( "containers", containersPath, fileSet -> {
3936
fileSet.normalizationStrategy(
4037
MojoMetadataProvider.Context.FileSet.NormalizationStrategy.RELATIVE_PATH );
4138
} );
4239
}
4340

44-
var repackagedJarPath = MavenConfigs.getFailsafeSystemProperty( context.getMojoExecution(),
45-
"test.repackaged-jar-path" );
41+
var repackagedJarPath = context.configuration()
42+
.getFailsafeSystemProperty( "test.repackaged-jar-path" );
4643
if ( repackagedJarPath != null ) {
4744
inputs.fileSet( "repackaged-jar", repackagedJarPath, fileSet -> {
4845
fileSet.normalizationStrategy(
4946
MojoMetadataProvider.Context.FileSet.NormalizationStrategy.RELATIVE_PATH );
5047
} );
5148
}
5249
} );
53-
if ( !isSkipped( context.getMojoExecution() ) ) {
54-
BuildScanMetadata.addFailsafeMetadataToBuildScan( buildScanApi, context.getSession(), context.getMojoExecution() );
50+
51+
if ( !isSkipped( context ) ) {
52+
BuildScanMetadata.addFailsafeMetadata( context );
5553
}
5654
}
5755

58-
private static boolean isSkipped(MojoExecution mojoExecution) {
59-
return MavenConfigs.getBooleanConfig( mojoExecution, "skip" )
60-
|| MavenConfigs.getBooleanConfig( mojoExecution, "skipITs" )
61-
|| MavenConfigs.getBooleanConfig( mojoExecution, "skipExec" );
56+
@Override
57+
protected boolean isSkipped(GoalMetadataProvider.Context context) {
58+
return context.configuration().getBoolean( "skip" )
59+
|| context.properties().getBoolean( "maven.test.skip" )
60+
|| context.configuration().getBoolean( "skipITs" )
61+
|| context.properties().getBoolean( "skipITs" )
62+
|| context.configuration().getBoolean( "skipTests" )
63+
|| context.properties().getBoolean( "skipTests" )
64+
|| context.configuration().getBoolean( "skipExec" )
65+
|| context.properties().getBoolean( "maven.test.skip.exec" );
6266
}
6367

6468
}

0 commit comments

Comments
 (0)