Skip to content

Commit 3d8363c

Browse files
committed
[Gradle] Unify resolving pre release java versions like RCs and EAs (#133708)
* Update distro packaging when testing java ea versions * 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 * Bring back getJavaDetails used when configuring fips * Adopt ReproduceInfoPrinter (cherry picked from commit 5e71f1a)
1 parent 47e5f95 commit 3d8363c

File tree

12 files changed

+318
-152
lines changed

12 files changed

+318
-152
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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public interface BuildParameterExtension {
3232

3333
Boolean getIsRuntimeJavaHomeSet();
3434

35+
RuntimeJava getRuntimeJava();
36+
3537
List<JavaHome> getJavaVersions();
3638

3739
JavaVersion getMinimumCompilerVersion();

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +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;
31+
private final RuntimeJava runtimeJava;
3232
private final List<JavaHome> javaVersions;
3333
private final JavaVersion minimumCompilerVersion;
3434
private final JavaVersion minimumRuntimeVersion;
@@ -50,11 +50,8 @@ public abstract class DefaultBuildParameterExtension implements BuildParameterEx
5050

5151
public DefaultBuildParameterExtension(
5252
ProviderFactory providers,
53-
Provider<File> runtimeJavaHome,
53+
RuntimeJava runtimeJava,
5454
Provider<? extends Action<JavaToolchainSpec>> javaToolChainSpec,
55-
Provider<JavaVersion> runtimeJavaVersion,
56-
boolean isRuntimeJavaHomeSet,
57-
Provider<String> runtimeJavaDetails,
5855
List<JavaHome> javaVersions,
5956
JavaVersion minimumCompilerVersion,
6057
JavaVersion minimumRuntimeVersion,
@@ -68,11 +65,11 @@ public DefaultBuildParameterExtension(
6865
Provider<BwcVersions> bwcVersions
6966
) {
7067
this.inFipsJvm = providers.systemProperty("tests.fips.enabled").map(DefaultBuildParameterExtension::parseBoolean);
71-
this.runtimeJavaHome = cache(providers, runtimeJavaHome);
68+
this.runtimeJava = runtimeJava;
69+
this.runtimeJavaHome = cache(providers, runtimeJava.getJavahome());
7270
this.javaToolChainSpec = cache(providers, javaToolChainSpec);
73-
this.runtimeJavaVersion = cache(providers, runtimeJavaVersion);
74-
this.isRuntimeJavaHomeSet = isRuntimeJavaHomeSet;
75-
this.runtimeJavaDetails = cache(providers, runtimeJavaDetails);
71+
this.runtimeJavaVersion = cache(providers, runtimeJava.getJavaVersion());
72+
this.runtimeJavaDetails = cache(providers, runtimeJava.getVendorDetails());
7673
this.javaVersions = javaVersions;
7774
this.minimumCompilerVersion = minimumCompilerVersion;
7875
this.minimumRuntimeVersion = minimumRuntimeVersion;
@@ -116,7 +113,12 @@ public void withFipsEnabledOnly(Task task) {
116113

117114
@Override
118115
public Boolean getIsRuntimeJavaHomeSet() {
119-
return isRuntimeJavaHomeSet;
116+
return runtimeJava.isExplicitlySet();
117+
}
118+
119+
@Override
120+
public RuntimeJava getRuntimeJava() {
121+
return runtimeJava;
120122
}
121123

122124
@Override

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

Lines changed: 57 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.elasticsearch.gradle.Architecture;
1515
import org.elasticsearch.gradle.OS;
1616
import org.elasticsearch.gradle.Version;
17+
import org.elasticsearch.gradle.VersionProperties;
1718
import org.elasticsearch.gradle.internal.BwcVersions;
1819
import org.elasticsearch.gradle.internal.Jdk;
1920
import org.elasticsearch.gradle.internal.JdkDownloadPlugin;
@@ -47,7 +48,6 @@
4748
import org.gradle.jvm.toolchain.JvmVendorSpec;
4849
import org.gradle.jvm.toolchain.internal.InstallationLocation;
4950
import org.gradle.util.GradleVersion;
50-
import org.jetbrains.annotations.NotNull;
5151

5252
import java.io.BufferedReader;
5353
import java.io.File;
@@ -72,7 +72,8 @@
7272

7373
import static org.elasticsearch.gradle.internal.conventions.GUtils.elvis;
7474
import static org.elasticsearch.gradle.internal.conventions.VersionPropertiesPlugin.VERSIONS_EXT;
75-
import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findLatestEABuildNumber;
75+
import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findLatestPreReleaseBuild;
76+
import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findPreReleaseBuild;
7677

7778
public class GlobalBuildInfoPlugin implements Plugin<Project> {
7879
private static final Logger LOGGER = Logging.getLogger(GlobalBuildInfoPlugin.class);
@@ -127,40 +128,20 @@ public void apply(Project project) {
127128
JavaVersion minimumCompilerVersion = JavaVersion.toVersion(versionProperties.get("minimumCompilerJava"));
128129
JavaVersion minimumRuntimeVersion = JavaVersion.toVersion(versionProperties.get("minimumRuntimeJava"));
129130

130-
String bundledJdkVersion = versionProperties.getProperty("bundled_jdk");
131-
String bundledJdkMajorVersion = bundledJdkVersion.split("[.+]")[0];
132-
Version elasticsearchVersionProperty = Version.fromString(versionProperties.getProperty("elasticsearch"));
133-
134-
Provider<File> explicitRuntimeJavaHome = findRuntimeJavaHome();
135-
boolean isRuntimeJavaHomeExplicitlySet = explicitRuntimeJavaHome.isPresent();
136-
Provider<File> actualRuntimeJavaHome = isRuntimeJavaHomeExplicitlySet
137-
? explicitRuntimeJavaHome
138-
: resolveJavaHomeFromToolChainService(bundledJdkMajorVersion);
139-
140-
Provider<JvmInstallationMetadata> runtimeJdkMetaData = actualRuntimeJavaHome.map(
141-
runtimeJavaHome -> metadataDetector.getMetadata(getJavaInstallation(runtimeJavaHome))
142-
);
131+
RuntimeJava runtimeJavaHome = findRuntimeJavaHome();
143132
AtomicReference<BwcVersions> cache = new AtomicReference<>();
144133
Provider<BwcVersions> bwcVersionsProvider = providers.provider(
145134
() -> cache.updateAndGet(val -> val == null ? resolveBwcVersions(elasticsearchVersionProperty) : val)
146135
);
136+
147137
BuildParameterExtension buildParams = project.getExtensions()
148138
.create(
149139
BuildParameterExtension.class,
150140
BuildParameterExtension.EXTENSION_NAME,
151141
DefaultBuildParameterExtension.class,
152142
providers,
153-
actualRuntimeJavaHome,
143+
runtimeJavaHome,
154144
resolveToolchainSpecFromEnv(),
155-
actualRuntimeJavaHome.map(
156-
javaHome -> determineJavaVersion(
157-
"runtime java.home",
158-
javaHome,
159-
isRuntimeJavaHomeExplicitlySet ? minimumRuntimeVersion : JavaVersion.toVersion(bundledJdkMajorVersion)
160-
)
161-
),
162-
isRuntimeJavaHomeExplicitlySet,
163-
runtimeJdkMetaData.map(m -> formatJavaVendorDetails(m)),
164145
getAvailableJavaVersions(),
165146
minimumCompilerVersion,
166147
minimumRuntimeVersion,
@@ -267,7 +248,7 @@ private void logGlobalBuildInfo(BuildParameterExtension buildParams) {
267248
LOGGER.quiet("Elasticsearch Build Hamster says Hello!");
268249
LOGGER.quiet(" Gradle Version : " + GradleVersion.current().getVersion());
269250
LOGGER.quiet(" OS Info : " + osName + " " + osVersion + " (" + osArch + ")");
270-
if (buildParams.getIsRuntimeJavaHomeSet()) {
251+
if (buildParams.getRuntimeJava().isExplicitlySet()) {
271252
JvmInstallationMetadata runtimeJvm = metadataDetector.getMetadata(getJavaInstallation(buildParams.getRuntimeJavaHome().get()));
272253
final String runtimeJvmVendorDetails = runtimeJvm.getVendor().getDisplayName();
273254
final String runtimeJvmImplementationVersion = runtimeJvm.getJvmVersion();
@@ -374,50 +355,74 @@ private static void assertMinimumCompilerVersion(JavaVersion minimumCompilerVers
374355
}
375356
}
376357

377-
private Provider<File> findRuntimeJavaHome() {
358+
private RuntimeJava findRuntimeJavaHome() {
378359
String runtimeJavaProperty = System.getProperty("runtime.java");
379-
380360
if (runtimeJavaProperty != null) {
381-
if (runtimeJavaProperty.toLowerCase().endsWith("-ea")) {
382-
// handle EA builds differently due to lack of support in Gradle toolchain service
361+
if (runtimeJavaProperty.toLowerCase().endsWith("-pre")) {
362+
// handle pre-release builds differently due to lack of support in Gradle toolchain service
383363
// we resolve them using JdkDownloadPlugin for now.
384-
Integer major = Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 3));
385-
return resolveEarlyAccessJavaHome(major);
364+
return resolvePreReleaseRuntimeJavaHome(runtimeJavaProperty);
386365
} else {
387-
return resolveJavaHomeFromToolChainService(runtimeJavaProperty);
366+
return runtimeJavaHome(resolveJavaHomeFromToolChainService(runtimeJavaProperty), true);
388367
}
389368
}
390369
if (System.getenv("RUNTIME_JAVA_HOME") != null) {
391-
return providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME")));
370+
return runtimeJavaHome(providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))), true);
392371
}
393372
// fall back to tool chain if set.
394373
String env = System.getenv("JAVA_TOOLCHAIN_HOME");
395-
return providers.provider(() -> {
396-
if (env == null) {
397-
return null;
398-
}
399-
return new File(env);
400-
});
374+
boolean explicitlySet = env != null;
375+
Provider<File> javaHome = explicitlySet
376+
? providers.provider(() -> new File(env))
377+
: resolveJavaHomeFromToolChainService(VersionProperties.getBundledJdkMajorVersion());
378+
return runtimeJavaHome(javaHome, explicitlySet);
401379
}
402380

403-
private Provider<File> resolveEarlyAccessJavaHome(Integer runtimeJavaProperty) {
404-
NamedDomainObjectContainer<Jdk> container = (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName("jdks");
381+
private RuntimeJava runtimeJavaHome(Provider<File> fileProvider, boolean explicitlySet) {
382+
return runtimeJavaHome(fileProvider, explicitlySet, null);
383+
}
384+
385+
private RuntimeJava runtimeJavaHome(Provider<File> fileProvider, boolean explicitlySet, String preReleasePostfix) {
386+
Provider<JavaVersion> javaVersion = fileProvider.map(
387+
javaHome -> determineJavaVersion(
388+
"runtime java.home",
389+
javaHome,
390+
fileProvider.isPresent()
391+
? JavaVersion.toVersion(getResourceContents("/minimumRuntimeVersion"))
392+
: JavaVersion.toVersion(VersionProperties.getBundledJdkMajorVersion())
393+
)
394+
);
395+
396+
Provider<String> vendorDetails = fileProvider.map(j -> metadataDetector.getMetadata(getJavaInstallation(j)))
397+
.map(m -> formatJavaVendorDetails(m));
398+
399+
return new RuntimeJava(fileProvider, javaVersion, vendorDetails, explicitlySet, preReleasePostfix);
400+
}
401+
402+
private RuntimeJava resolvePreReleaseRuntimeJavaHome(String runtimeJavaProperty) {
403+
var major = JavaLanguageVersion.of(Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 4)));
405404
Integer buildNumber = Integer.getInteger("runtime.java.build");
406-
if (buildNumber == null) {
407-
buildNumber = findLatestEABuildNumber(runtimeJavaProperty);
408-
}
409-
String eaVersionString = String.format("%d-ea+%d", runtimeJavaProperty, buildNumber);
410-
Jdk jdk = container.create("ea_jdk_" + runtimeJavaProperty, j -> {
411-
j.setVersion(eaVersionString);
405+
var jdkbuild = buildNumber == null ? findLatestPreReleaseBuild(major) : findPreReleaseBuild(major, buildNumber);
406+
String prVersionString = String.format("%d-%s+%d", major.asInt(), jdkbuild.type(), jdkbuild.buildNumber());
407+
return resolveJavaHomeFromJdkDownloadPlugin(jdkbuild.type(), major, prVersionString);
408+
409+
}
410+
411+
private RuntimeJava resolveJavaHomeFromJdkDownloadPlugin(String preReleaseType, JavaLanguageVersion major, String prVersionString) {
412+
NamedDomainObjectContainer<Jdk> container = (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName("jdks");
413+
Jdk jdk = container.create(preReleaseType + "_" + major.asInt(), j -> {
414+
j.setVersion(prVersionString);
412415
j.setVendor("openjdk");
413416
j.setPlatform(OS.current().javaOsReference);
414417
j.setArchitecture(Architecture.current().javaClassifier);
415-
j.setDistributionVersion("ea");
418+
j.setDistributionVersion(preReleaseType);
416419
});
417-
return providers.provider(() -> new File(jdk.getJavaHomePath().toString()));
420+
// We on purpose resolve this here eagerly to ensure we resolve the jdk configuration in the context of the root project.
421+
// If we keep this lazy we can not guarantee in which project context this is resolved which will fail the build.
422+
File file = new File(jdk.getJavaHomePath().toString());
423+
return runtimeJavaHome(providers.provider(() -> file), true, preReleaseType);
418424
}
419425

420-
@NotNull
421426
private Provider<File> resolveJavaHomeFromToolChainService(String version) {
422427
Property<JavaLanguageVersion> value = objectFactory.property(JavaLanguageVersion.class).value(JavaLanguageVersion.of(version));
423428
return toolChainService.launcherFor(javaToolchainSpec -> javaToolchainSpec.getLanguageVersion().value(value))
@@ -474,4 +479,5 @@ public void execute(JavaToolchainSpec spec) {
474479
spec.getLanguageVersion().set(expectedJavaLanguageVersion);
475480
}
476481
}
482+
477483
}

0 commit comments

Comments
 (0)