Skip to content

Commit edb0616

Browse files
authored
Merge pull request quarkusio#36267 from zakkak/2023-10-03-improve-version-parsing
Work around missing GraalVM internal version starting with JDK 22
2 parents b9b923c + fe25fa5 commit edb0616

File tree

3 files changed

+88
-31
lines changed

3 files changed

+88
-31
lines changed

core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/GraalVM.java

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.Arrays;
44
import java.util.List;
5+
import java.util.Map;
56
import java.util.regex.Matcher;
67
import java.util.regex.Pattern;
78
import java.util.stream.Collectors;
@@ -62,10 +63,16 @@ static Version parse(List<String> lines) {
6263
String vendorVersion = secondMatcher.group(VENDOR_VERSION_GROUP);
6364

6465
String buildInfo = secondMatcher.group(BUILD_INFO_GROUP);
65-
String graalVersion = graalVersion(buildInfo);
66+
String graalVersion = graalVersion(buildInfo, v.feature());
67+
if (vendorVersion.contains("-dev")) {
68+
graalVersion = graalVersion + "-dev";
69+
}
6670
String mandrelVersion = mandrelVersion(vendorVersion);
67-
Distribution dist = isMandrel(vendorVersion) ? Distribution.MANDREL : Distribution.ORACLE;
71+
Distribution dist = isMandrel(vendorVersion) ? Distribution.MANDREL : Distribution.GRAALVM;
6872
String versNum = (dist == Distribution.MANDREL ? mandrelVersion : graalVersion);
73+
if (versNum == null) {
74+
return UNKNOWN_VERSION;
75+
}
6976
return new Version(lines.stream().collect(Collectors.joining("\n")),
7077
versNum, v.feature(), v.update(), dist);
7178
} else {
@@ -100,7 +107,7 @@ private static String matchVersion(String version) {
100107
return null;
101108
}
102109

103-
private static String graalVersion(String buildInfo) {
110+
private static String graalVersion(String buildInfo, int jdkFeature) {
104111
if (buildInfo == null) {
105112
return null;
106113
}
@@ -109,10 +116,23 @@ private static String graalVersion(String buildInfo) {
109116
return null;
110117
}
111118
String version = buildInfo.substring(idx + JVMCI_BUILD_PREFIX.length());
112-
return matchVersion(version);
119+
Matcher versMatcher = VERSION_PATTERN.matcher(version);
120+
if (versMatcher.find()) {
121+
return matchVersion(version);
122+
} else {
123+
return GRAAL_MAPPING.get(jdkFeature);
124+
}
113125
}
114126
}
115127

128+
// Temporarily work around https://github.com/quarkusio/quarkus/issues/36246,
129+
// till we have a consensus on how to move forward in
130+
// https://github.com/quarkusio/quarkus/issues/34161
131+
private static final Map<Integer, String> GRAAL_MAPPING = Map.of(22, "24.0",
132+
23, "24.1",
133+
24, "25.0",
134+
25, "25.1");
135+
116136
public static final class Version implements Comparable<Version> {
117137

118138
/**
@@ -127,12 +147,12 @@ public static final class Version implements Comparable<Version> {
127147
"(GraalVM|native-image)( Version)? " + VersionParseHelper.VERS_FORMAT + "(?<distro>.*?)?" +
128148
"(\\(Java Version (?<jfeature>[0-9]+)(\\.(?<jinterim>[0-9]*)\\.(?<jupdate>[0-9]*))?.*)?$");
129149

130-
static final Version VERSION_21_3 = new Version("GraalVM 21.3", "21.3", Distribution.ORACLE);
131-
static final Version VERSION_21_3_0 = new Version("GraalVM 21.3.0", "21.3.0", Distribution.ORACLE);
132-
public static final Version VERSION_22_3_0 = new Version("GraalVM 22.3.0", "22.3.0", Distribution.ORACLE);
133-
public static final Version VERSION_22_2_0 = new Version("GraalVM 22.2.0", "22.2.0", Distribution.ORACLE);
134-
public static final Version VERSION_23_0_0 = new Version("GraalVM 23.0.0", "23.0.0", Distribution.ORACLE);
135-
public static final Version VERSION_23_1_0 = new Version("GraalVM 23.1.0", "23.1.0", Distribution.ORACLE);
150+
static final Version VERSION_21_3 = new Version("GraalVM 21.3", "21.3", Distribution.GRAALVM);
151+
static final Version VERSION_21_3_0 = new Version("GraalVM 21.3.0", "21.3.0", Distribution.GRAALVM);
152+
public static final Version VERSION_22_3_0 = new Version("GraalVM 22.3.0", "22.3.0", Distribution.GRAALVM);
153+
public static final Version VERSION_22_2_0 = new Version("GraalVM 22.2.0", "22.2.0", Distribution.GRAALVM);
154+
public static final Version VERSION_23_0_0 = new Version("GraalVM 23.0.0", "23.0.0", Distribution.GRAALVM);
155+
public static final Version VERSION_23_1_0 = new Version("GraalVM 23.1.0", "23.1.0", Distribution.GRAALVM);
136156

137157
public static final Version MINIMUM = VERSION_22_2_0;
138158
public static final Version CURRENT = VERSION_23_0_0;
@@ -226,7 +246,10 @@ public static Version of(Stream<String> output) {
226246

227247
if (lines.size() == 3) {
228248
// Attempt to parse the new 3-line version scheme first.
229-
return VersionParseHelper.parse(lines);
249+
Version parsedVersion = VersionParseHelper.parse(lines);
250+
if (parsedVersion != VersionParseHelper.UNKNOWN_VERSION) {
251+
return parsedVersion;
252+
}
230253
} else if (lines.size() == 1) {
231254
// Old, single line version parsing logic
232255
final String line = lines.get(0);
@@ -249,7 +272,7 @@ public static Version of(Stream<String> output) {
249272
version,
250273
jFeature,
251274
jUpdate,
252-
isMandrel(distro) ? Distribution.MANDREL : Distribution.ORACLE);
275+
isMandrel(distro) ? Distribution.MANDREL : Distribution.GRAALVM);
253276
}
254277
}
255278

@@ -290,7 +313,7 @@ public boolean isJava17() {
290313
}
291314

292315
enum Distribution {
293-
ORACLE,
316+
GRAALVM,
294317
MANDREL;
295318
}
296319
}

core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildStep.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,9 +459,10 @@ private RuntimeException imageGenerationFailed(int exitValue, boolean isContaine
459459
}
460460

461461
private void checkGraalVMVersion(GraalVM.Version version) {
462-
log.info("Running Quarkus native-image plugin on " + version.getFullVersion());
462+
log.info("Running Quarkus native-image plugin on " + version.distribution.name() + " " + version.getVersionAsString()
463+
+ " JDK " + version.javaFeatureVersion + "." + version.javaUpdateVersion);
463464
if (version.isObsolete()) {
464-
throw new IllegalStateException("Out of date version of GraalVM detected: " + version.getFullVersion() + "."
465+
throw new IllegalStateException("Out of date version of GraalVM detected: " + version.getVersionAsString() + "."
465466
+ " Quarkus currently supports " + GraalVM.Version.CURRENT.getVersionAsString()
466467
+ ". Please upgrade GraalVM to this version.");
467468
}

core/deployment/src/test/java/io/quarkus/deployment/pkg/steps/GraalVMTest.java

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.quarkus.deployment.pkg.steps;
22

3+
import static io.quarkus.deployment.pkg.steps.GraalVM.Distribution.GRAALVM;
34
import static io.quarkus.deployment.pkg.steps.GraalVM.Distribution.MANDREL;
4-
import static io.quarkus.deployment.pkg.steps.GraalVM.Distribution.ORACLE;
55
import static org.assertj.core.api.Assertions.assertThat;
66

77
import java.util.stream.Stream;
@@ -19,20 +19,20 @@ public class GraalVMTest {
1919
@Test
2020
public void testGraalVMVersionDetected() {
2121
// Version detection after: https://github.com/oracle/graal/pull/6302 (3 lines of version output)
22-
assertVersion(new Version("GraalVM 23.0.0", "23.0.0", ORACLE), MANDREL,
22+
assertVersion(new Version("GraalVM 23.0.0", "23.0.0", GRAALVM), MANDREL,
2323
Version.of(Stream.of(("native-image 17.0.6 2023-01-17\n"
2424
+ "OpenJDK Runtime Environment Mandrel-23.0.0-dev (build 17.0.6+10)\n"
2525
+ "OpenJDK 64-Bit Server VM Mandrel-23.0.0-dev (build 17.0.6+10, mixed mode)").split("\\n"))));
26-
assertVersion(new Version("GraalVM 23.0.0", "23.0.0", ORACLE), MANDREL,
26+
assertVersion(new Version("GraalVM 23.0.0", "23.0.0", GRAALVM), MANDREL,
2727
Version.of(Stream.of(("native-image 17.0.6 2023-01-17\n"
2828
+ "GraalVM Runtime Environment Mandrel-23.0.0-dev (build 17.0.6+10)\n"
2929
+ "Substrate VM Mandrel-23.0.0-dev (build 17.0.6+10, serial gc)").split("\\n"))));
30-
assertVersion(new Version("GraalVM 23.0.0", "23.0.0", ORACLE), MANDREL,
30+
assertVersion(new Version("GraalVM 23.0.0", "23.0.0", GRAALVM), MANDREL,
3131
Version.of(Stream.of(("native-image 17.0.7 2023-04-18\n"
3232
+ "OpenJDK Runtime Environment Mandrel-23.0.0.0-Final (build 17.0.7+7)\n"
3333
+ "OpenJDK 64-Bit Server VM Mandrel-23.0.0.0-Final (build 17.0.7+7, mixed mode)").split("\\n"))));
3434
// should also work when the image is not around and we have to download it
35-
assertVersion(new Version("GraalVM 23.0.0", "23.0.0", ORACLE), MANDREL,
35+
assertVersion(new Version("GraalVM 23.0.0", "23.0.0", GRAALVM), MANDREL,
3636
Version.of(
3737
Stream.of(("Unable to find image 'quay.io/quarkus/ubi-quarkus-mandrel-builder-image:jdk-17' locally\n"
3838
+ "jdk-17: Pulling from quarkus/ubi-quarkus-mandrel-builder-image\n"
@@ -57,31 +57,31 @@ public void testGraalVMVersionDetected() {
5757
+ "OpenJDK Runtime Environment Mandrel-23.0.0.0-Final (build 17.0.7+7)\n"
5858
+ "OpenJDK 64-Bit Server VM Mandrel-23.0.0.0-Final (build 17.0.7+7, mixed mode)")
5959
.split("\\n"))));
60-
assertVersion(new Version("GraalVM 23.0", "23.0", ORACLE), ORACLE,
60+
assertVersion(new Version("GraalVM 23.0", "23.0", GRAALVM), GRAALVM,
6161
Version.of(Stream.of(("native-image 20 2023-03-21\n"
6262
+ "GraalVM Runtime Environment GraalVM CE (build 20+34-jvmci-23.0-b10)\n"
6363
+ "Substrate VM GraalVM CE (build 20+34, serial gc)").split("\\n"))));
6464

6565
// Older version parsing
66-
assertVersion(new Version("GraalVM 20.1", "20.1", ORACLE), ORACLE,
66+
assertVersion(new Version("GraalVM 20.1", "20.1", GRAALVM), GRAALVM,
6767
Version.of(Stream.of("GraalVM Version 20.1.0 (Java Version 11.0.7)")));
68-
assertVersion(new Version("GraalVM 20.1.0.1", "20.1.0.1", ORACLE), MANDREL, Version
68+
assertVersion(new Version("GraalVM 20.1.0.1", "20.1.0.1", GRAALVM), MANDREL, Version
6969
.of(Stream.of("GraalVM Version 20.1.0.1.Alpha2 56d4ee1b28 (Mandrel Distribution) (Java Version 11.0.8)")));
70-
assertVersion(new Version("GraalVM 20.1.0.1", "20.1.0.1", ORACLE), MANDREL, Version
70+
assertVersion(new Version("GraalVM 20.1.0.1", "20.1.0.1", GRAALVM), MANDREL, Version
7171
.of(Stream.of("GraalVM Version 20.1.0.1-Final 56d4ee1b28 (Mandrel Distribution) (Java Version 11.0.8)")));
72-
assertVersion(new Version("GraalVM 21.0", "21.0", ORACLE), MANDREL, Version
72+
assertVersion(new Version("GraalVM 21.0", "21.0", GRAALVM), MANDREL, Version
7373
.of(Stream.of("GraalVM Version 21.0.0.0-0b3 (Mandrel Distribution) (Java Version 11.0.8)")));
74-
assertVersion(new Version("GraalVM 20.3.1.2", "20.3.1.2", ORACLE), MANDREL, Version
74+
assertVersion(new Version("GraalVM 20.3.1.2", "20.3.1.2", GRAALVM), MANDREL, Version
7575
.of(Stream.of("GraalVM Version 20.3.1.2-dev (Mandrel Distribution) (Java Version 11.0.8)")));
76-
assertVersion(new Version("GraalVM 21.1", "21.1", ORACLE), MANDREL, Version
76+
assertVersion(new Version("GraalVM 21.1", "21.1", GRAALVM), MANDREL, Version
7777
.of(Stream.of("native-image 21.1.0.0-Final (Mandrel Distribution) (Java Version 11.0.11+9)")));
78-
assertVersion(new Version("GraalVM 21.1", "21.1", ORACLE), MANDREL, Version
78+
assertVersion(new Version("GraalVM 21.1", "21.1", GRAALVM), MANDREL, Version
7979
.of(Stream.of("GraalVM 21.1.0.0-Final (Mandrel Distribution) (Java Version 11.0.11+9)")));
80-
assertVersion(new Version("GraalVM 21.1", "21.1", ORACLE), ORACLE, Version
80+
assertVersion(new Version("GraalVM 21.1", "21.1", GRAALVM), GRAALVM, Version
8181
.of(Stream.of("GraalVM 21.1.0 Java 11 CE (Java Version 11.0.11+5-jvmci-21.1-b02)")));
82-
assertVersion(new Version("GraalVM 21.1", "21.1", ORACLE), ORACLE, Version
82+
assertVersion(new Version("GraalVM 21.1", "21.1", GRAALVM), GRAALVM, Version
8383
.of(Stream.of("native-image 21.1.0.0 Java 11 CE (Java Version 11.0.11+5-jvmci-21.1-b02)")));
84-
assertVersion(new Version("GraalVM 21.2", "21.2", ORACLE), MANDREL, Version
84+
assertVersion(new Version("GraalVM 21.2", "21.2", GRAALVM), MANDREL, Version
8585
.of(Stream.of("native-image 21.2.0.0-Final Mandrel Distribution (Java Version 11.0.12+7)")));
8686
}
8787

@@ -93,6 +93,39 @@ static void assertVersion(Version graalVmVersion, Distribution distro, Version v
9393
}
9494
}
9595

96+
@Test
97+
public void testGraalVM21VersionParser() {
98+
Version graalVM21Dev = Version.of(Stream.of(("native-image 21 2023-09-19\n"
99+
+ "GraalVM Runtime Environment GraalVM CE 21+35.1 (build 21+35-jvmci-23.1-b15)\n"
100+
+ "Substrate VM GraalVM CE 21+35.1 (build 21+35, serial gc)").split("\\n")));
101+
assertThat(graalVM21Dev.distribution.name()).isEqualTo("GRAALVM");
102+
assertThat(graalVM21Dev.getVersionAsString()).isEqualTo("23.1");
103+
assertThat(graalVM21Dev.javaFeatureVersion).isEqualTo(21);
104+
assertThat(graalVM21Dev.javaUpdateVersion).isEqualTo(0);
105+
}
106+
107+
@Test
108+
public void testGraalVM21DevVersionParser() {
109+
Version graalVM21Dev = Version.of(Stream.of(("native-image 21 2023-09-19\n" +
110+
"GraalVM Runtime Environment GraalVM CE 21-dev+35.1 (build 21+35-jvmci-23.1-b14)\n" +
111+
"Substrate VM GraalVM CE 21-dev+35.1 (build 21+35, serial gc)").split("\\n")));
112+
assertThat(graalVM21Dev.distribution.name()).isEqualTo("GRAALVM");
113+
assertThat(graalVM21Dev.getVersionAsString()).isEqualTo("23.1-dev");
114+
assertThat(graalVM21Dev.javaFeatureVersion).isEqualTo(21);
115+
assertThat(graalVM21Dev.javaUpdateVersion).isEqualTo(0);
116+
}
117+
118+
@Test
119+
public void testGraalVM22DevVersionParser() {
120+
Version graalVM22Dev = Version.of(Stream.of(("native-image 22 2024-03-19\n"
121+
+ "GraalVM Runtime Environment GraalVM CE 22-dev+16.1 (build 22+16-jvmci-b01)\n"
122+
+ "Substrate VM GraalVM CE 22-dev+16.1 (build 22+16, serial gc)").split("\\n")));
123+
assertThat(graalVM22Dev.distribution.name()).isEqualTo("GRAALVM");
124+
assertThat(graalVM22Dev.getVersionAsString()).isEqualTo("24.0-dev");
125+
assertThat(graalVM22Dev.javaFeatureVersion).isEqualTo(22);
126+
assertThat(graalVM22Dev.javaUpdateVersion).isEqualTo(0);
127+
}
128+
96129
@Test
97130
public void testGraalVMVersionsOlderThan() {
98131
assertOlderThan("GraalVM Version 19.3.6 CE", "GraalVM Version 20.2.0 (Java Version 11.0.9)");

0 commit comments

Comments
 (0)