4747import org .gradle .jvm .toolchain .JvmVendorSpec ;
4848import org .gradle .jvm .toolchain .internal .InstallationLocation ;
4949import org .gradle .util .GradleVersion ;
50- import org .jetbrains .annotations .NotNull ;
5150
5251import java .io .BufferedReader ;
5352import java .io .File ;
7271
7372import static org .elasticsearch .gradle .internal .conventions .GUtils .elvis ;
7473import 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
7777public 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