Skip to content

Commit 8857d04

Browse files
authored
[Gradle] Unify resolving pre release java versions like RCs and EAs (#133708) (#133826)
* 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 902e743 commit 8857d04

File tree

12 files changed

+330
-158
lines changed

12 files changed

+330
-158
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
@@ -31,7 +31,7 @@ public class Jdk implements Buildable, Iterable<File> {
3131
"(\\d+)(\\.\\d+\\.\\d+(?:\\.\\d+)?)?\\+(\\d+(?:\\.\\d+)?)(@([a-f0-9]{32}))?"
3232
);
3333
private static final Pattern LEGACY_VERSION_PATTERN = Pattern.compile("(\\d)(u\\d+)\\+(b\\d+?)(@([a-f0-9]{32}))?");
34-
private static final Pattern EA_VERSION_PATTERN = Pattern.compile("(\\d+)-ea\\+(\\d+)(@([a-f0-9]{32}))?");
34+
private static final Pattern EA_VERSION_PATTERN = Pattern.compile("(\\d+)-(?:ea|rc)\\+(\\d+)(@([a-f0-9]{32}))?");
3535

3636
private final String name;
3737
private final Configuration 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
@@ -115,33 +115,40 @@ private void setupRepository(Project project, Jdk jdk) {
115115
+ jdk.getBuild()
116116
+ "/[module]/[classifier]/jdk/hotspot/normal/adoptium";
117117
}
118-
} else if (jdk.getVendor().equals(VENDOR_OPENJDK) && "ea".equals(jdk.getDistributionVersion())) {
119-
repoUrl = "https://builds.es-jdk-archive.com/";
120-
// current pattern since 12.0.1
121-
artifactPattern = "jdks/openjdk/"
122-
+ jdk.getMajor()
123-
+ "/openjdk-"
124-
+ jdk.getBaseVersion()
125-
+ "/"
126-
+ "openjdk-[revision]_[module]-[classifier]_bin.[ext]";
127118
} else if (jdk.getVendor().equals(VENDOR_OPENJDK)) {
128-
repoUrl = "https://download.oracle.com";
129-
if (jdk.getHash() != null) {
119+
if ("ea".equals(jdk.getDistributionVersion())) {
120+
repoUrl = "https://builds.es-jdk-archive.com/";
130121
// current pattern since 12.0.1
131-
artifactPattern = "java/GA/jdk"
132-
+ jdk.getBaseVersion()
133-
+ "/"
134-
+ jdk.getHash()
135-
+ "/"
136-
+ jdk.getBuild()
137-
+ "/GPL/openjdk-[revision]_[module]-[classifier]_bin.[ext]";
138-
} else {
139-
// simpler legacy pattern from JDK 9 to JDK 12 that we are advocating to Oracle to bring back
140-
artifactPattern = "java/GA/jdk"
122+
artifactPattern = "jdks/openjdk/"
141123
+ jdk.getMajor()
142-
+ "/"
143-
+ jdk.getBuild()
144-
+ "/GPL/openjdk-[revision]_[module]-[classifier]_bin.[ext]";
124+
+ "/openjdk-[revision]/openjdk-[revision]_[module]-[classifier]_bin.[ext]";
125+
} else if ("rc".equals(jdk.getDistributionVersion())) {
126+
repoUrl = "https://builds.es-jdk-archive.com/";
127+
// current pattern since 12.0.1
128+
artifactPattern = "jdks/openjdk/"
129+
+ jdk.getMajor()
130+
+ "/openjdk-[revision]/openjdk-"
131+
+ jdk.getMajor()
132+
+ "_[module]-[classifier]_bin.[ext]";
133+
} else {
134+
repoUrl = "https://download.oracle.com";
135+
if (jdk.getHash() != null) {
136+
// current pattern since 12.0.1
137+
artifactPattern = "java/GA/jdk"
138+
+ jdk.getBaseVersion()
139+
+ "/"
140+
+ jdk.getHash()
141+
+ "/"
142+
+ jdk.getBuild()
143+
+ "/GPL/openjdk-[revision]_[module]-[classifier]_bin.[ext]";
144+
} else {
145+
// simpler legacy pattern from JDK 9 to JDK 12 that we are advocating to Oracle to bring back
146+
artifactPattern = "java/GA/jdk"
147+
+ jdk.getMajor()
148+
+ "/"
149+
+ jdk.getBuild()
150+
+ "/GPL/openjdk-[revision]_[module]-[classifier]_bin.[ext]";
151+
}
145152
}
146153
} else if (jdk.getVendor().equals(VENDOR_ZULU)) {
147154
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 & 57 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,
@@ -179,13 +160,6 @@ public void apply(Project project) {
179160
spec.getParameters().getBuildParams().set(buildParams);
180161
});
181162

182-
BuildParams.init(params -> {
183-
params.reset();
184-
params.setIsCi(
185-
System.getenv("JENKINS_URL") != null || System.getenv("BUILDKITE_BUILD_URL") != null || System.getProperty("isCI") != null
186-
);
187-
});
188-
189163
// Enforce the minimum compiler version
190164
assertMinimumCompilerVersion(minimumCompilerVersion);
191165

@@ -274,7 +248,7 @@ private void logGlobalBuildInfo(BuildParameterExtension buildParams) {
274248
LOGGER.quiet("Elasticsearch Build Hamster says Hello!");
275249
LOGGER.quiet(" Gradle Version : " + GradleVersion.current().getVersion());
276250
LOGGER.quiet(" OS Info : " + osName + " " + osVersion + " (" + osArch + ")");
277-
if (buildParams.getIsRuntimeJavaHomeSet()) {
251+
if (buildParams.getRuntimeJava().isExplicitlySet()) {
278252
JvmInstallationMetadata runtimeJvm = metadataDetector.getMetadata(getJavaInstallation(buildParams.getRuntimeJavaHome().get()));
279253
final String runtimeJvmVendorDetails = runtimeJvm.getVendor().getDisplayName();
280254
final String runtimeJvmImplementationVersion = runtimeJvm.getJvmVersion();
@@ -381,50 +355,80 @@ private static void assertMinimumCompilerVersion(JavaVersion minimumCompilerVers
381355
}
382356
}
383357

384-
private Provider<File> findRuntimeJavaHome() {
385-
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];
386362

363+
String runtimeJavaProperty = System.getProperty("runtime.java");
387364
if (runtimeJavaProperty != null) {
388-
if (runtimeJavaProperty.toLowerCase().endsWith("-ea")) {
389-
// 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
390367
// we resolve them using JdkDownloadPlugin for now.
391-
Integer major = Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 3));
392-
return resolveEarlyAccessJavaHome(major);
368+
return resolvePreReleaseRuntimeJavaHome(runtimeJavaProperty, bundledJdkMajorVersion);
393369
} else {
394-
return resolveJavaHomeFromToolChainService(runtimeJavaProperty);
370+
return runtimeJavaHome(resolveJavaHomeFromToolChainService(runtimeJavaProperty), true, bundledJdkMajorVersion);
395371
}
396372
}
397373
if (System.getenv("RUNTIME_JAVA_HOME") != null) {
398-
return providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME")));
374+
return runtimeJavaHome(providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))), true, bundledJdkVersion);
399375
}
400376
// fall back to tool chain if set.
401377
String env = System.getenv("JAVA_TOOLCHAIN_HOME");
402-
return providers.provider(() -> {
403-
if (env == null) {
404-
return null;
405-
}
406-
return new File(env);
407-
});
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);
408383
}
409384

