Skip to content

Commit 27fafa2

Browse files
authored
Use proper Java version for BWC builds (#29493)
Today we have JAVA_HOME for the compiler Java home and RUNTIME_JAVA_HOME for the test Java home. However, when we compile BWC nodes and run them, neither of these Java homes might be the version that was suitable for that BWC node (e.g., 5.6 requires JDK 8 to compile and to run). This commit adds support for the environment variables JAVA\d+_HOME and uses the appropriate Java home based on the version of the node being started. We even do this for reindex-from-old which requires JDK 7 for these very old nodes. Note that these environment variables are not required if not running BWC tests, and they are strictly required if running BWC tests.
1 parent 485d5d1 commit 27fafa2

File tree

4 files changed

+73
-11
lines changed

4 files changed

+73
-11
lines changed

buildSrc/src/main/groovy/org/elasticsearch/gradle/BuildPlugin.groovy

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ class BuildPlugin implements Plugin<Project> {
9797
String compilerJavaHome = findCompilerJavaHome()
9898
String runtimeJavaHome = findRuntimeJavaHome(compilerJavaHome)
9999
File gradleJavaHome = Jvm.current().javaHome
100+
101+
final Map<Integer, String> javaVersions = [:]
102+
for (int version = 7; version <= Integer.parseInt(minimumCompilerVersion.majorVersion); version++) {
103+
javaVersions.put(version, findJavaHome(version));
104+
}
105+
100106
String javaVendor = System.getProperty('java.vendor')
101107
String javaVersion = System.getProperty('java.version')
102108
String gradleJavaVersionDetails = "${javaVendor} ${javaVersion}" +
@@ -158,10 +164,32 @@ class BuildPlugin implements Plugin<Project> {
158164
throw new GradleException(message)
159165
}
160166

167+
for (final Map.Entry<Integer, String> javaVersionEntry : javaVersions.entrySet()) {
168+
final String javaHome = javaVersionEntry.getValue()
169+
if (javaHome == null) {
170+
continue
171+
}
172+
JavaVersion javaVersionEnum = JavaVersion.toVersion(findJavaSpecificationVersion(project, javaHome))
173+
final JavaVersion expectedJavaVersionEnum
174+
final int version = javaVersionEntry.getKey()
175+
if (version < 9) {
176+
expectedJavaVersionEnum = JavaVersion.toVersion("1." + version)
177+
} else {
178+
expectedJavaVersionEnum = JavaVersion.toVersion(Integer.toString(version))
179+
}
180+
if (javaVersionEnum != expectedJavaVersionEnum) {
181+
final String message =
182+
"the environment variable JAVA" + version + "_HOME must be set to a JDK installation directory for Java" +
183+
" ${expectedJavaVersionEnum} but is [${javaHome}] corresponding to [${javaVersionEnum}]"
184+
throw new GradleException(message)
185+
}
186+
}
187+
161188
project.rootProject.ext.compilerJavaHome = compilerJavaHome
162189
project.rootProject.ext.runtimeJavaHome = runtimeJavaHome
163190
project.rootProject.ext.compilerJavaVersion = compilerJavaVersionEnum
164191
project.rootProject.ext.runtimeJavaVersion = runtimeJavaVersionEnum
192+
project.rootProject.ext.javaVersions = javaVersions
165193
project.rootProject.ext.buildChecksDone = true
166194
}
167195

@@ -173,6 +201,7 @@ class BuildPlugin implements Plugin<Project> {
173201
project.ext.runtimeJavaHome = project.rootProject.ext.runtimeJavaHome
174202
project.ext.compilerJavaVersion = project.rootProject.ext.compilerJavaVersion
175203
project.ext.runtimeJavaVersion = project.rootProject.ext.runtimeJavaVersion
204+
project.ext.javaVersions = project.rootProject.ext.javaVersions
176205
}
177206

178207
private static String findCompilerJavaHome() {
@@ -188,6 +217,10 @@ class BuildPlugin implements Plugin<Project> {
188217
return javaHome
189218
}
190219

220+
private static String findJavaHome(int version) {
221+
return System.getenv('JAVA' + version + '_HOME')
222+
}
223+
191224
private static String findRuntimeJavaHome(final String compilerJavaHome) {
192225
assert compilerJavaHome != null
193226
return System.getenv('RUNTIME_JAVA_HOME') ?: compilerJavaHome

buildSrc/src/main/groovy/org/elasticsearch/gradle/test/NodeInfo.groovy

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ import com.sun.jna.Native
2222
import com.sun.jna.WString
2323
import org.apache.tools.ant.taskdefs.condition.Os
2424
import org.elasticsearch.gradle.Version
25+
import org.gradle.api.GradleException
2526
import org.gradle.api.InvalidUserDataException
27+
import org.gradle.api.JavaVersion
2628
import org.gradle.api.Project
2729

2830
import java.nio.file.Files
@@ -162,7 +164,25 @@ class NodeInfo {
162164
args.add("${esScript}")
163165
}
164166

165-
env = ['JAVA_HOME': project.runtimeJavaHome]
167+
final String javaHome
168+
final Map<Integer, JavaVersion> javaVersions = project.javaVersions
169+
if (Version.fromString(nodeVersion).before("6.2.0")) {
170+
final String java8Home = javaVersions.get(8)
171+
if (java8Home == null) {
172+
throw new GradleException("JAVA8_HOME must be set to run BWC tests against [" + nodeVersion + "]")
173+
}
174+
javaHome = java8Home
175+
} else if (Version.fromString(nodeVersion).onOrAfter("6.2.0") && Version.fromString(nodeVersion).before("6.3.0")) {
176+
final String java9Home = javaVersions.get(9)
177+
if (java9Home == null) {
178+
throw new GradleException("JAVA9_HOME must be set to run BWC tests against [" + nodeVersion + "]")
179+
}
180+
javaHome = java9Home
181+
} else {
182+
javaHome = project.compilerJavaHome
183+
}
184+
185+
env = ['JAVA_HOME':javaHome]
166186
args.addAll("-E", "node.portsfile=true")
167187
String collectedSystemProperties = config.systemProperties.collect { key, value -> "-D${key}=${value}" }.join(" ")
168188
String esJavaOpts = config.jvmArgs.isEmpty() ? collectedSystemProperties : collectedSystemProperties + " " + config.jvmArgs

distribution/bwc/build.gradle

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,19 @@ subprojects {
144144
task buildBwcVersion(type: Exec) {
145145
dependsOn checkoutBwcBranch, writeBuildMetadata
146146
workingDir = checkoutDir
147-
if (project.rootProject.ext.runtimeJavaVersion == JavaVersion.VERSION_1_8 && ["5.6", "6.0", "6.1"].contains(bwcBranch)) {
148-
/*
149-
* If runtime Java home is set to JDK 8 and we are building branches that are officially built with JDK 8, push this to JAVA_HOME for
150-
* these builds.
151-
*/
152-
environment('JAVA_HOME', System.getenv('RUNTIME_JAVA_HOME'))
147+
if (["5.6", "6.0", "6.1"].contains(bwcBranch)) {
148+
// we are building branches that are officially built with JDK 8, push JAVA8_HOME to JAVA_HOME for these builds
149+
if (project.javaVersions.get(8) == null) {
150+
throw new GradleException("JAVA8_HOME is required to build BWC versions for BWC branch [" + bwcBranch + "]")
151+
}
152+
environment('JAVA_HOME', project.javaVersions.get(8))
153+
} else if ("6.2".equals(bwcBranch)) {
154+
if (project.javaVersions.get(9) == null) {
155+
throw new GradleException("JAVA9_HOME is required to build BWC versions for BWC branch [" + bwcBranch + "]")
156+
}
157+
environment('JAVA_HOME', project.javaVersions.get(9))
158+
} else {
159+
environment('JAVA_HOME', project.compilerJavaHome)
153160
}
154161
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
155162
executable 'cmd'

qa/reindex-from-old/build.gradle

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,13 @@ dependencies {
5151
es090 'org.elasticsearch:elasticsearch:0.90.13@zip'
5252
}
5353

54-
if (project.runtimeJavaVersion >= JavaVersion.VERSION_1_9 || Os.isFamily(Os.FAMILY_WINDOWS)) {
55-
/* We can't run the dependencies with Java 9 so for now we'll skip the whole
56-
* thing. We can't get the pid files in windows so we skip that as well.... */
54+
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
55+
// we can't get the pid files in windows so we skip that
5756
integTest.enabled = false
5857
} else {
58+
if (project.javaVersions.get(7) == null) {
59+
throw new GradleException("JAVA7_HOME must be set to run reindex-from-old")
60+
}
5961
/* Set up tasks to unzip and run the old versions of ES before running the
6062
* integration tests. */
6163
for (String version : ['2', '1', '090']) {
@@ -75,7 +77,7 @@ if (project.runtimeJavaVersion >= JavaVersion.VERSION_1_9 || Os.isFamily(Os.FAMI
7577
dependsOn unzip
7678
executable = new File(project.runtimeJavaHome, 'bin/java')
7779
env 'CLASSPATH', "${ -> project.configurations.oldesFixture.asPath }"
78-
env 'JAVA_HOME', project.runtimeJavaHome
80+
env 'JAVA_HOME', project.javaVersions.get(7)
7981
args 'oldes.OldElasticsearch',
8082
baseDir,
8183
unzip.temporaryDir,

0 commit comments

Comments
 (0)