Skip to content

Commit f2dff76

Browse files
committed
Fix for configuration cache
1 parent b923f81 commit f2dff76

2 files changed

Lines changed: 47 additions & 3 deletions

File tree

src/functTest/groovy/com/bmuschko/gradle/docker/tasks/container/DockerInspectExecContainerFunctionalTest.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class DockerInspectExecContainerFunctionalTest extends AbstractGroovyDslFunction
2020
task inspectExec(type: DockerInspectExecContainer) {
2121
dependsOn execContainer
2222
finalizedBy removeContainer
23-
targetExecId { execContainer.execIds.get()[0] }
23+
targetExecId execContainer.execIdsProvider.map { it[0] }
2424
}
2525
"""
2626
buildFile << containerUsage(containerInspectExecutionTask)
@@ -44,7 +44,7 @@ class DockerInspectExecContainerFunctionalTest extends AbstractGroovyDslFunction
4444
task inspectExec(type: DockerInspectExecContainer) {
4545
dependsOn execContainer
4646
finalizedBy removeContainer
47-
targetExecId { execContainer.execIds.get()[0] }
47+
targetExecId execContainer.execIdsProvider.map { it[0] }
4848
onNext { r ->
4949
if(r.exitCode) {
5050
throw new GradleException("Docker container exec failed with exit code: " + r.exitCode)

src/main/java/com/bmuschko/gradle/docker/tasks/container/DockerExecContainer.java

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,27 @@
2323
import com.github.dockerjava.api.model.Frame;
2424
import org.gradle.api.Action;
2525
import org.gradle.api.GradleException;
26+
import org.gradle.api.file.RegularFileProperty;
27+
import org.gradle.api.model.ObjectFactory;
2628
import org.gradle.api.provider.ListProperty;
2729
import org.gradle.api.provider.Property;
30+
import org.gradle.api.provider.Provider;
2831
import org.gradle.api.tasks.Input;
2932
import org.gradle.api.tasks.Internal;
3033
import org.gradle.api.tasks.Nested;
3134
import org.gradle.api.tasks.Optional;
35+
import org.gradle.api.tasks.OutputFile;
3236
import org.gradle.internal.logging.progress.ProgressLogger;
3337

38+
import javax.inject.Inject;
3439
import java.io.IOException;
3540
import java.io.UncheckedIOException;
41+
import java.nio.file.Files;
3642
import java.util.ArrayList;
3743
import java.util.Arrays;
3844
import java.util.List;
3945
import java.util.concurrent.TimeUnit;
46+
import java.util.stream.Collectors;
4047

4148
import static com.bmuschko.gradle.docker.internal.IOUtils.getProgressLogger;
4249

@@ -100,6 +107,16 @@ public void setExecProbe(ExecProbe execProbe) {
100107
this.execProbe = execProbe;
101108
}
102109

110+
@OutputFile
111+
public final RegularFileProperty getExecIdsFile() {
112+
return execIdsFile;
113+
}
114+
115+
@Internal
116+
public final Provider<List<String>> getExecIdsProvider() {
117+
return execIdsProvider;
118+
}
119+
103120
@Internal
104121
public final List<String> getExecIds() {
105122
return execIds;
@@ -113,10 +130,28 @@ public final List<String> getExecIds() {
113130
private final ListProperty<Integer> successOnExitCodes = getProject().getObjects().listProperty(Integer.class);
114131
private ExecProbe execProbe;
115132
private final List<String> execIds = new ArrayList<>();
133+
private final RegularFileProperty execIdsFile;
134+
private final Provider<List<String>> execIdsProvider;
116135

117-
public DockerExecContainer() {
136+
@Inject
137+
public DockerExecContainer(ObjectFactory objects) {
118138
attachStdout.convention(true);
119139
attachStderr.convention(true);
140+
141+
execIdsFile = objects.fileProperty();
142+
final String safeTaskPath = getPath().replaceFirst("^:", "").replaceAll(":", "_");
143+
execIdsFile.convention(getProject().getLayout().getBuildDirectory().file(".docker/" + safeTaskPath + "-execIds.txt"));
144+
145+
execIdsProvider = execIdsFile.map(file -> {
146+
try {
147+
if (!file.getAsFile().exists()) {
148+
return new ArrayList<String>();
149+
}
150+
return Files.readAllLines(file.getAsFile().toPath());
151+
} catch (IOException e) {
152+
throw new UncheckedIOException(e);
153+
}
154+
});
120155
}
121156

122157
@Override
@@ -189,6 +224,15 @@ protected void doRunRemoteCommand(DockerClient dockerClient) throws InterruptedE
189224

190225
execIds.add(localExecId);
191226
}
227+
228+
// Write exec IDs to file for configuration cache compatibility
229+
java.io.File execIdsFile = getExecIdsFile().get().getAsFile();
230+
execIdsFile.getParentFile().mkdirs();
231+
try {
232+
Files.write(execIdsFile.toPath(), execIds);
233+
} catch (IOException e) {
234+
throw new UncheckedIOException("Failed to write exec IDs to file", e);
235+
}
192236
}
193237

194238
/**

0 commit comments

Comments
 (0)