410-
private Provider<File> resolveEarlyAccessJavaHome(Integer runtimeJavaProperty) {
411-
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)));
412414
Integer buildNumber = Integer.getInteger("runtime.java.build");
413-
if (buildNumber == null) {
414-
buildNumber = findLatestEABuildNumber(runtimeJavaProperty);
415-
}
416-
String eaVersionString = String.format("%d-ea+%d", runtimeJavaProperty, buildNumber);
417-
Jdk jdk = container.create("ea_jdk_" + runtimeJavaProperty, j -> {
418-
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);
419421
j.setVendor("openjdk");
420422
j.setPlatform(OS.current().javaOsReference);
421423
j.setArchitecture(Architecture.current().javaClassifier);
422-
j.setDistributionVersion("ea");
424+
j.setDistributionVersion(preReleaseType);
423425
});
424-
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);
425430
}
426431

427-
@NotNull
428432
private Provider<File> resolveJavaHomeFromToolChainService(String version) {
429433
Property<JavaLanguageVersion> value = objectFactory.property(JavaLanguageVersion.class).value(JavaLanguageVersion.of(version));
430434
return toolChainService.launcherFor(javaToolchainSpec -> javaToolchainSpec.getLanguageVersion().value(value))
@@ -481,4 +485,5 @@ public void execute(JavaToolchainSpec spec) {
481485
spec.getLanguageVersion().set(expectedJavaLanguageVersion);
482486
}
483487
}
488+
484489
}

0 commit comments

Comments
 (0)