Skip to content

Commit 6d55127

Browse files
committed
[Gradle] Unify resolving pre release java versions like RCs and EAs (elastic#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 5b8b234 commit 6d55127

File tree

12 files changed

+330
-151
lines changed

12 files changed

+330
-151
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: 62 additions & 50 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;
@@ -72,7 +71,8 @@
7271

7372
import static org.elasticsearch.gradle.internal.conventions.GUtils.elvis;
7473
import static org.elasticsearch.gradle.internal.conventions.VersionPropertiesPlugin.VERSIONS_EXT;
75-
import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findLatestEABuildNumber;
74+
import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findLatestPreReleaseBuild;
75+
import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findPreReleaseBuild;
7676

7777
public class GlobalBuildInfoPlugin implements Plugin<Project> {
7878
private static final Logger LOGGER = Logging.getLogger(GlobalBuildInfoPlugin.class);
@@ -107,7 +107,6 @@ public GlobalBuildInfoPlugin(
107107

108108
@Override
109109
public void apply(Project project) {
110-
111110
if (project != project.getRootProject()) {
112111
throw new IllegalStateException(this.getClass().getName() + " can only be applied to the root project.");
113112
}
@@ -127,40 +126,22 @@ public void apply(Project project) {
127126
JavaVersion minimumCompilerVersion = JavaVersion.toVersion(versionProperties.get("minimumCompilerJava"));
128127
JavaVersion minimumRuntimeVersion = JavaVersion.toVersion(versionProperties.get("minimumRuntimeJava"));
129128

130-
String bundledJdkVersion = versionProperties.getProperty("bundled_jdk");
131-
String bundledJdkMajorVersion = bundledJdkVersion.split("[.+]")[0];
132129
Version elasticsearchVersionProperty = Version.fromString(versionProperties.getProperty("elasticsearch"));
133130

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,80 @@ private static void assertMinimumCompilerVersion(JavaVersion minimumCompilerVers
374355
}
375356
}
376357

377-
private Provider<File> findRuntimeJavaHome() {
378-
String runtimeJavaProperty = System.getProperty("runtime.java");
358+
private RuntimeJava findRuntimeJavaHome() {
359+
Properties versionProperties = (Properties) project.getExtensions().getByName(VERSIONS_EXT);
360+
String bundledJdkVersion = versionProperties.getProperty("bundled_jdk");
361+
String bundledJdkMajorVersion = bundledJdkVersion.split("[.+]")[0];
379362

363+
String runtimeJavaProperty = System.getProperty("runtime.java");
380364
if (runtimeJavaProperty != null) {
381-
if (runtimeJavaProperty.toLowerCase().endsWith("-ea")) {
382-
// handle EA builds differently due to lack of support in Gradle toolchain service
365+
if (runtimeJavaProperty.toLowerCase().endsWith("-pre")) {
366+
// handle pre-release builds differently due to lack of support in Gradle toolchain service
383367
// we resolve them using JdkDownloadPlugin for now.
384-
Integer major = Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 3));
385-
return resolveEarlyAccessJavaHome(major);
368+
return resolvePreReleaseRuntimeJavaHome(runtimeJavaProperty, bundledJdkMajorVersion);
386369
} else {
387-
return resolveJavaHomeFromToolChainService(runtimeJavaProperty);
370+
return runtimeJavaHome(resolveJavaHomeFromToolChainService(runtimeJavaProperty), true, bundledJdkMajorVersion);
388371
}
389372
}
390373
if (System.getenv("RUNTIME_JAVA_HOME") != null) {
391-
return providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME")));
374+
return runtimeJavaHome(providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))), true, bundledJdkVersion);
392375
}
393376
// fall back to tool chain if set.
394377
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-
});
378+
boolean explicitlySet = env != null;
379+
Provider<File> javaHome = explicitlySet
380+
? providers.provider(() -> new File(env))
381+
: resolveJavaHomeFromToolChainService(bundledJdkMajorVersion);
382+
return runtimeJavaHome(javaHome, explicitlySet, bundledJdkMajorVersion);
401383
}
402384

