Skip to content

Commit 30a9a76

Browse files
authored
Make git revision loading lazy (#45358)
This commit makes the gitRevision property a lazy loaded value by returning an Object implementing toString(). The Dockerfile template is also changed to use groovy templates instead of the mavenfilter hack, so converting to String will not happen until runtime.
1 parent fb508db commit 30a9a76

File tree

3 files changed

+41
-23
lines changed

3 files changed

+41
-23
lines changed

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

+32-15
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.HashMap;
2424
import java.util.List;
2525
import java.util.Map;
26+
import java.util.concurrent.atomic.AtomicReference;
2627
import java.util.stream.Collectors;
2728

2829
import static java.nio.charset.StandardCharsets.UTF_8;
@@ -45,6 +46,8 @@ public void apply(Project project) {
4546
File compilerJavaHome = findCompilerJavaHome();
4647
File runtimeJavaHome = findRuntimeJavaHome(compilerJavaHome);
4748

49+
Object gitRevisionResolver = createGitRevisionResolver(project);
50+
4851
final List<JavaHome> javaVersions = new ArrayList<>();
4952
for (int version = 8; version <= Integer.parseInt(minimumCompilerVersion.getMajorVersion()); version++) {
5053
if (System.getenv(getJavaHomeEnvVarName(Integer.toString(version))) != null) {
@@ -92,7 +95,7 @@ public void apply(Project project) {
9295
ext.set("minimumCompilerVersion", minimumCompilerVersion);
9396
ext.set("minimumRuntimeVersion", minimumRuntimeVersion);
9497
ext.set("gradleJavaVersion", Jvm.current().getJavaVersion());
95-
ext.set("gitRevision", gitRevision(project));
98+
ext.set("gitRevision", gitRevisionResolver);
9699
ext.set("buildDate", ZonedDateTime.now(ZoneOffset.UTC));
97100
});
98101
}
@@ -203,21 +206,35 @@ private static int findDefaultParallel(Project project) {
203206
return _defaultParallel;
204207
}
205208

206-
private String gitRevision(final Project project) {
207-
final ByteArrayOutputStream stdout = new ByteArrayOutputStream();
208-
final ByteArrayOutputStream stderr = new ByteArrayOutputStream();
209-
final ExecResult result = project.exec(spec -> {
210-
spec.setExecutable("git");
211-
spec.setArgs(Arrays.asList("rev-parse", "HEAD"));
212-
spec.setStandardOutput(stdout);
213-
spec.setErrorOutput(stderr);
214-
spec.setIgnoreExitValue(true);
215-
});
209+
private Object createGitRevisionResolver(final Project project) {
210+
return new Object() {
211+
private final AtomicReference<String> gitRevision = new AtomicReference<>();
212+
213+
@Override
214+
public String toString() {
215+
if (gitRevision.get() == null) {
216+
final ByteArrayOutputStream stdout = new ByteArrayOutputStream();
217+
final ByteArrayOutputStream stderr = new ByteArrayOutputStream();
218+
final ExecResult result = project.exec(spec -> {
219+
spec.setExecutable("git");
220+
spec.setArgs(Arrays.asList("rev-parse", "HEAD"));
221+
spec.setStandardOutput(stdout);
222+
spec.setErrorOutput(stderr);
223+
spec.setIgnoreExitValue(true);
224+
});
225+
226+
final String revision;
227+
if (result.getExitValue() != 0) {
228+
revision = "unknown";
229+
} else {
230+
revision = stdout.toString(UTF_8).trim();
231+
}
232+
this.gitRevision.compareAndSet(null, revision);
233+
}
234+
return gitRevision.get();
235+
}
236+
};
216237

217-
if (result.getExitValue() != 0) {
218-
return "unknown";
219-
}
220-
return stdout.toString(UTF_8).trim();
221238
}
222239

223240
}

distribution/docker/build.gradle

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import org.elasticsearch.gradle.BuildPlugin
22
import org.elasticsearch.gradle.LoggedExec
3-
import org.elasticsearch.gradle.MavenFilteringHack
43
import org.elasticsearch.gradle.VersionProperties
5-
import org.elasticsearch.gradle.testfixtures.TestFixturesPlugin
4+
import org.elasticsearch.gradle.testfixtures.TestFixturesPlugin
65

76
apply plugin: 'elasticsearch.standalone-rest-test'
87
apply plugin: 'elasticsearch.test.fixtures'
@@ -58,15 +57,17 @@ project.ext {
5857
}
5958

6059
from(project.projectDir.toPath().resolve("src/docker/Dockerfile")) {
61-
MavenFilteringHack.filter(it, expansions(oss, local))
60+
expand(expansions(oss, local))
6261
}
6362
}
6463
}
6564
}
6665

6766
void addCopyDockerContextTask(final boolean oss) {
6867
task(taskName("copy", oss, "DockerContext"), type: Sync) {
69-
inputs.properties(expansions(oss, true))
68+
expansions(oss, true).each { k, v ->
69+
inputs.property(k, { v.toString() })
70+
}
7071
into files(oss)
7172

7273
with dockerBuildContext(oss, true)

distribution/docker/src/docker/Dockerfile

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
FROM centos:7 AS builder
1515

16-
ENV PATH /usr/share/elasticsearch/bin:$PATH
16+
ENV PATH /usr/share/elasticsearch/bin:\$PATH
1717

1818
RUN groupadd -g 1000 elasticsearch && \
1919
adduser -u 1000 -g 1000 -d /usr/share/elasticsearch elasticsearch
@@ -41,8 +41,8 @@ ENV ELASTIC_CONTAINER true
4141

4242
RUN for iter in {1..10}; do yum update -y && \
4343
yum install -y nc && \
44-
yum clean all && exit_code=0 && break || exit_code=$? && echo "yum error: retry $iter in 10s" && sleep 10; done; \
45-
(exit $exit_code)
44+
yum clean all && exit_code=0 && break || exit_code=\$? && echo "yum error: retry \$iter in 10s" && sleep 10; done; \
45+
(exit \$exit_code)
4646

4747
RUN groupadd -g 1000 elasticsearch && \
4848
adduser -u 1000 -g 1000 -G 0 -d /usr/share/elasticsearch elasticsearch && \
@@ -57,7 +57,7 @@ COPY --from=builder --chown=1000:0 /usr/share/elasticsearch /usr/share/elasticse
5757
# REF: https://github.com/elastic/elasticsearch-docker/issues/171
5858
RUN ln -sf /etc/pki/ca-trust/extracted/java/cacerts /usr/share/elasticsearch/jdk/lib/security/cacerts
5959

60-
ENV PATH /usr/share/elasticsearch/bin:$PATH
60+
ENV PATH /usr/share/elasticsearch/bin:\$PATH
6161

6262
COPY --chown=1000:0 bin/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
6363

0 commit comments

Comments
 (0)