2323import com .github .dockerjava .api .model .Frame ;
2424import org .gradle .api .Action ;
2525import org .gradle .api .GradleException ;
26+ import org .gradle .api .file .RegularFileProperty ;
27+ import org .gradle .api .model .ObjectFactory ;
2628import org .gradle .api .provider .ListProperty ;
2729import org .gradle .api .provider .Property ;
30+ import org .gradle .api .provider .Provider ;
2831import org .gradle .api .tasks .Input ;
2932import org .gradle .api .tasks .Internal ;
3033import org .gradle .api .tasks .Nested ;
3134import org .gradle .api .tasks .Optional ;
35+ import org .gradle .api .tasks .OutputFile ;
3236import org .gradle .internal .logging .progress .ProgressLogger ;
3337
38+ import javax .inject .Inject ;
3439import java .io .IOException ;
3540import java .io .UncheckedIOException ;
41+ import java .nio .file .Files ;
3642import java .util .ArrayList ;
3743import java .util .Arrays ;
3844import java .util .List ;
3945import java .util .concurrent .TimeUnit ;
46+ import java .util .stream .Collectors ;
4047
4148import 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