403-
private Provider<File> resolveEarlyAccessJavaHome(Integer runtimeJavaProperty) {
404-
NamedDomainObjectContainer<Jdk> container = (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName("jdks");
385+
private RuntimeJava runtimeJavaHome(Provider<File> fileProvider, boolean explicitlySet, String bundledJdkMajorVersion) {
386+
return runtimeJavaHome(fileProvider, explicitlySet, null, null, bundledJdkMajorVersion);
387+
}
388+
389+
private RuntimeJava runtimeJavaHome(
390+
Provider<File> fileProvider,
391+
boolean explicitlySet,
392+
String preReleasePostfix,
393+
Integer buildNumber,
394+
String bundledJdkMajorVersion
395+
) {
396+
Provider<JavaVersion> javaVersion = fileProvider.map(
397+
javaHome -> determineJavaVersion(
398+
"runtime java.home",
399+
javaHome,
400+
fileProvider.isPresent()
401+
? JavaVersion.toVersion(getResourceContents("/minimumRuntimeVersion"))
402+
: JavaVersion.toVersion(bundledJdkMajorVersion)
403+
)
404+
);
405+
406+
Provider<String> vendorDetails = fileProvider.map(j -> metadataDetector.getMetadata(getJavaInstallation(j)))
407+
.map(m -> formatJavaVendorDetails(m));
408+
409+
return new RuntimeJava(fileProvider, javaVersion, vendorDetails, explicitlySet, preReleasePostfix, buildNumber);
410+
}
411+
412+
private RuntimeJava resolvePreReleaseRuntimeJavaHome(String runtimeJavaProperty, String bundledJdkMajorVersion) {
413+
var major = JavaLanguageVersion.of(Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 4)));
405414
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);
415+
var jdkbuild = buildNumber == null ? findLatestPreReleaseBuild(major) : findPreReleaseBuild(major, buildNumber);
416+
String preReleaseType = jdkbuild.type();
417+
String prVersionString = String.format("%d-%s+%d", major.asInt(), preReleaseType, jdkbuild.buildNumber());
418+
NamedDomainObjectContainer<Jdk> container = (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName("jdks");
419+
Jdk jdk = container.create(preReleaseType + "_" + major.asInt(), j -> {
420+
j.setVersion(prVersionString);
412421
j.setVendor("openjdk");
413422
j.setPlatform(OS.current().javaOsReference);
414423
j.setArchitecture(Architecture.current().javaClassifier);
415-
j.setDistributionVersion("ea");
424+
j.setDistributionVersion(preReleaseType);
416425
});
417-
return providers.provider(() -> new File(jdk.getJavaHomePath().toString()));
426+
// We on purpose resolve this here eagerly to ensure we resolve the jdk configuration in the context of the root project.
427+
// If we keep this lazy we can not guarantee in which project context this is resolved which will fail the build.
428+
File file = new File(jdk.getJavaHomePath().toString());
429+
return runtimeJavaHome(providers.provider(() -> file), true, preReleaseType, jdkbuild.buildNumber(), bundledJdkMajorVersion);
418430
}
419431

420-
@NotNull
421432
private Provider<File> resolveJavaHomeFromToolChainService(String version) {
422433
Property<JavaLanguageVersion> value = objectFactory.property(JavaLanguageVersion.class).value(JavaLanguageVersion.of(version));
423434
return toolChainService.launcherFor(javaToolchainSpec -> javaToolchainSpec.getLanguageVersion().value(value))
@@ -474,4 +485,5 @@ public void execute(JavaToolchainSpec spec) {
474485
spec.getLanguageVersion().set(expectedJavaLanguageVersion);
475486
}
476487
}
488+
477489
}

0 commit comments

Comments
 (0)