diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/docker/ShellRetry.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/docker/ShellRetry.java index 5286a3af24619..e3193f7aea5d0 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/docker/ShellRetry.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/docker/ShellRetry.java @@ -8,6 +8,9 @@ package org.elasticsearch.gradle.internal.docker; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + /** * The methods in this class take a shell command and wrap it in retry logic, so that our * Docker builds can be more robust in the face of transient errors e.g. network issues. @@ -20,7 +23,11 @@ static String loop(String name, String command) { static String loop(String name, String command, int indentSize, String exitKeyword) { String indent = " ".repeat(indentSize); - StringBuilder commandWithRetry = new StringBuilder("for iter in {1..10}; do \n"); + // bash understands the `{1..10}` syntax, but other shells don't e.g. the default in Alpine Linux. + // We therefore use an explicit sequence. + String retrySequence = IntStream.rangeClosed(1, 10).mapToObj(String::valueOf).collect(Collectors.joining(" ")); + + StringBuilder commandWithRetry = new StringBuilder("for iter in " + retrySequence + "; do \n"); commandWithRetry.append(indent).append(" ").append(command).append(" && \n"); commandWithRetry.append(indent).append(" exit_code=0 && break || \n"); commandWithRetry.append(indent); diff --git a/distribution/docker/build.gradle b/distribution/docker/build.gradle index 3b83bd1438415..dc9e4544791c6 100644 --- a/distribution/docker/build.gradle +++ b/distribution/docker/build.gradle @@ -221,6 +221,10 @@ tasks.named("composePull").configure { enabled = false } +tasks.named("composeUp").configure { + dependsOn tasks.named("preProcessFixture") +} + void addBuildDockerContextTask(Architecture architecture, DockerBase base) { String configDirectory = base == DockerBase.IRON_BANK ? 'scripts' : 'config' String arch = architecture == Architecture.AARCH64 ? '-aarch64' : ''