Skip to content

Commit 2e444e7

Browse files
committed
Avoid running docker-compose tasks concurrently in CI (elastic#51439)
(cherry picked from commit a621b98)
1 parent b14b803 commit 2e444e7

File tree

2 files changed

+32
-14
lines changed

2 files changed

+32
-14
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package org.elasticsearch.gradle.testfixtures;
2+
3+
import org.gradle.api.services.BuildService;
4+
import org.gradle.api.services.BuildServiceParameters;
5+
6+
public abstract class DockerComposeThrottle implements BuildService<BuildServiceParameters.None> {}

buildSrc/src/main/java/org/elasticsearch/gradle/testfixtures/TestFixturesPlugin.java

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.avast.gradle.dockercompose.tasks.ComposeUp;
2525
import org.elasticsearch.gradle.OS;
2626
import org.elasticsearch.gradle.SystemPropertyCommandLineArgumentProvider;
27+
import org.elasticsearch.gradle.info.BuildParams;
2728
import org.elasticsearch.gradle.precommit.TestingConventionsTasks;
2829
import org.gradle.api.Action;
2930
import org.gradle.api.DefaultTask;
@@ -32,6 +33,7 @@
3233
import org.gradle.api.Task;
3334
import org.gradle.api.plugins.BasePlugin;
3435
import org.gradle.api.plugins.ExtraPropertiesExtension;
36+
import org.gradle.api.provider.Provider;
3537
import org.gradle.api.tasks.TaskContainer;
3638
import org.gradle.api.tasks.testing.Test;
3739

@@ -44,13 +46,17 @@
4446

4547
public class TestFixturesPlugin implements Plugin<Project> {
4648

49+
private static final String DOCKER_COMPOSE_THROTTLE = "dockerComposeThrottle";
4750
static final String DOCKER_COMPOSE_YML = "docker-compose.yml";
4851

4952
@Override
5053
public void apply(Project project) {
5154
TaskContainer tasks = project.getTasks();
5255

5356
TestFixtureExtension extension = project.getExtensions().create("testFixtures", TestFixtureExtension.class, project);
57+
Provider<DockerComposeThrottle> dockerComposeThrottle = project.getGradle()
58+
.getSharedServices()
59+
.registerIfAbsent(DOCKER_COMPOSE_THROTTLE, DockerComposeThrottle.class, spec -> spec.getMaxParallelUsages().set(1));
5460

5561
ExtraPropertiesExtension ext = project.getExtensions().getByType(ExtraPropertiesExtension.class);
5662
File testfixturesDir = project.file("testfixtures_shared");
@@ -81,20 +87,26 @@ public void apply(Project project) {
8187
buildFixture.setEnabled(false);
8288
pullFixture.setEnabled(false);
8389
} else {
84-
project.apply(spec -> spec.plugin(BasePlugin.class));
85-
project.apply(spec -> spec.plugin(DockerComposePlugin.class));
90+
project.getPluginManager().apply(BasePlugin.class);
91+
project.getPluginManager().apply(DockerComposePlugin.class);
8692
ComposeExtension composeExtension = project.getExtensions().getByType(ComposeExtension.class);
8793
composeExtension.setUseComposeFiles(Collections.singletonList(DOCKER_COMPOSE_YML));
8894
composeExtension.setRemoveContainers(true);
8995
composeExtension.setExecutable(
9096
project.file("/usr/local/bin/docker-compose").exists() ? "/usr/local/bin/docker-compose" : "/usr/bin/docker-compose"
9197
);
9298

93-
buildFixture.dependsOn(tasks.getByName("composeUp"));
94-
pullFixture.dependsOn(tasks.getByName("composePull"));
95-
tasks.getByName("composeUp").mustRunAfter(preProcessFixture);
96-
tasks.getByName("composePull").mustRunAfter(preProcessFixture);
97-
tasks.getByName("composeDown").doLast((task) -> { project.delete(testfixturesDir); });
99+
buildFixture.dependsOn(tasks.named("composeUp"));
100+
pullFixture.dependsOn(tasks.named("composePull"));
101+
tasks.named("composeUp").configure(t -> {
102+
// Avoid running docker-compose tasks in parallel in CI due to some issues on certain Linux distributions
103+
if (BuildParams.isCi()) {
104+
t.usesService(dockerComposeThrottle);
105+
}
106+
t.mustRunAfter(preProcessFixture);
107+
});
108+
tasks.named("composePull").configure(t -> t.mustRunAfter(preProcessFixture));
109+
tasks.named("composeDown").configure(t -> t.doLast(t2 -> project.delete(testfixturesDir)));
98110

99111
configureServiceInfoForTask(
100112
postProcessFixture,
@@ -147,13 +159,13 @@ public void apply(Project project) {
147159
}
148160

149161
private void conditionTaskByType(TaskContainer tasks, TestFixtureExtension extension, Class<? extends DefaultTask> taskClass) {
150-
tasks.withType(
151-
taskClass,
152-
task -> task.onlyIf(
153-
spec -> extension.fixtures.stream()
154-
.anyMatch(fixtureProject -> fixtureProject.getTasks().getByName("buildFixture").getEnabled() == false) == false
155-
)
156-
);
162+
tasks.withType(taskClass)
163+
.configureEach(
164+
task -> task.onlyIf(
165+
spec -> extension.fixtures.stream()
166+
.anyMatch(fixtureProject -> fixtureProject.getTasks().getByName("buildFixture").getEnabled() == false) == false
167+
)
168+
);
157169
}
158170

159171
private void configureServiceInfoForTask(

0 commit comments

Comments
 (0)