Skip to content

Commit fad8c19

Browse files
authored
Make BWC build logic configuration cache compatible (#109354)
More refactoring towards configuration cache compatibility
1 parent 84bc73b commit fad8c19

File tree

5 files changed

+99
-36
lines changed

5 files changed

+99
-36
lines changed

build-tools-internal/src/main/groovy/elasticsearch.bwc-test.gradle

+4-3
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ tasks.register("bwcTest") {
3333

3434
plugins.withType(ElasticsearchTestBasePlugin) {
3535
tasks.withType(Test).matching { it.name ==~ /v[0-9\.]+#.*/ }.configureEach {
36-
onlyIf("BWC tests enabled") { project.bwc_tests_enabled }
36+
boolean bwcEnabled = project.bwc_tests_enabled
37+
onlyIf("BWC tests enabled") { bwcEnabled }
3738
nonInputProperties.systemProperty 'tests.bwc', 'true'
3839
}
3940
}
@@ -50,5 +51,5 @@ plugins.withType(InternalJavaRestTestPlugin) {
5051
}
5152
}
5253

53-
tasks.matching { it.name.equals("check") }.configureEach {dependsOn(bwcTestSnapshots) }
54-
tasks.matching { it.name.equals("test") }.configureEach {enabled = false}
54+
tasks.matching { it.name.equals("check") }.configureEach { dependsOn(bwcTestSnapshots) }
55+
tasks.matching { it.name.equals("test") }.configureEach { enabled = false }

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BwcSetupExtension.java

+54-18
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import org.gradle.api.model.ObjectFactory;
2121
import org.gradle.api.provider.Property;
2222
import org.gradle.api.provider.Provider;
23+
import org.gradle.api.provider.ProviderFactory;
24+
import org.gradle.api.provider.ValueSource;
25+
import org.gradle.api.provider.ValueSourceParameters;
2326
import org.gradle.api.tasks.TaskProvider;
2427
import org.gradle.jvm.toolchain.JavaLanguageVersion;
2528
import org.gradle.jvm.toolchain.JavaToolchainService;
@@ -41,6 +44,7 @@ public class BwcSetupExtension {
4144
private static final Version BUILD_TOOL_MINIMUM_VERSION = Version.fromString("7.14.0");
4245
private final Project project;
4346
private final ObjectFactory objectFactory;
47+
private final ProviderFactory providerFactory;
4448
private final JavaToolchainService toolChainService;
4549
private final Provider<BwcVersions.UnreleasedVersionInfo> unreleasedVersionInfo;
4650

@@ -49,12 +53,14 @@ public class BwcSetupExtension {
4953
public BwcSetupExtension(
5054
Project project,
5155
ObjectFactory objectFactory,
56+
ProviderFactory providerFactory,
5257
JavaToolchainService toolChainService,
5358
Provider<BwcVersions.UnreleasedVersionInfo> unreleasedVersionInfo,
5459
Provider<File> checkoutDir
5560
) {
5661
this.project = project;
5762
this.objectFactory = objectFactory;
63+
this.providerFactory = providerFactory;
5864
this.toolChainService = toolChainService;
5965
this.unreleasedVersionInfo = unreleasedVersionInfo;
6066
this.checkoutDir = checkoutDir;
@@ -65,11 +71,26 @@ TaskProvider<LoggedExec> bwcTask(String name, Action<LoggedExec> configuration)
6571
}
6672

6773
TaskProvider<LoggedExec> bwcTask(String name, Action<LoggedExec> configuration, boolean useUniqueUserHome) {
68-
return createRunBwcGradleTask(project, name, configuration, useUniqueUserHome);
74+
return createRunBwcGradleTask(
75+
project,
76+
checkoutDir,
77+
providerFactory,
78+
unreleasedVersionInfo,
79+
objectFactory,
80+
toolChainService,
81+
name,
82+
configuration,
83+
useUniqueUserHome
84+
);
6985
}
7086

71-
private TaskProvider<LoggedExec> createRunBwcGradleTask(
87+
private static TaskProvider<LoggedExec> createRunBwcGradleTask(
7288
Project project,
89+
Provider<File> checkoutDir,
90+
ProviderFactory providerFactory,
91+
Provider<BwcVersions.UnreleasedVersionInfo> unreleasedVersionInfo,
92+
ObjectFactory objectFactory,
93+
JavaToolchainService toolChainService,
7394
String name,
7495
Action<LoggedExec> configAction,
7596
boolean useUniqueUserHome
@@ -78,10 +99,10 @@ private TaskProvider<LoggedExec> createRunBwcGradleTask(
7899
loggedExec.dependsOn("checkoutBwcBranch");
79100
loggedExec.getWorkingDir().set(checkoutDir.get());
80101

81-
loggedExec.getEnvironment().put("JAVA_HOME", unreleasedVersionInfo.zip(checkoutDir, (version, checkoutDir) -> {
82-
String minimumCompilerVersion = readFromFile(new File(checkoutDir, minimumCompilerVersionPath(version.version())));
83-
return getJavaHome(Integer.parseInt(minimumCompilerVersion));
84-
}));
102+
loggedExec.getNonTrackedEnvironment().put("JAVA_HOME", providerFactory.of(JavaHomeValueSource.class, spec -> {
103+
spec.getParameters().getVersion().set(unreleasedVersionInfo.map(it -> it.version()));
104+
spec.getParameters().getCheckoutDir().set(checkoutDir);
105+
}).flatMap(s -> getJavaHome(objectFactory, toolChainService, Integer.parseInt(s))));
85106

86107
if (BuildParams.isCi() && OS.current() != OS.WINDOWS) {
87108
// TODO: Disabled for now until we can figure out why files are getting corrupted
@@ -137,10 +158,13 @@ private TaskProvider<LoggedExec> createRunBwcGradleTask(
137158
});
138159
}
139160

140-
private String minimumCompilerVersionPath(Version bwcVersion) {
141-
return (bwcVersion.onOrAfter(BUILD_TOOL_MINIMUM_VERSION))
142-
? "build-tools-internal/" + MINIMUM_COMPILER_VERSION_PATH
143-
: "buildSrc/" + MINIMUM_COMPILER_VERSION_PATH;
161+
/** A convenience method for getting java home for a version of java and requiring that version for the given task to execute */
162+
private static Provider<String> getJavaHome(ObjectFactory objectFactory, JavaToolchainService toolChainService, final int version) {
163+
Property<JavaLanguageVersion> value = objectFactory.property(JavaLanguageVersion.class).value(JavaLanguageVersion.of(version));
164+
return toolChainService.launcherFor(javaToolchainSpec -> {
165+
javaToolchainSpec.getLanguageVersion().value(value);
166+
javaToolchainSpec.getVendor().set(JvmVendorSpec.ORACLE);
167+
}).map(launcher -> launcher.getMetadata().getInstallationPath().getAsFile().getAbsolutePath());
144168
}
145169

146170
private static String readFromFile(File file) {
@@ -151,13 +175,25 @@ private static String readFromFile(File file) {
151175
}
152176
}
153177

154-
/** A convenience method for getting java home for a version of java and requiring that version for the given task to execute */
155-
public String getJavaHome(final int version) {
156-
Property<JavaLanguageVersion> value = objectFactory.property(JavaLanguageVersion.class).value(JavaLanguageVersion.of(version));
157-
return toolChainService.launcherFor(javaToolchainSpec -> {
158-
javaToolchainSpec.getLanguageVersion().value(value);
159-
javaToolchainSpec.getVendor().set(JvmVendorSpec.ORACLE);
160-
}).get().getMetadata().getInstallationPath().getAsFile().getAbsolutePath();
161-
}
178+
public static abstract class JavaHomeValueSource implements ValueSource<String, JavaHomeValueSource.Params> {
179+
180+
private String minimumCompilerVersionPath(Version bwcVersion) {
181+
return (bwcVersion.onOrAfter(BUILD_TOOL_MINIMUM_VERSION))
182+
? "build-tools-internal/" + MINIMUM_COMPILER_VERSION_PATH
183+
: "buildSrc/" + MINIMUM_COMPILER_VERSION_PATH;
184+
}
162185

186+
@Override
187+
public String obtain() {
188+
return readFromFile(
189+
new File(getParameters().getCheckoutDir().get(), minimumCompilerVersionPath(getParameters().getVersion().get()))
190+
);
191+
}
192+
193+
public interface Params extends ValueSourceParameters {
194+
Property<Version> getVersion();
195+
196+
Property<File> getCheckoutDir();
197+
}
198+
}
163199
}

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/InternalBwcGitPlugin.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,6 @@ public void execute(Task task) {
9393
String remoteRepo = remote.get();
9494
// for testing only we can override the base remote url
9595
String remoteRepoUrl = providerFactory.systemProperty("testRemoteRepo")
96-
.orElse(
97-
providerFactory.provider(
98-
() -> addRemote.getExtensions().getExtraProperties().has("remote")
99-
? addRemote.getExtensions().getExtraProperties().get("remote").toString()
100-
: null
101-
)
102-
)
10396
.getOrElse("https://github.com/" + remoteRepo + "/" + rootProjectName);
10497
spec.commandLine("git", "remote", "add", remoteRepo, remoteRepoUrl);
10598
});
@@ -213,6 +206,7 @@ private String maybeAlignedRefSpec(Logger logger, String defaultRefSpec) {
213206

214207
private void writeFile(File file, String content) {
215208
try {
209+
file.getParentFile().mkdirs();
216210
Files.writeString(file.toPath(), content, CREATE, TRUNCATE_EXISTING);
217211
} catch (IOException e) {
218212
throw new UncheckedIOException(e);

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/InternalDistributionBwcSetupPlugin.java

+35-7
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.gradle.api.Plugin;
1717
import org.gradle.api.Project;
1818
import org.gradle.api.Task;
19+
import org.gradle.api.file.ProjectLayout;
1920
import org.gradle.api.model.ObjectFactory;
2021
import org.gradle.api.plugins.JvmToolchainsPlugin;
2122
import org.gradle.api.provider.Provider;
@@ -63,15 +64,39 @@ public void apply(Project project) {
6364
project.getPlugins().apply(JvmToolchainsPlugin.class);
6465
toolChainService = project.getExtensions().getByType(JavaToolchainService.class);
6566
BuildParams.getBwcVersions().forPreviousUnreleased((BwcVersions.UnreleasedVersionInfo unreleasedVersion) -> {
66-
configureBwcProject(project.project(unreleasedVersion.gradleProjectPath()), unreleasedVersion);
67+
configureBwcProject(
68+
project.project(unreleasedVersion.gradleProjectPath()),
69+
unreleasedVersion,
70+
providerFactory,
71+
objectFactory,
72+
toolChainService
73+
);
6774
});
6875
}
6976

70-
private void configureBwcProject(Project project, BwcVersions.UnreleasedVersionInfo versionInfo) {
77+
private static void configureBwcProject(
78+
Project project,
79+
BwcVersions.UnreleasedVersionInfo versionInfo,
80+
ProviderFactory providerFactory,
81+
ObjectFactory objectFactory,
82+
JavaToolchainService toolChainService
83+
) {
84+
ProjectLayout layout = project.getLayout();
7185
Provider<BwcVersions.UnreleasedVersionInfo> versionInfoProvider = providerFactory.provider(() -> versionInfo);
72-
Provider<File> checkoutDir = versionInfoProvider.map(info -> new File(project.getBuildDir(), "bwc/checkout-" + info.branch()));
86+
Provider<File> checkoutDir = versionInfoProvider.map(
87+
info -> new File(layout.getBuildDirectory().get().getAsFile(), "bwc/checkout-" + info.branch())
88+
);
7389
BwcSetupExtension bwcSetupExtension = project.getExtensions()
74-
.create("bwcSetup", BwcSetupExtension.class, project, objectFactory, toolChainService, versionInfoProvider, checkoutDir);
90+
.create(
91+
"bwcSetup",
92+
BwcSetupExtension.class,
93+
project,
94+
objectFactory,
95+
providerFactory,
96+
toolChainService,
97+
versionInfoProvider,
98+
checkoutDir
99+
);
75100
BwcGitExtension gitExtension = project.getPlugins().apply(InternalBwcGitPlugin.class).getGitExtension();
76101
Provider<Version> bwcVersion = versionInfoProvider.map(info -> info.version());
77102
gitExtension.setBwcVersion(versionInfoProvider.map(info -> info.version()));
@@ -157,7 +182,7 @@ private void configureBwcProject(Project project, BwcVersions.UnreleasedVersionI
157182
}
158183
}
159184

160-
private void registerBwcDistributionArtifacts(Project bwcProject, DistributionProject distributionProject) {
185+
private static void registerBwcDistributionArtifacts(Project bwcProject, DistributionProject distributionProject) {
161186
String projectName = distributionProject.name;
162187
String buildBwcTask = buildBwcTaskName(projectName);
163188

@@ -174,7 +199,11 @@ private void registerBwcDistributionArtifacts(Project bwcProject, DistributionPr
174199
}
175200
}
176201

177-
private void registerDistributionArchiveArtifact(Project bwcProject, DistributionProject distributionProject, String buildBwcTask) {
202+
private static void registerDistributionArchiveArtifact(
203+
Project bwcProject,
204+
DistributionProject distributionProject,
205+
String buildBwcTask
206+
) {
178207
File distFile = distributionProject.expectedBuildArtifact.distFile;
179208
String artifactFileName = distFile.getName();
180209
String artifactName = artifactFileName.contains("oss") ? "elasticsearch-oss" : "elasticsearch";
@@ -363,5 +392,4 @@ private static class DistributionProjectArtifact {
363392
this.expandedDistDir = expandedDistDir;
364393
}
365394
}
366-
367395
}

build-tools/src/main/java/org/elasticsearch/gradle/LoggedExec.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ public abstract class LoggedExec extends DefaultTask implements FileSystemOperat
6565
@Optional
6666
abstract public MapProperty<String, String> getEnvironment();
6767

68+
@Internal
69+
abstract public MapProperty<String, String> getNonTrackedEnvironment();
70+
6871
@Input
6972
abstract public Property<String> getExecutable();
7073

@@ -139,7 +142,8 @@ public void run() {
139142
execSpec.setStandardOutput(finalOutputStream);
140143
execSpec.setErrorOutput(finalOutputStream);
141144
execSpec.setExecutable(getExecutable().get());
142-
execSpec.setEnvironment(getEnvironment().get());
145+
execSpec.environment(getEnvironment().get());
146+
execSpec.environment(getNonTrackedEnvironment().get());
143147
if (getArgs().isPresent()) {
144148
execSpec.setArgs(getArgs().get());
145149
}

0 commit comments

Comments
 (0)