Skip to content

Commit 2769d37

Browse files
authored
Merge pull request #5 from yrodiere/more-tags
Add more tags to build scans
2 parents c8223d7 + 5cd0764 commit 2769d37

File tree

3 files changed

+179
-4
lines changed

3 files changed

+179
-4
lines changed

pom.xml

+45
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
<maven-core.version>3.9.6</maven-core.version>
1616
<plexus-component.version>2.2.0</plexus-component.version>
1717
<sisu-inject.version>0.3.5</sisu-inject.version>
18+
<junit.version>5.10.2</junit.version>
1819

1920
<maven-compiler-plugin.version>3.12.1</maven-compiler-plugin.version>
21+
<maven-surefire-plugin.version>3.2.5</maven-surefire-plugin.version>
2022
<maven.compiler.source>17</maven.compiler.source>
2123
<maven.compiler.release>17</maven.compiler.release>
2224
<maven.compiler.parameters>true</maven.compiler.parameters>
@@ -34,6 +36,18 @@
3436
<ossrh.snapshots.repo.url>https://oss.sonatype.org/content/repositories/snapshots</ossrh.snapshots.repo.url>
3537
</properties>
3638

39+
<dependencyManagement>
40+
<dependencies>
41+
<dependency>
42+
<groupId>org.junit</groupId>
43+
<artifactId>junit-bom</artifactId>
44+
<version>${junit.version}</version>
45+
<type>pom</type>
46+
<scope>import</scope>
47+
</dependency>
48+
</dependencies>
49+
</dependencyManagement>
50+
3751
<dependencies>
3852
<dependency>
3953
<groupId>org.apache.maven</groupId>
@@ -53,6 +67,32 @@
5367
<version>${gradle-enterprise-maven-extension.version}</version>
5468
<scope>provided</scope>
5569
</dependency>
70+
71+
<dependency>
72+
<groupId>org.junit.jupiter</groupId>
73+
<artifactId>junit-jupiter</artifactId>
74+
<scope>test</scope>
75+
</dependency>
76+
<dependency>
77+
<groupId>org.junit.platform</groupId>
78+
<artifactId>junit-platform-suite-engine</artifactId>
79+
<scope>test</scope>
80+
</dependency>
81+
<dependency>
82+
<groupId>org.junit.platform</groupId>
83+
<artifactId>junit-platform-launcher</artifactId>
84+
<scope>test</scope>
85+
</dependency>
86+
<dependency>
87+
<groupId>org.junit.jupiter</groupId>
88+
<artifactId>junit-jupiter-engine</artifactId>
89+
<scope>test</scope>
90+
</dependency>
91+
<dependency>
92+
<groupId>org.junit.jupiter</groupId>
93+
<artifactId>junit-jupiter-params</artifactId>
94+
<scope>test</scope>
95+
</dependency>
5696
</dependencies>
5797

5898
<build>
@@ -71,6 +111,11 @@
71111
</annotationProcessorPaths>
72112
</configuration>
73113
</plugin>
114+
<plugin>
115+
<groupId>org.apache.maven.plugins</groupId>
116+
<artifactId>maven-surefire-plugin</artifactId>
117+
<version>${maven-surefire-plugin.version}</version>
118+
</plugin>
74119
<plugin>
75120
<groupId>org.codehaus.plexus</groupId>
76121
<artifactId>plexus-component-metadata</artifactId>

src/main/java/org/hibernate/search/develocity/scan/BuildScanMetadata.java

+104-4
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,27 @@
22

33
import static org.hibernate.search.develocity.util.Strings.isBlank;
44

5+
import java.io.IOException;
6+
import java.nio.file.Files;
7+
import java.nio.file.Path;
8+
import java.util.Objects;
59
import java.util.function.Function;
10+
import java.util.regex.Pattern;
611

712
import org.hibernate.search.develocity.Log;
813
import org.hibernate.search.develocity.util.JavaVersions;
14+
import org.hibernate.search.develocity.util.Strings;
915

1016
import com.gradle.maven.extension.api.scan.BuildScanApi;
1117
import org.apache.maven.execution.MavenSession;
18+
import org.apache.maven.project.MavenProject;
1219

