Skip to content

Commit a8757f9

Browse files
authored
Update build to use gradle wrapper 6.8 (#65596)
- Updates our build to use the latest Gradle 6.8 release which is the last release before the major 7.0 release. - Resolve available gradle versions using built-in toolchain support - Fixes deprecated usage of JavaInstallationRegistry - We replace jdk handling in our build to rely on jvm detection provided by the gradle build tool itself. As we rely on environment variables pointing to jdks we wire this into the gradle jdk detection mechanism
1 parent 88b3862 commit a8757f9

File tree

21 files changed

+186
-161
lines changed

21 files changed

+186
-161
lines changed

buildSrc/src/integTest/groovy/org/elasticsearch/gradle/DistributionDownloadPluginFuncTest.groovy

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
package org.elasticsearch.gradle
2121

2222
import org.elasticsearch.gradle.fixtures.AbstractGradleFuncTest
23-
import org.elasticsearch.gradle.transform.SymbolicLinkPreservingUntarTransform
2423
import org.gradle.testkit.runner.TaskOutcome
2524
import spock.lang.Unroll
2625

@@ -61,17 +60,21 @@ class DistributionDownloadPluginFuncTest extends AbstractGradleFuncTest {
6160
"""
6261

6362
when:
64-
def runner = gradleRunner('clean', 'setupDistro', '-i')
63+
def guh = new File(testProjectDir.getRoot(), "gradle-user-home").absolutePath;
64+
def runner = gradleRunner('clean', 'setupDistro', '-i', '-g', guh)
6565
def result = withMockedDistributionDownload(version, platform, runner) {
6666
// initial run
67-
build()
67+
def firstRun = build()
68+
assertOutputContains(firstRun.output, "Unpacking elasticsearch-${version}-linux-x86_64.tar.gz " +
69+
"using SymbolicLinkPreservingUntarTransform")
6870
// 2nd invocation
6971
build()
7072
}
7173

7274
then:
7375
result.task(":setupDistro").outcome == TaskOutcome.SUCCESS
74-
assertOutputContains(result.output, "Skipping ${SymbolicLinkPreservingUntarTransform.class.simpleName}")
76+
assertOutputMissing(result.output, "Unpacking elasticsearch-${version}-linux-x86_64.tar.gz " +
77+
"using SymbolicLinkPreservingUntarTransform")
7578
}
7679

7780
def "transforms are reused across projects"() {
@@ -109,7 +112,7 @@ class DistributionDownloadPluginFuncTest extends AbstractGradleFuncTest {
109112
then:
110113
result.tasks.size() == 3
111114
result.output.count("Unpacking elasticsearch-${version}-linux-x86_64.tar.gz " +
112-
"using SymbolicLinkPreservingUntarTransform.") == 1
115+
"using SymbolicLinkPreservingUntarTransform") == 1
113116
}
114117

115118
private boolean assertExtractedDistroCreated(String relativePath) {

buildSrc/src/integTest/groovy/org/elasticsearch/gradle/ElasticsearchJavaPluginFuncTest.groovy

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,4 @@ class ElasticsearchJavaPluginFuncTest extends AbstractGradleFuncTest {
5858
then:
5959
gradleRunner("help").build()
6060
}
61-
62-
private File someJavaSource() {
63-
file("src/main/java/org/acme/SomeClass.java") << """
64-
package org.acme;
65-
public class SomeClass {}
66-
"""
67-
}
6861
}

buildSrc/src/integTest/groovy/org/elasticsearch/gradle/JdkDownloadPluginFuncTest.groovy

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ class JdkDownloadPluginFuncTest extends AbstractGradleFuncTest {
135135

136136
then:
137137
result.tasks.size() == 3
138-
result.output.count("Unpacking linux-12.0.2-x64.tar.gz using ${SymbolicLinkPreservingUntarTransform.simpleName}.") == 1
138+
result.output.count("Unpacking linux-12.0.2-x64.tar.gz using ${SymbolicLinkPreservingUntarTransform.simpleName}") == 1
139139

140140
where:
141141
platform | jdkVendor | jdkVersion | expectedJavaBin
@@ -177,18 +177,20 @@ class JdkDownloadPluginFuncTest extends AbstractGradleFuncTest {
177177

178178
def commonGradleUserHome = testProjectDir.newFolder().toString()
179179
// initial run
180-
gradleRunner('clean', 'getJdk', '-g', commonGradleUserHome).build()
180+
def firstResult = gradleRunner('clean', 'getJdk', '-i', '--warning-mode', 'all', '-g', commonGradleUserHome).build()
181+
// assert the output of an executed transform is shown
182+
assertOutputContains(firstResult.output, "Unpacking $expectedArchiveName using $transformType")
181183
// run against up-to-date transformations
182-
gradleRunner('clean', 'getJdk', '-i', '-g', commonGradleUserHome).build()
184+
gradleRunner('clean', 'getJdk', '-i', '--warning-mode', 'all', '-g', commonGradleUserHome).build()
183185
}
184186

185187
then:
186-
assertOutputContains(result.output, "Skipping $transformType")
188+
normalized(result.output).contains("Unpacking $expectedArchiveName using $transformType") == false
187189

188190
where:
189-
platform | transformType
190-
"linux" | SymbolicLinkPreservingUntarTransform.class.simpleName
191-
"windows" | UnzipTransform.class.simpleName
191+
platform | expectedArchiveName | transformType
192+
"linux" | "linux-12.0.2-x64.tar.gz" | SymbolicLinkPreservingUntarTransform.class.simpleName
193+
"windows" | "windows-12.0.2-x64.zip" | UnzipTransform.class.simpleName
192194
}
193195

194196
static boolean assertExtraction(String output, String javaBin) {
@@ -237,6 +239,7 @@ class JdkDownloadPluginFuncTest extends AbstractGradleFuncTest {
237239
if(repo.name == "jdk_repo_${jdkVendor}_${jdkVersion}") {
238240
repo.setUrl('${server.baseUrl()}')
239241
}
242+
allowInsecureProtocol = true
240243
}
241244
}"""
242245
}

buildSrc/src/integTest/groovy/org/elasticsearch/gradle/fixtures/AbstractGradleFuncTest.groovy

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,14 @@ abstract class AbstractGradleFuncTest extends Specification {
3535

3636
File settingsFile
3737
File buildFile
38+
File propertiesFile
3839

3940
def setup() {
4041
settingsFile = testProjectDir.newFile('settings.gradle')
4142
settingsFile << "rootProject.name = 'hello-world'\n"
4243
buildFile = testProjectDir.newFile('build.gradle')
44+
propertiesFile = testProjectDir.newFile('gradle.properties')
45+
propertiesFile << "org.gradle.java.installations.fromEnv=JAVA_HOME,RUNTIME_JAVA_HOME,JAVA15_HOME,JAVA14_HOME,JAVA13_HOME,JAVA12_HOME,JAVA11_HOME,JAVA8_HOME"
4346
}
4447

4548
GradleRunner gradleRunner(String... arguments) {
@@ -60,6 +63,10 @@ abstract class AbstractGradleFuncTest extends Specification {
6063
true
6164
}
6265

66+
def assertOutputMissing(String givenOutput, String expected) {
67+
assert normalized(givenOutput).contains(normalized(expected)) == false
68+
true
69+
}
6370
String normalized(String input) {
6471
String normalizedPathPrefix = testProjectDir.root.canonicalPath.replace('\\', '/')
6572
return input.readLines()

buildSrc/src/integTest/java/org/elasticsearch/gradle/BuildPluginIT.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,9 @@ private void runInsecureArtifactRepositoryTest(final String name, final String u
105105
.withProjectDir(tmpDir.getRoot())
106106
.withArguments("clean", "hello", "-s", "-i", "--warning-mode=all", "--scan")
107107
.withPluginClasspath()
108+
.forwardOutput()
108109
.buildAndFail();
110+
109111
assertOutputContains(
110112
result.getOutput(),
111113
"repository [" + name + "] on project with path [:] is not using a secure protocol for artifacts on [" + url + "]"

buildSrc/src/integTest/java/org/elasticsearch/gradle/precommit/TestingConventionsTasksIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public void testNamingConvention() {
6262
" * org.elasticsearch.gradle.testkit.LooksLikeATestWithoutNamingConvention2",
6363
" * org.elasticsearch.gradle.testkit.LooksLikeATestWithoutNamingConvention3"
6464
);
65-
assertOutputDoesNotContain(result.getOutput(), "LooksLikeTestsButAbstract");
65+
assertOutputMissing(result.getOutput(), "LooksLikeTestsButAbstract");
6666
}
6767

6868
public void testNoEmptyTasks() {

buildSrc/src/integTest/java/org/elasticsearch/gradle/precommit/ThirdPartyAuditTaskIT.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void testViolationFoundAndCompileOnlyIgnored() {
7474

7575
assertTaskFailed(result, ":absurd");
7676
assertOutputContains(result.getOutput(), "Classes with violations:", " * TestingIO", "> Audit of third party dependencies failed");
77-
assertOutputDoesNotContain(result.getOutput(), "Missing classes:");
77+
assertOutputMissing(result.getOutput(), "Missing classes:");
7878
assertNoDeprecationWarning(result);
7979
}
8080

@@ -96,7 +96,7 @@ public void testClassNotFoundAndCompileOnlyIgnored() {
9696
" * org.apache.logging.log4j.LogManager",
9797
"> Audit of third party dependencies failed"
9898
);
99-
assertOutputDoesNotContain(result.getOutput(), "Classes with violations:");
99+
assertOutputMissing(result.getOutput(), "Classes with violations:");
100100
assertNoDeprecationWarning(result);
101101
}
102102

@@ -118,7 +118,7 @@ public void testJarHellWithJDK() {
118118
" Jar Hell with the JDK:",
119119
" * java.lang.String"
120120
);
121-
assertOutputDoesNotContain(result.getOutput(), "Classes with violations:");
121+
assertOutputMissing(result.getOutput(), "Classes with violations:");
122122
assertNoDeprecationWarning(result);
123123
}
124124

buildSrc/src/integTest/resources/org/elasticsearch/gradle/internal/fake_git/remote/gradle.properties

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,7 @@
1919

2020
# forcing to use TLS1.2 to avoid failure in vault
2121
# see https://github.com/hashicorp/vault/issues/8750#issuecomment-631236121
22-
systemProp.jdk.tls.client.protocols=TLSv1.2
22+
systemProp.jdk.tls.client.protocols=TLSv1.2
23+
24+
# java homes resolved by environment variables
25+
org.gradle.java.installations.fromEnv=JAVA_HOME,RUNTIME_JAVA_HOME,JAVA15_HOME,JAVA14_HOME,JAVA13_HOME,JAVA12_HOME,JAVA11_HOME,JAVA8_HOME

buildSrc/src/main/java/org/elasticsearch/gradle/info/GlobalBuildInfoPlugin.java

Lines changed: 46 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
import org.gradle.api.Project;
2929
import org.gradle.api.logging.Logger;
3030
import org.gradle.api.logging.Logging;
31-
import org.gradle.api.model.ObjectFactory;
32-
import org.gradle.api.provider.Provider;
3331
import org.gradle.api.provider.ProviderFactory;
3432
import org.gradle.internal.jvm.Jvm;
35-
import org.gradle.jvm.toolchain.JavaInstallation;
36-
import org.gradle.jvm.toolchain.JavaInstallationRegistry;
33+
import org.gradle.internal.jvm.inspection.JvmInstallationMetadata;
34+
import org.gradle.internal.jvm.inspection.JvmMetadataDetector;
35+
import org.gradle.jvm.toolchain.internal.InstallationLocation;
36+
import org.gradle.jvm.toolchain.internal.SharedJavaInstallationRegistry;
3737
import org.gradle.util.GradleVersion;
3838

3939
import javax.inject.Inject;
@@ -50,7 +50,6 @@
5050
import java.nio.file.Paths;
5151
import java.time.ZoneOffset;
5252
import java.time.ZonedDateTime;
53-
import java.util.ArrayList;
5453
import java.util.Arrays;
5554
import java.util.HashMap;
5655
import java.util.Iterator;
@@ -68,14 +67,18 @@ public class GlobalBuildInfoPlugin implements Plugin<Project> {
6867
private static final String DEFAULT_VERSION_JAVA_FILE_PATH = "server/src/main/java/org/elasticsearch/Version.java";
6968
private static Integer _defaultParallel = null;
7069

71-
private final JavaInstallationRegistry javaInstallationRegistry;
72-
private final ObjectFactory objects;
70+
private final SharedJavaInstallationRegistry javaInstallationRegistry;
71+
private final JvmMetadataDetector metadataDetector;
7372
private final ProviderFactory providers;
7473

7574
@Inject
76-
public GlobalBuildInfoPlugin(JavaInstallationRegistry javaInstallationRegistry, ObjectFactory objects, ProviderFactory providers) {
75+
public GlobalBuildInfoPlugin(
76+
SharedJavaInstallationRegistry javaInstallationRegistry,
77+
JvmMetadataDetector metadataDetector,
78+
ProviderFactory providers
79+
) {
7780
this.javaInstallationRegistry = javaInstallationRegistry;
78-
this.objects = objects;
81+
this.metadataDetector = metadataDetector;
7982
this.providers = providers;
8083
}
8184

@@ -105,8 +108,8 @@ public void apply(Project project) {
105108
params.setRuntimeJavaHome(runtimeJavaHome);
106109
params.setRuntimeJavaVersion(determineJavaVersion("runtime java.home", runtimeJavaHome, minimumRuntimeVersion));
107110
params.setIsRutimeJavaHomeSet(Jvm.current().getJavaHome().equals(runtimeJavaHome) == false);
108-
params.setRuntimeJavaDetails(getJavaInstallation(runtimeJavaHome).getImplementationName());
109-
params.setJavaVersions(getAvailableJavaVersions(minimumCompilerVersion));
111+
params.setRuntimeJavaDetails(getJavaInstallation(runtimeJavaHome).getDisplayName());
112+
params.setJavaVersions(getAvailableJavaVersions());
110113
params.setMinimumCompilerVersion(minimumCompilerVersion);
111114
params.setMinimumRuntimeVersion(minimumRuntimeVersion);
112115
params.setGradleJavaVersion(Jvm.current().getJavaVersion());
@@ -146,20 +149,22 @@ private void logGlobalBuildInfo() {
146149
final String osVersion = System.getProperty("os.version");
147150
final String osArch = System.getProperty("os.arch");
148151
final Jvm gradleJvm = Jvm.current();
149-
final String gradleJvmDetails = getJavaInstallation(gradleJvm.getJavaHome()).getImplementationName();
150-
152+
JvmInstallationMetadata gradleJvmMetadata = metadataDetector.getMetadata(gradleJvm.getJavaHome());
153+
final String gradleJvmVendorDetails = gradleJvmMetadata.getVendor().getDisplayName();
151154
LOGGER.quiet("=======================================");
152155
LOGGER.quiet("Elasticsearch Build Hamster says Hello!");
153156
LOGGER.quiet(" Gradle Version : " + GradleVersion.current().getVersion());
154157
LOGGER.quiet(" OS Info : " + osName + " " + osVersion + " (" + osArch + ")");
155158
if (BuildParams.getIsRuntimeJavaHomeSet()) {
156-
String runtimeJvmDetails = getJavaInstallation(BuildParams.getRuntimeJavaHome()).getImplementationName();
157-
LOGGER.quiet(" Runtime JDK Version : " + BuildParams.getRuntimeJavaVersion() + " (" + runtimeJvmDetails + ")");
159+
final String runtimeJvmVendorDetails = metadataDetector.getMetadata(BuildParams.getRuntimeJavaHome())
160+
.getVendor()
161+
.getDisplayName();
162+
LOGGER.quiet(" Runtime JDK Version : " + BuildParams.getRuntimeJavaVersion() + " (" + runtimeJvmVendorDetails + ")");
158163
LOGGER.quiet(" Runtime java.home : " + BuildParams.getRuntimeJavaHome());
159-
LOGGER.quiet(" Gradle JDK Version : " + gradleJvm.getJavaVersion() + " (" + gradleJvmDetails + ")");
164+
LOGGER.quiet(" Gradle JDK Version : " + gradleJvm.getJavaVersion() + " (" + gradleJvmVendorDetails + ")");
160165
LOGGER.quiet(" Gradle java.home : " + gradleJvm.getJavaHome());
161166
} else {
162-
LOGGER.quiet(" JDK Version : " + gradleJvm.getJavaVersion() + " (" + gradleJvmDetails + ")");
167+
LOGGER.quiet(" JDK Version : " + gradleJvm.getJavaVersion() + " (" + gradleJvmVendorDetails + ")");
163168
LOGGER.quiet(" JAVA_HOME : " + gradleJvm.getJavaHome());
164169
}
165170
LOGGER.quiet(" Random Testing Seed : " + BuildParams.getTestSeed());
@@ -168,8 +173,8 @@ private void logGlobalBuildInfo() {
168173
}
169174

170175
private JavaVersion determineJavaVersion(String description, File javaHome, JavaVersion requiredVersion) {
171-
JavaInstallation installation = getJavaInstallation(javaHome);
172-
JavaVersion actualVersion = installation.getJavaVersion();
176+
InstallationLocation installation = getJavaInstallation(javaHome);
177+
JavaVersion actualVersion = metadataDetector.getMetadata(installation.getLocation()).getLanguageVersion();
173178
if (actualVersion.isCompatibleWith(requiredVersion) == false) {
174179
throwInvalidJavaHomeException(
175180
description,
@@ -182,46 +187,33 @@ private JavaVersion determineJavaVersion(String description, File javaHome, Java
182187
return actualVersion;
183188
}
184189

185-
private JavaInstallation getJavaInstallation(File javaHome) {
186-
JavaInstallation installation;
187-
if (isCurrentJavaHome(javaHome)) {
188-
installation = javaInstallationRegistry.getInstallationForCurrentVirtualMachine().get();
189-
} else {
190-
installation = javaInstallationRegistry.installationForDirectory(objects.directoryProperty().fileValue(javaHome)).get();
191-
}
192-
193-
return installation;
190+
private InstallationLocation getJavaInstallation(File javaHome) {
191+
return javaInstallationRegistry.listInstallations()
192+
.stream()
193+
.filter(installationLocation -> isSameFile(javaHome, installationLocation))
194+
.findFirst()
195+
.get();
194196
}
195197

196-
private List<JavaHome> getAvailableJavaVersions(JavaVersion minimumCompilerVersion) {
197-
final List<JavaHome> javaVersions = new ArrayList<>();
198-
for (int v = 8; v <= Integer.parseInt(minimumCompilerVersion.getMajorVersion()); v++) {
199-
int version = v;
200-
String javaHomeEnvVarName = getJavaHomeEnvVarName(Integer.toString(version));
201-
if (System.getenv(javaHomeEnvVarName) != null) {
202-
File javaHomeDirectory = new File(findJavaHome(Integer.toString(version)));
203-
Provider<JavaInstallation> javaInstallationProvider = javaInstallationRegistry.installationForDirectory(
204-
objects.directoryProperty().fileValue(javaHomeDirectory)
205-
);
206-
JavaHome javaHome = JavaHome.of(version, providers.provider(() -> {
207-
int actualVersion = Integer.parseInt(javaInstallationProvider.get().getJavaVersion().getMajorVersion());
208-
if (actualVersion != version) {
209-
throwInvalidJavaHomeException("env variable " + javaHomeEnvVarName, javaHomeDirectory, version, actualVersion);
210-
}
211-
return javaHomeDirectory;
212-
}));
213-
javaVersions.add(javaHome);
214-
}
198+
private boolean isSameFile(File javaHome, InstallationLocation installationLocation) {
199+
try {
200+
return Files.isSameFile(installationLocation.getLocation().toPath(), javaHome.toPath());
201+
} catch (IOException ioException) {
202+
throw new UncheckedIOException(ioException);
215203
}
216-
return javaVersions;
217204
}
218205

219-
private static boolean isCurrentJavaHome(File javaHome) {
220-
try {
221-
return Files.isSameFile(javaHome.toPath(), Jvm.current().getJavaHome().toPath());
222-
} catch (IOException e) {
223-
throw new UncheckedIOException(e);
224-
}
206+
/**
207+
* We resolve all available java versions using auto detected by gradles tool chain
208+
* To make transition more reliable we only take env var provided installations into account for now
209+
*/
210+
private List<JavaHome> getAvailableJavaVersions() {
211+
return javaInstallationRegistry.listInstallations().stream().map(installationLocation -> {
212+
File installationDir = installationLocation.getLocation();
213+
JvmInstallationMetadata metadata = metadataDetector.getMetadata(installationDir);
214+
int actualVersion = Integer.parseInt(metadata.getLanguageVersion().getMajorVersion());
215+
return JavaHome.of(actualVersion, providers.provider(() -> installationDir));
216+
}).collect(Collectors.toList());
225217
}
226218

227219
private static String getTestSeed() {

buildSrc/src/main/java/org/elasticsearch/gradle/precommit/JarHellPrecommitPlugin.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ public class JarHellPrecommitPlugin extends PrecommitPlugin {
3232
public TaskProvider<? extends Task> createTask(Project project) {
3333
Configuration jarHellConfig = project.getConfigurations().create("jarHell");
3434
if (BuildParams.isInternal() && project.getPath().equals(":libs:elasticsearch-core") == false) {
35+
// ideally we would configure this as a default dependency. But Default dependencies do not work correctly
36+
// with gradle project dependencies as they're resolved to late in the build and don't setup according task
37+
// dependencies properly
3538
project.getDependencies().add("jarHell", project.project(":libs:elasticsearch-core"));
3639
}
3740
TaskProvider<JarHellTask> jarHell = project.getTasks().register("jarHell", JarHellTask.class);

buildSrc/src/main/java/org/elasticsearch/gradle/transform/SymbolicLinkPreservingUntarTransform.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
2323
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
2424
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
25-
import org.gradle.api.logging.Logging;
2625

2726
import java.io.File;
2827
import java.io.FileInputStream;
@@ -40,8 +39,6 @@ public abstract class SymbolicLinkPreservingUntarTransform implements UnpackTran
4039
private static final Path CURRENT_DIR_PATH = Paths.get(".");
4140

4241
public void unpack(File tarFile, File targetDir) throws IOException {
43-
Logging.getLogger(SymbolicLinkPreservingUntarTransform.class)
44-
.info("Unpacking " + tarFile.getName() + " using " + SymbolicLinkPreservingUntarTransform.class.getSimpleName() + ".");
4542
Function<String, Path> pathModifier = pathResolver();
4643

4744
TarArchiveInputStream tar = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream(tarFile)));

0 commit comments

Comments
 (0)