diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/BuildParameterExtension.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/BuildParameterExtension.java index d6c8e38dac2c3..edee820a370c8 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/BuildParameterExtension.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/BuildParameterExtension.java @@ -32,6 +32,8 @@ public interface BuildParameterExtension { Boolean getIsRuntimeJavaHomeSet(); + Boolean getIsEarlyAccessRuntimeJavaVersion(); + List getJavaVersions(); JavaVersion getMinimumCompilerVersion(); diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/DefaultBuildParameterExtension.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/DefaultBuildParameterExtension.java index 760664f9fa025..57b43259822e1 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/DefaultBuildParameterExtension.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/DefaultBuildParameterExtension.java @@ -29,6 +29,7 @@ public abstract class DefaultBuildParameterExtension implements BuildParameterEx private final Provider inFipsJvm; private final Provider runtimeJavaHome; private final Boolean isRuntimeJavaHomeSet; + private final Boolean earlyAccessJavaRuntime; private final List javaVersions; private final JavaVersion minimumCompilerVersion; private final JavaVersion minimumRuntimeVersion; @@ -54,6 +55,7 @@ public DefaultBuildParameterExtension( Provider> javaToolChainSpec, Provider runtimeJavaVersion, boolean isRuntimeJavaHomeSet, + boolean earlyAccessJavaRuntime, Provider runtimeJavaDetails, List javaVersions, JavaVersion minimumCompilerVersion, @@ -72,6 +74,7 @@ public DefaultBuildParameterExtension( this.javaToolChainSpec = cache(providers, javaToolChainSpec); this.runtimeJavaVersion = cache(providers, runtimeJavaVersion); this.isRuntimeJavaHomeSet = isRuntimeJavaHomeSet; + this.earlyAccessJavaRuntime = earlyAccessJavaRuntime; this.runtimeJavaDetails = cache(providers, runtimeJavaDetails); this.javaVersions = javaVersions; this.minimumCompilerVersion = minimumCompilerVersion; @@ -119,6 +122,11 @@ public Boolean getIsRuntimeJavaHomeSet() { return isRuntimeJavaHomeSet; } + @Override + public Boolean getIsEarlyAccessRuntimeJavaVersion() { + return earlyAccessJavaRuntime; + } + @Override public List getJavaVersions() { return javaVersions; diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/GlobalBuildInfoPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/GlobalBuildInfoPlugin.java index 2c0c5ebb67248..21e7addde1686 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/GlobalBuildInfoPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/GlobalBuildInfoPlugin.java @@ -116,37 +116,34 @@ public void apply(Project project) { JavaVersion minimumCompilerVersion = JavaVersion.toVersion(getResourceContents("/minimumCompilerVersion")); JavaVersion minimumRuntimeVersion = JavaVersion.toVersion(getResourceContents("/minimumRuntimeVersion")); - Provider explicitRuntimeJavaHome = findRuntimeJavaHome(); - boolean isRuntimeJavaHomeExplicitlySet = explicitRuntimeJavaHome.isPresent(); - Provider actualRuntimeJavaHome = isRuntimeJavaHomeExplicitlySet - ? explicitRuntimeJavaHome - : resolveJavaHomeFromToolChainService(VersionProperties.getBundledJdkMajorVersion()); + RuntimeJavaHome runtimeJavaHome = findRuntimeJavaHome(); - Provider runtimeJdkMetaData = actualRuntimeJavaHome.map( - runtimeJavaHome -> metadataDetector.getMetadata(getJavaInstallation(runtimeJavaHome)) - ); + Provider runtimeJdkMetaData = runtimeJavaHome.getJavahome() + .map(j -> metadataDetector.getMetadata(getJavaInstallation(j))); AtomicReference cache = new AtomicReference<>(); Provider bwcVersionsProvider = providers.provider( () -> cache.updateAndGet(val -> val == null ? resolveBwcVersions() : val) ); + BuildParameterExtension buildParams = project.getExtensions() .create( BuildParameterExtension.class, BuildParameterExtension.EXTENSION_NAME, DefaultBuildParameterExtension.class, providers, - actualRuntimeJavaHome, + runtimeJavaHome.getJavahome(), resolveToolchainSpecFromEnv(), - actualRuntimeJavaHome.map( + runtimeJavaHome.javahome.map( javaHome -> determineJavaVersion( "runtime java.home", javaHome, - isRuntimeJavaHomeExplicitlySet + runtimeJavaHome.javahome.isPresent() ? minimumRuntimeVersion : JavaVersion.toVersion(VersionProperties.getBundledJdkMajorVersion()) ) ), - isRuntimeJavaHomeExplicitlySet, + runtimeJavaHome.expclicitlySet, + runtimeJavaHome.earlyAccess, runtimeJdkMetaData.map(m -> formatJavaVendorDetails(m)), getAvailableJavaVersions(), minimumCompilerVersion, @@ -344,7 +341,7 @@ private static void assertMinimumCompilerVersion(JavaVersion minimumCompilerVers } } - private Provider findRuntimeJavaHome() { + private RuntimeJavaHome findRuntimeJavaHome() { String runtimeJavaProperty = System.getProperty("runtime.java"); if (runtimeJavaProperty != null) { @@ -352,22 +349,21 @@ private Provider findRuntimeJavaHome() { // handle EA builds differently due to lack of support in Gradle toolchain service // we resolve them using JdkDownloadPlugin for now. Integer major = Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 3)); - return resolveEarlyAccessJavaHome(major); + return new RuntimeJavaHome(resolveEarlyAccessJavaHome(major), true, true); } else { - return resolveJavaHomeFromToolChainService(runtimeJavaProperty); + return new RuntimeJavaHome(resolveJavaHomeFromToolChainService(runtimeJavaProperty), true, false); } } if (System.getenv("RUNTIME_JAVA_HOME") != null) { - return providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))); + return new RuntimeJavaHome(providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))), true, false); } // fall back to tool chain if set. String env = System.getenv("JAVA_TOOLCHAIN_HOME"); - return providers.provider(() -> { - if (env == null) { - return null; - } - return new File(env); - }); + boolean explicitlySet = env != null; + Provider javaHome = explicitlySet + ? providers.provider(() -> new File(env)) + : resolveJavaHomeFromToolChainService(VersionProperties.getBundledJdkMajorVersion()); + return new RuntimeJavaHome(javaHome, explicitlySet, false); } private Provider resolveEarlyAccessJavaHome(Integer runtimeJavaProperty) { @@ -444,4 +440,25 @@ public void execute(JavaToolchainSpec spec) { spec.getLanguageVersion().set(expectedJavaLanguageVersion); } } + + private static class RuntimeJavaHome { + + private final boolean earlyAccess; + private final Provider javahome; + private final boolean expclicitlySet; + + // RuntimeJavaHome(Provider javahome) { + // this(javahome, false); + // } + // + RuntimeJavaHome(Provider javahome, boolean explicitlySet, boolean earlyAccess) { + this.javahome = javahome; + this.expclicitlySet = explicitlySet; + this.earlyAccess = earlyAccess; + } + + public Provider getJavahome() { + return javahome; + } + } } diff --git a/distribution/build.gradle b/distribution/build.gradle index 2b055e63d938d..ac1274fab96bf 100644 --- a/distribution/build.gradle +++ b/distribution/build.gradle @@ -20,6 +20,8 @@ import org.elasticsearch.gradle.transform.FilteringJarTransform import java.nio.file.Files import java.nio.file.Path +import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findLatestEABuildNumber + plugins { id 'base' id 'elasticsearch.distro' @@ -48,9 +50,9 @@ dependencies { def thisProj = project rootProject.allprojects { proj -> - proj.plugins.withType(DependenciesInfoPlugin) { - thisProj.dependencies.add("dependencyInfos", project.dependencies.project(path: proj.path)) - } + proj.plugins.withType(DependenciesInfoPlugin) { + thisProj.dependencies.add("dependencyInfos", project.dependencies.project(path: proj.path)) + } } /***************************************************************************** @@ -61,9 +63,10 @@ rootProject.allprojects { proj -> tasks.register("generateDependenciesReport", ConcatFilesTask) { files = configurations.dependencyInfos headerLine = "name,version,url,license,sourceURL" - target = new File(providers.systemProperty('csv') - .orElse("${project.buildDir}/reports/dependencies/es-dependencies.csv") - .get() + target = new File( + providers.systemProperty('csv') + .orElse("${project.buildDir}/reports/dependencies/es-dependencies.csv") + .get() ) // explicitly add our dependency on the JDK String jdkVersion = VersionProperties.versions.get('bundled_jdk').split('@')[0] @@ -246,20 +249,45 @@ configure(subprojects.findAll { ['archives', 'packages'].contains(it.name) }) { apply plugin: 'elasticsearch.jdk-download' apply plugin: 'elasticsearch.repositories' - // Setup all required JDKs - project.jdks { - ['darwin', 'windows', 'linux'].each { platform -> - (platform == 'linux' || platform == 'darwin' ? ['x64', 'aarch64'] : ['x64']).each { architecture -> - "bundled_${platform}_${architecture}" { - it.platform = platform - it.version = VersionProperties.bundledJdkVersion - it.vendor = VersionProperties.bundledJdkVendor - it.architecture = architecture + if (buildParams.getIsEarlyAccessRuntimeJavaVersion()) { + Integer buildNumber = Integer.getInteger("runtime.java.build"); + def runtimeJavaMajorVersion = Integer.parseInt(buildParams.runtimeJavaVersion.get().getMajorVersion()) + if (buildNumber == null) { + buildNumber = findLatestEABuildNumber(runtimeJavaMajorVersion); + } + String eaVersionString = String.format("%d-ea+%d", runtimeJavaMajorVersion, buildNumber); + + project.jdks { + ['darwin', 'windows', 'linux'].each { platform -> + (platform == 'linux' || platform == 'darwin' ? ['x64', 'aarch64'] : ['x64']).each { architecture -> + "bundled_${platform}_${architecture}" { + it.version = eaVersionString; + it.vendor = "openjdk" + it.platform = platform + it.architecture = architecture + it.distributionVersion = "ea" + } + } + } + } + } else { + // Setup all required JDKs + project.jdks { + ['darwin', 'windows', 'linux'].each { platform -> + (platform == 'linux' || platform == 'darwin' ? ['x64', 'aarch64'] : ['x64']).each { architecture -> + "bundled_${platform}_${architecture}" { + it.platform = platform + it.version = VersionProperties.bundledJdkVersion + it.vendor = VersionProperties.bundledJdkVendor + it.architecture = architecture + } } } } + } + // TODO: the map needs to be an input of the tasks, so that when it changes, the task will re-run... /***************************************************************************** * Properties to expand when copying packaging files * @@ -288,7 +316,8 @@ configure(subprojects.findAll { ['archives', 'packages'].contains(it.name) }) { } all { resolutionStrategy.dependencySubstitution { - substitute module("org.apache.logging.log4j:log4j-core") using project(":libs:log4j") because "patched to remove JndiLookup class"} + substitute module("org.apache.logging.log4j:log4j-core") using project(":libs:log4j") because "patched to remove JndiLookup class" + } } } @@ -354,7 +383,7 @@ configure(subprojects.findAll { ['archives', 'packages'].contains(it.name) }) { into('platform') { from(configurations.libsNative) if (os != null) { - include (os + '-' + architecture + '/*') + include(os + '-' + architecture + '/*') } } into('entitlement-agent') { @@ -416,7 +445,7 @@ configure(subprojects.findAll { ['archives', 'packages'].contains(it.name) }) { // main config files, processed with distribution specific substitutions from '../src/config' exclude 'log4j2.properties' // this is handled separately below - filter("tokens" : expansionsForDistribution(distributionType, isTestDistro), ReplaceTokens.class) + filter("tokens": expansionsForDistribution(distributionType, isTestDistro), ReplaceTokens.class) } from buildDefaultLog4jConfigTaskProvider from isTestDistro ? integTestConfigFiles : defaultConfigFiles @@ -431,11 +460,11 @@ configure(subprojects.findAll { ['archives', 'packages'].contains(it.name) }) { exclude '*.exe' exclude '*.bat' eachFile { - it.permissions{ + it.permissions { unix(0755) } } - filter("tokens" : expansionsForDistribution(distributionType, testDistro), ReplaceTokens.class) + filter("tokens": expansionsForDistribution(distributionType, testDistro), ReplaceTokens.class) } // windows files, only for zip if (distributionType == 'zip') { @@ -443,7 +472,7 @@ configure(subprojects.findAll { ['archives', 'packages'].contains(it.name) }) { from '../src/bin' include '*.bat' filter(FixCrLfFilter, eol: FixCrLfFilter.CrLf.newInstance('crlf')) - filter("tokens" : expansionsForDistribution(distributionType, testDistro), ReplaceTokens.class) + filter("tokens": expansionsForDistribution(distributionType, testDistro), ReplaceTokens.class) } with copySpec { from '../src/bin' @@ -466,7 +495,7 @@ configure(subprojects.findAll { ['archives', 'packages'].contains(it.name) }) { if (testDistro) { from buildServerNoticeTaskProvider } else { - from (buildDefaultNoticeTaskProvider) { + from(buildDefaultNoticeTaskProvider) { filePermissions { unix(0644) } @@ -547,57 +576,57 @@ subprojects { String footer = "# Built for ${project.name}-${project.version} " + "(${distributionType})" Map expansions = [ - 'project.name': project.name, - 'project.version': version, + 'project.name' : project.name, + 'project.version' : version, 'project.minor.version': "${VersionProperties.elasticsearchVersion.major}.${VersionProperties.elasticsearchVersion.minor}", - 'path.conf': [ + 'path.conf' : [ 'deb': '/etc/elasticsearch', 'rpm': '/etc/elasticsearch', 'def': '"$ES_HOME"/config' ], - 'path.data': [ + 'path.data' : [ 'deb': packagingPathData, 'rpm': packagingPathData, 'def': '#path.data: /path/to/data' ], - 'path.env': [ + 'path.env' : [ 'deb': '/etc/default/elasticsearch', 'rpm': '/etc/sysconfig/elasticsearch', /* There isn't one of these files for tar or zip but its important to make an empty string here so the script can properly skip it. */ 'def': 'if [ -z "$ES_PATH_CONF" ]; then ES_PATH_CONF="$ES_HOME"/config; done', ], - 'source.path.env': [ + 'source.path.env' : [ 'deb': 'source /etc/default/elasticsearch', 'rpm': 'source /etc/sysconfig/elasticsearch', 'def': 'if [ -z "$ES_PATH_CONF" ]; then ES_PATH_CONF="$ES_HOME"/config; fi', ], - 'path.logs': [ + 'path.logs' : [ 'deb': packagingPathLogs, 'rpm': packagingPathLogs, 'def': '#path.logs: /path/to/logs' ], - 'scripts.footer': [ + 'scripts.footer' : [ /* Debian needs exit 0 on these scripts so we add it here and preserve the pretty footer. */ 'deb': "exit 0\n${footer}", 'def': footer ], - 'es.distribution.type': [ + 'es.distribution.type' : [ 'deb': 'deb', 'rpm': 'rpm', 'tar': 'tar', 'zip': 'zip' ], - 'license.name': [ + 'license.name' : [ 'deb': 'Elastic-License' ], - 'license.text': [ + 'license.text' : [ 'deb': licenseText, ], ]