1320
public final class BuildScanMetadata {
1421

22+
private static final Pattern DOCKERFILE_FROM_PATTERN = Pattern.compile( "FROM (.+)" );
23+
private static final Pattern CONTAINER_IMAGE_SHORT_PATTERN = Pattern.compile(
24+
"^(?:.*/)?([^/]+:[^-.]+(?:[-.][^-.]+)?).*$" );
25+
1526
private BuildScanMetadata() {
1627
}
1728

@@ -25,15 +36,104 @@ public static void addMetadataToBuildScan(BuildScanApi buildScanApi, MavenSessio
2536

2637
buildScanApi.tag( "hibernate-search" );
2738

28-
recordExecutableVersion( buildScanApi, mavenSession, "java-version.main.compiler", JavaVersions::forJavacExecutable );
29-
recordExecutableVersion( buildScanApi, mavenSession, "java-version.test.compiler", JavaVersions::forJavacExecutable );
30-
recordExecutableVersion( buildScanApi, mavenSession, "java-version.test.launcher", JavaVersions::forJavaExecutable );
39+
for ( MavenProject project : mavenSession.getProjects() ) {
40+
tagIntegrations( buildScanApi, mavenSession, project );
41+
}
42+
43+
recordExecutableVersion(
44+
buildScanApi, mavenSession, "java-version.main.compiler", JavaVersions::forJavacExecutable );
45+
recordExecutableVersion(
46+
buildScanApi, mavenSession, "java-version.test.compiler", JavaVersions::forJavacExecutable );
47+
recordExecutableVersion(
48+
buildScanApi, mavenSession, "java-version.test.launcher", JavaVersions::forJavaExecutable );
49+
}
50+
51+
private static void tagIntegrations(BuildScanApi buildScanApi, MavenSession mavenSession, MavenProject project) {
52+
var dbKind = getStringProperty( project, "test.database.run.kind" );
53+
if ( !Strings.isBlank( dbKind ) ) {
54+
if ( dbKind.equals( "h2" ) ) {
55+
// H2 doesn't use containers
56+
buildScanApi.tag( "h2" );
57+
}
58+
else {
59+
tagDockerfileShortImageRef( buildScanApi, mavenSession,
60+
"database/%s.Dockerfile".formatted( dbKind ), null
61+
);
62+
}
63+
}
64+
if ( !getBooleanProperty( project, "test.lucene.skip" ) ) {
65+
buildScanApi.tag( "lucene" );
66+
}
67+
if ( !getBooleanProperty( project, "test.elasticsearch.skip" )
68+
&& getBooleanProperty( project, "test.elasticsearch.run.image.pull" ) ) {
69+
var distribution = getStringProperty( mavenSession, "test.elasticsearch.distribution" );
70+
tagDockerfileShortImageRef( buildScanApi, mavenSession,
71+
"search-backend/%s.Dockerfile".formatted( distribution ),
72+
getStringProperty( mavenSession, "test.elasticsearch.version" )
73+
);
74+
}
75+
}
76+
77+
private static void tagDockerfileShortImageRef(BuildScanApi buildScanApi, MavenSession mavenSession,
78+
String dockerfileRelativePath, String versionOverride) {
79+
var path = Path.of( mavenSession.getExecutionRootDirectory(), "build/container", dockerfileRelativePath );
80+
try {
81+
String ref;
82+
try ( var stream = Files.lines( path ) ) {
83+
ref = stream.map( line -> {
84+
var matcher = DOCKERFILE_FROM_PATTERN.matcher( line );
85+
if ( matcher.matches() ) {
86+
return matcher.group( 1 ).trim();
87+
}
88+
else {
89+
return null;
90+
}
91+
} )
92+
.filter( Objects::nonNull )
93+
.findFirst()
94+
.orElseThrow();
95+
}
96+
if ( !Strings.isBlank( versionOverride ) ) {
97+
ref = ref.substring( 0, ref.lastIndexOf( ':' ) + 1 ) + versionOverride;
98+
}
99+
String shortImageRef = toShortImageRef( ref );
100+
buildScanApi.tag( shortImageRef );
101+
buildScanApi.value(
102+
shortImageRef.substring( 0, shortImageRef.lastIndexOf( ':' ) ),
103+
ref.substring( ref.lastIndexOf( ':' ) + 1 )
104+
);
105+
}
106+
catch (RuntimeException | IOException e) {
107+
Log.warn( "Unable to add tag from Dockerfile at %s: %s".formatted( path, e.getMessage() ) );
108+
}
109+
}
110+
111+
static String toShortImageRef(String ref) {
112+
var matcher = CONTAINER_IMAGE_SHORT_PATTERN.matcher( ref );
113+
if ( matcher.matches() ) {
114+
return matcher.group( 1 );
115+
}
116+
else {
117+
return ref;
118+
}
31119
}
32120

33121
private static void recordExecutableVersion(BuildScanApi buildScanApi, MavenSession mavenSession,
34122
String propertyName, Function<String, String> executableToVersion) {
35-
String javaExecutable = (String) mavenSession.getResult().getProject().getProperties().get( propertyName );
123+
String javaExecutable = getStringProperty( mavenSession, propertyName );
36124
String javaVersion = executableToVersion.apply( javaExecutable );
37125
buildScanApi.value( propertyName, "Path: %s\nResolved version: %s".formatted( javaExecutable, javaVersion ) );
38126
}
127+
128+
private static String getStringProperty(MavenSession mavenSession, String key) {
129+
return getStringProperty( mavenSession.getResult().getProject(), key );
130+
}
131+
132+
private static String getStringProperty(MavenProject project, String key) {
133+
return (String) project.getProperties().get( key );
134+
}
135+
136+
private static boolean getBooleanProperty(MavenProject project, String key) {
137+
return Boolean.parseBoolean( getStringProperty( project, key ) );
138+
}
39139
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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.scan;
10+
11+
import static org.junit.jupiter.api.Assertions.assertEquals;
12+
13+
import org.junit.jupiter.params.ParameterizedTest;
14+
import org.junit.jupiter.params.provider.CsvSource;
15+
16+
class BuildScanMetadataTest {
17+
18+
@ParameterizedTest
19+
@CsvSource(textBlock = """
20+
elasticsearch:7.10,docker.io/elastic/elasticsearch:7.10.1
21+
elasticsearch:latest,docker.io/elastic/elasticsearch:latest
22+
elasticsearch:7.10,elasticsearch:7.10.1
23+
elasticsearch:latest,elasticsearch:latest
24+
elasticsearch:7-foo,docker.io/elastic/elasticsearch:7-foo
25+
""")
26+
void toShortImageRef(String expected, String ref) {
27+
assertEquals( expected, BuildScanMetadata.toShortImageRef( ref ) );
28+
}
29+
30+
}

0 commit comments

Comments
 (0)