Skip to content

Commit 2f73df8

Browse files
committed
Unify resolving pre release java versions like RCs and EAs
This reworks how we deal with pre-release java versions for testing. Passing `-Druntime.java=25-pre` will pick the lastest build that could be either an EA or and RC version. Passing explicitly a build number works by running build via `-Druntime.java=25-pre -Druntime.java.build=36` which as of now would pick a RC build. This also tweaks the archive packaging in case of a defined pre release version. This is used downstream when packaging serverless images including ea / rc versions
1 parent fef2c38 commit 2f73df8

File tree

11 files changed

+251
-155
lines changed

11 files changed

+251
-155
lines changed

BUILDING.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -186,23 +186,23 @@ dependencies {
186186

187187
To test an unreleased development version of a third party dependency you have several options.
188188

189-
### How do I test against java early access (ea) versions?
189+
### How do I test against java pre-release versions like early access (ea) or release candidates (rc)?
190190

191191
Currently only openjdk EA builds by oracle are supported.
192192
To test against an early access version java version you can pass the major
193-
java version appended with `-ea` as a system property (e.g. -Druntime.java=26-ea) to the Gradle build:
193+
java version appended with `-pre` as a system property (e.g. -Druntime.java=26-pre) to the Gradle build:
194194

195195
```
196-
./gradlew clean test -Druntime.java=26-ea
196+
./gradlew clean test -Druntime.java=26-pre
197197
```
198198

199-
This will run the tests using the JDK 26 EA version and pick the latest available build of the matching JDK EA version we expose
200-
in our custom jdk catalogue at `https://storage.googleapis.com/elasticsearch-jdk-archive/jdks/openjdk/latest.json`.
199+
This will run the tests using the JDK 26 pre-release version and pick the latest available build of the matching JDK EA version we expose
200+
in our custom jdk catalogue at `https://builds.es-jdk-archive.com/jdks/openjdk/recent.json`.
201201

202202
To run against a specific build number of the EA build you can pass a second system property (e.g. `-Druntime.java.build=6`):
203203

204204
```
205-
./gradlew clean test -Druntime.java=26-ea -Druntime.java.build=6
205+
./gradlew clean test -Druntime.java=26-pre -Druntime.java.build=6
206206
```
207207

208208
#### How to use a Maven based third party dependency via `mavenlocal`?

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/Jdk.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class Jdk implements Buildable, Iterable<File> {
3232
"(\\d+)(\\.\\d+\\.\\d+(?:\\.\\d+)?)?\\+(\\d+(?:\\.\\d+)?)(@([a-f0-9]{32}))?"
3333
);
3434
private static final Pattern LEGACY_VERSION_PATTERN = Pattern.compile("(\\d)(u\\d+)\\+(b\\d+?)(@([a-f0-9]{32}))?");
35-
private static final Pattern EA_VERSION_PATTERN = Pattern.compile("(\\d+)-ea\\+(\\d+)(@([a-f0-9]{32}))?");
35+
private static final Pattern EA_VERSION_PATTERN = Pattern.compile("(\\d+)-(?:ea|rc)\\+(\\d+)(@([a-f0-9]{32}))?");
3636

3737
private final String name;
3838
private final FileCollection configuration;

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/JdkDownloadPlugin.java

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -114,33 +114,40 @@ private void setupRepository(Project project, Jdk jdk) {
114114
+ jdk.getBuild()
115115
+ "/[module]/[classifier]/jdk/hotspot/normal/adoptium";
116116
}
117-
} else if (jdk.getVendor().equals(VENDOR_OPENJDK) && "ea".equals(jdk.getDistributionVersion())) {
118-
repoUrl = "https://builds.es-jdk-archive.com/";
119-
// current pattern since 12.0.1
120-
artifactPattern = "jdks/openjdk/"
121-
+ jdk.getMajor()
122-
+ "/openjdk-"
123-
+ jdk.getBaseVersion()
124-
+ "/"
125-
+ "openjdk-[revision]_[module]-[classifier]_bin.[ext]";
126117
} else if (jdk.getVendor().equals(VENDOR_OPENJDK)) {
127-
repoUrl = "https://download.oracle.com";
128-
if (jdk.getHash() != null) {
118+
if ("ea".equals(jdk.getDistributionVersion())) {
119+
repoUrl = "https://builds.es-jdk-archive.com/";
129120
// current pattern since 12.0.1
130-
artifactPattern = "java/GA/jdk"
131-
+ jdk.getBaseVersion()
132-
+ "/"
133-
+ jdk.getHash()
134-
+ "/"
135-
+ jdk.getBuild()
136-
+ "/GPL/openjdk-[revision]_[module]-[classifier]_bin.[ext]";
137-
} else {
138-
// simpler legacy pattern from JDK 9 to JDK 12 that we are advocating to Oracle to bring back
139-
artifactPattern = "java/GA/jdk"
121+
artifactPattern = "jdks/openjdk/"
140122
+ jdk.getMajor()
141-
+ "/"
142-
+ jdk.getBuild()
143-
+ "/GPL/openjdk-[revision]_[module]-[classifier]_bin.[ext]";
123+
+ "/openjdk-[revision]/openjdk-[revision]_[module]-[classifier]_bin.[ext]";
124+
} else if ("rc".equals(jdk.getDistributionVersion())) {
125+
repoUrl = "https://builds.es-jdk-archive.com/";
126+
// current pattern since 12.0.1
127+
artifactPattern = "jdks/openjdk/"
128+
+ jdk.getMajor()
129+
+ "/openjdk-[revision]/openjdk-"
130+
+ jdk.getMajor()
131+
+ "_[module]-[classifier]_bin.[ext]";
132+
} else {
133+
repoUrl = "https://download.oracle.com";
134+
if (jdk.getHash() != null) {
135+
// current pattern since 12.0.1
136+
artifactPattern = "java/GA/jdk"
137+
+ jdk.getBaseVersion()
138+
+ "/"
139+
+ jdk.getHash()
140+
+ "/"
141+
+ jdk.getBuild()
142+
+ "/GPL/openjdk-[revision]_[module]-[classifier]_bin.[ext]";
143+
} else {
144+
// simpler legacy pattern from JDK 9 to JDK 12 that we are advocating to Oracle to bring back
145+
artifactPattern = "java/GA/jdk"
146+
+ jdk.getMajor()
147+
+ "/"
148+
+ jdk.getBuild()
149+
+ "/GPL/openjdk-[revision]_[module]-[classifier]_bin.[ext]";
150+
}
144151
}
145152
} else if (jdk.getVendor().equals(VENDOR_ZULU)) {
146153
repoUrl = "https://cdn.azul.com";

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/BuildParameterExtension.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public interface BuildParameterExtension {
3232

3333
Boolean getIsRuntimeJavaHomeSet();
3434

35-
Boolean getIsEarlyAccessRuntimeJavaVersion();
35+
RuntimeJava getRuntimeJava();
3636

3737
List<JavaHome> getJavaVersions();
3838

@@ -46,8 +46,6 @@ public interface BuildParameterExtension {
4646

4747
Provider<? extends Action<JavaToolchainSpec>> getJavaToolChainSpec();
4848

49-
Provider<String> getRuntimeJavaDetails();
50-
5149
Provider<String> getGitRevision();
5250

5351
Provider<String> getGitOrigin();

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/DefaultBuildParameterExtension.java

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@
2828
public abstract class DefaultBuildParameterExtension implements BuildParameterExtension {
2929
private final Provider<Boolean> inFipsJvm;
3030
private final Provider<File> runtimeJavaHome;
31-
private final Boolean isRuntimeJavaHomeSet;
32-
private final Boolean earlyAccessJavaRuntime;
31+
private final RuntimeJava runtimeJava;
3332
private final List<JavaHome> javaVersions;
3433
private final JavaVersion minimumCompilerVersion;
3534
private final JavaVersion minimumRuntimeVersion;
@@ -51,12 +50,8 @@ public abstract class DefaultBuildParameterExtension implements BuildParameterEx
5150

5251
public DefaultBuildParameterExtension(
5352
ProviderFactory providers,
54-
Provider<File> runtimeJavaHome,
53+
RuntimeJava runtimeJava,
5554
Provider<? extends Action<JavaToolchainSpec>> javaToolChainSpec,
56-
Provider<JavaVersion> runtimeJavaVersion,
57-
boolean isRuntimeJavaHomeSet,
58-
boolean earlyAccessJavaRuntime,
59-
Provider<String> runtimeJavaDetails,
6055
List<JavaHome> javaVersions,
6156
JavaVersion minimumCompilerVersion,
6257
JavaVersion minimumRuntimeVersion,
@@ -70,12 +65,12 @@ public DefaultBuildParameterExtension(
7065
Provider<BwcVersions> bwcVersions
7166
) {
7267
this.inFipsJvm = providers.systemProperty("tests.fips.enabled").map(DefaultBuildParameterExtension::parseBoolean);
73-
this.runtimeJavaHome = cache(providers, runtimeJavaHome);
68+
this.runtimeJava = runtimeJava;
69+
this.runtimeJavaHome = cache(providers, runtimeJava.getJavahome());
7470
this.javaToolChainSpec = cache(providers, javaToolChainSpec);
75-
this.runtimeJavaVersion = cache(providers, runtimeJavaVersion);
76-
this.isRuntimeJavaHomeSet = isRuntimeJavaHomeSet;
77-
this.earlyAccessJavaRuntime = earlyAccessJavaRuntime;
78-
this.runtimeJavaDetails = cache(providers, runtimeJavaDetails);
71+
this.runtimeJavaVersion = cache(providers, runtimeJava.getJavaVersion());
72+
// this.runtimeJavaVersion = runtimeJava.getJavaVersion();
73+
this.runtimeJavaDetails = cache(providers, runtimeJava.getVendorDetails());
7974
this.javaVersions = javaVersions;
8075
this.minimumCompilerVersion = minimumCompilerVersion;
8176
this.minimumRuntimeVersion = minimumRuntimeVersion;
@@ -119,15 +114,14 @@ public void withFipsEnabledOnly(Task task) {
119114

120115
@Override
121116
public Boolean getIsRuntimeJavaHomeSet() {
122-
return isRuntimeJavaHomeSet;
117+
return runtimeJava.isExplicitlySet();
123118
}
124119

125120
@Override
126-
public Boolean getIsEarlyAccessRuntimeJavaVersion() {
127-
return earlyAccessJavaRuntime;
121+
public RuntimeJava getRuntimeJava() {
122+
return runtimeJava;
128123
}
129124

130-
131125
@Override
132126
public List<JavaHome> getJavaVersions() {
133127
return javaVersions;
@@ -158,11 +152,6 @@ public Provider<? extends Action<JavaToolchainSpec>> getJavaToolChainSpec() {
158152
return javaToolChainSpec;
159153
}
160154

161-
@Override
162-
public Provider<String> getRuntimeJavaDetails() {
163-
return runtimeJavaDetails;
164-
}
165-
166155
@Override
167156
public Provider<String> getGitRevision() {
168157
return gitRevision;

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/GlobalBuildInfoPlugin.java

Lines changed: 52 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import org.gradle.jvm.toolchain.JvmVendorSpec;
4848
import org.gradle.jvm.toolchain.internal.InstallationLocation;
4949
import org.gradle.util.GradleVersion;
50-
import org.jetbrains.annotations.NotNull;
5150

5251
import java.io.BufferedReader;
5352
import java.io.File;
@@ -68,7 +67,8 @@
6867
import javax.inject.Inject;
6968

7069
import static org.elasticsearch.gradle.internal.conventions.GUtils.elvis;
71-
import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findLatestEABuildNumber;
70+
import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findLatestPreReleaseBuild;
71+
import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findPreReleaseBuild;
7272

7373
public class GlobalBuildInfoPlugin implements Plugin<Project> {
7474
private static final Logger LOGGER = Logging.getLogger(GlobalBuildInfoPlugin.class);
@@ -116,37 +116,20 @@ public void apply(Project project) {
116116
JavaVersion minimumCompilerVersion = JavaVersion.toVersion(getResourceContents("/minimumCompilerVersion"));
117117
JavaVersion minimumRuntimeVersion = JavaVersion.toVersion(getResourceContents("/minimumRuntimeVersion"));
118118

119-
RuntimeJavaHome runtimeJavaHome = findRuntimeJavaHome();
120-
121-
Provider<JvmInstallationMetadata> runtimeJdkMetaData = runtimeJavaHome.getJavahome().map(
122-
j -> metadataDetector.getMetadata(getJavaInstallation(j))
123-
);
119+
RuntimeJava runtimeJavaHome = findRuntimeJavaHome();
124120
AtomicReference<BwcVersions> cache = new AtomicReference<>();
125121
Provider<BwcVersions> bwcVersionsProvider = providers.provider(
126122
() -> cache.updateAndGet(val -> val == null ? resolveBwcVersions() : val)
127123
);
128124

129-
130125
BuildParameterExtension buildParams = project.getExtensions()
131126
.create(
132127
BuildParameterExtension.class,
133128
BuildParameterExtension.EXTENSION_NAME,
134129
DefaultBuildParameterExtension.class,
135130
providers,
136-
runtimeJavaHome.getJavahome(),
131+
runtimeJavaHome,
137132
resolveToolchainSpecFromEnv(),
138-
runtimeJavaHome.javahome.map(
139-
javaHome -> determineJavaVersion(
140-
"runtime java.home",
141-
javaHome,
142-
runtimeJavaHome.javahome.isPresent()
143-
? minimumRuntimeVersion
144-
: JavaVersion.toVersion(VersionProperties.getBundledJdkMajorVersion())
145-
)
146-
),
147-
runtimeJavaHome.expclicitlySet,
148-
runtimeJavaHome.earlyAccess,
149-
runtimeJdkMetaData.map(m -> formatJavaVendorDetails(m)),
150133
getAvailableJavaVersions(),
151134
minimumCompilerVersion,
152135
minimumRuntimeVersion,
@@ -236,7 +219,7 @@ private void logGlobalBuildInfo(BuildParameterExtension buildParams) {
236219
LOGGER.quiet("Elasticsearch Build Hamster says Hello!");
237220
LOGGER.quiet(" Gradle Version : " + GradleVersion.current().getVersion());
238221
LOGGER.quiet(" OS Info : " + osName + " " + osVersion + " (" + osArch + ")");
239-
if (buildParams.getIsRuntimeJavaHomeSet()) {
222+
if (buildParams.getRuntimeJava().isExplicitlySet()) {
240223
JvmInstallationMetadata runtimeJvm = metadataDetector.getMetadata(getJavaInstallation(buildParams.getRuntimeJavaHome().get()));
241224
final String runtimeJvmVendorDetails = runtimeJvm.getVendor().getDisplayName();
242225
final String runtimeJvmImplementationVersion = runtimeJvm.getJvmVersion();
@@ -343,53 +326,74 @@ private static void assertMinimumCompilerVersion(JavaVersion minimumCompilerVers
343326
}
344327
}
345328

346-
private RuntimeJavaHome findRuntimeJavaHome() {
329+
private RuntimeJava findRuntimeJavaHome() {
347330
String runtimeJavaProperty = System.getProperty("runtime.java");
348-
349331
if (runtimeJavaProperty != null) {
350-
if (runtimeJavaProperty.toLowerCase().endsWith("-ea")) {
351-
// handle EA builds differently due to lack of support in Gradle toolchain service
332+
if (runtimeJavaProperty.toLowerCase().endsWith("-pre")) {
333+
// handle pre-release builds differently due to lack of support in Gradle toolchain service
352334
// we resolve them using JdkDownloadPlugin for now.
353-
Integer major = Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 3));
354-
return new RuntimeJavaHome(resolveEarlyAccessJavaHome(major), true, true);
335+
return resolvePreReleaseRuntimeJavaHome(runtimeJavaProperty);
355336
} else {
356-
return new RuntimeJavaHome(resolveJavaHomeFromToolChainService(runtimeJavaProperty), true, false);
337+
return runtimeJavaHome(resolveJavaHomeFromToolChainService(runtimeJavaProperty), true);
357338
}
358339
}
359340
if (System.getenv("RUNTIME_JAVA_HOME") != null) {
360-
return new RuntimeJavaHome(providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))), true, false);
341+
return runtimeJavaHome(providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))), true);
361342
}
362343
// fall back to tool chain if set.
363344
String env = System.getenv("JAVA_TOOLCHAIN_HOME");
364345
boolean explicitlySet = env != null;
365-
Provider<File> javaHome = explicitlySet ?
366-
providers.provider(() -> new File(env)) :
367-
resolveJavaHomeFromToolChainService(VersionProperties.getBundledJdkMajorVersion());
368-
return
369-
new RuntimeJavaHome(
346+
Provider<File> javaHome = explicitlySet
347+
? providers.provider(() -> new File(env))
348+
: resolveJavaHomeFromToolChainService(VersionProperties.getBundledJdkMajorVersion());
349+
return runtimeJavaHome(javaHome, explicitlySet);
350+
}
351+
352+
private RuntimeJava runtimeJavaHome(Provider<File> fileProvider, boolean explicitlySet) {
353+
return runtimeJavaHome(fileProvider, explicitlySet, null);
354+
}
355+
356+
private RuntimeJava runtimeJavaHome(Provider<File> fileProvider, boolean explicitlySet, String preReleasePostfix) {
357+
Provider<JavaVersion> javaVersion = fileProvider.map(
358+
javaHome -> determineJavaVersion(
359+
"runtime java.home",
370360
javaHome,
371-
explicitlySet,
372-
false);
361+
fileProvider.isPresent()
362+
? JavaVersion.toVersion(getResourceContents("/minimumRuntimeVersion"))
363+
: JavaVersion.toVersion(VersionProperties.getBundledJdkMajorVersion())
364+
)
365+
);
366+
367+
Provider<String> vendorDetails = fileProvider.map(j -> metadataDetector.getMetadata(getJavaInstallation(j)))
368+
.map(m -> formatJavaVendorDetails(m));
369+
370+
return new RuntimeJava(fileProvider, javaVersion, vendorDetails, explicitlySet, preReleasePostfix);
373371
}
374372

375-
private Provider<File> resolveEarlyAccessJavaHome(Integer runtimeJavaProperty) {
376-
NamedDomainObjectContainer<Jdk> container = (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName("jdks");
373+
private RuntimeJava resolvePreReleaseRuntimeJavaHome(String runtimeJavaProperty) {
374+
var major = JavaLanguageVersion.of(Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 4)));
377375
Integer buildNumber = Integer.getInteger("runtime.java.build");
378-
if (buildNumber == null) {
379-
buildNumber = findLatestEABuildNumber(runtimeJavaProperty);
380-
}
381-
String eaVersionString = String.format("%d-ea+%d", runtimeJavaProperty, buildNumber);
382-
Jdk jdk = container.create("ea_jdk_" + runtimeJavaProperty, j -> {
383-
j.setVersion(eaVersionString);
376+
var jdkbuild = buildNumber == null ? findLatestPreReleaseBuild(major) : findPreReleaseBuild(major, buildNumber);
377+
String prVersionString = String.format("%d-%s+%d", major.asInt(), jdkbuild.type(), jdkbuild.buildNumber());
378+
return resolveJavaHomeFromJdkDownloadPlugin(jdkbuild.type(), major, prVersionString);
379+
380+
}
381+
382+
private RuntimeJava resolveJavaHomeFromJdkDownloadPlugin(String preReleaseType, JavaLanguageVersion major, String prVersionString) {
383+
NamedDomainObjectContainer<Jdk> container = (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName("jdks");
384+
Jdk jdk = container.create(preReleaseType + "_" + major.asInt(), j -> {
385+
j.setVersion(prVersionString);
384386
j.setVendor("openjdk");
385387
j.setPlatform(OS.current().javaOsReference);
386388
j.setArchitecture(Architecture.current().javaClassifier);
387-
j.setDistributionVersion("ea");
389+
j.setDistributionVersion(preReleaseType);
388390
});
389-
return providers.provider(() -> new File(jdk.getJavaHomePath().toString()));
391+
// We on purpose resolve this here eagerly to ensure we resolve the jdk configuration in the context of the root project.
392+
// If we keep this lazy we can not guarantee in which project context this is resolved which will fail the build.
393+
File file = new File(jdk.getJavaHomePath().toString());
394+
return runtimeJavaHome(providers.provider(() -> file), true, preReleaseType);
390395
}
391396

392-
@NotNull
393397
private Provider<File> resolveJavaHomeFromToolChainService(String version) {
394398
Property<JavaLanguageVersion> value = objectFactory.property(JavaLanguageVersion.class).value(JavaLanguageVersion.of(version));
395399
return toolChainService.launcherFor(javaToolchainSpec -> javaToolchainSpec.getLanguageVersion().value(value))
@@ -447,24 +451,4 @@ public void execute(JavaToolchainSpec spec) {
447451
}
448452
}
449453

450-
private static class RuntimeJavaHome {
451-
452-
private final boolean earlyAccess;
453-
private final Provider<File> javahome;
454-
private final boolean expclicitlySet;
455-
456-
// RuntimeJavaHome(Provider<File> javahome) {
457-
// this(javahome, false);
458-
// }
459-
//
460-
RuntimeJavaHome(Provider<File> javahome, boolean explicitlySet, boolean earlyAccess) {
461-
this.javahome = javahome;
462-
this.expclicitlySet = explicitlySet;
463-
this.earlyAccess = earlyAccess;
464-
}
465-
466-
public Provider<File> getJavahome() {
467-
return javahome;
468-
}
469-
}
470454
}

0 commit comments

Comments
 (0)