Skip to content

Commit a45844e

Browse files
committed
Reclaim docker disk space on CI during build
Attempt to fix disk space issues by removing large docker images after they have been used. This commit backports commits from `3.4.x` that were applied to test the changes. Closes gh-42776
1 parent 3481107 commit a45844e

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/bin/bash
2+
3+
echo "Reclaiming Docker Disk Space"
4+
echo
5+
6+
docker image ls --format "{{.Size}} {{.ID}} {{.Repository}} {{.Tag}}" | LANG=en_US sort -rh | while read line; do
7+
size=$( echo "$line" | cut -d' ' -f1 | sed -e 's/\.[0-9]*//' | sed -e 's/MB/000000/' | sed -e 's/GB/000000000/' )
8+
image=$( echo "$line" | cut -d' ' -f2 )
9+
repository=$( echo "$line" | cut -d' ' -f3 )
10+
tag=$( echo "$line" | cut -d' ' -f4 )
11+
echo "Considering $image $repository:$tag $size"
12+
if [[ "$tag" =~ ^[a-f0-9]{32}$ ]]; then
13+
echo "Ignoring GitHub action image $image $repository:$tag"
14+
elif [[ "$tag" == "<none>" ]]; then
15+
echo "Ignoring untagged image $image $repository:$tag"
16+
elif [[ "$size" -lt 200000000 ]]; then
17+
echo "Ignoring small image $image $repository:$tag"
18+
else
19+
echo "Cleaning $image $repository:$tag"
20+
docker image rm $image
21+
fi
22+
done
23+
24+
echo "Finished cleanup, leaving the following containers:"
25+
echo
26+
docker image ls --format "{{.Size}} {{.ID}} {{.Repository}}:{{.Tag}}" | LANG=en_US sort -rh
27+
echo
28+
df -h
29+
echo

buildSrc/src/main/java/org/springframework/boot/build/test/DockerTestPlugin.java

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818

1919
import org.gradle.api.Plugin;
2020
import org.gradle.api.Project;
21+
import org.gradle.api.Task;
2122
import org.gradle.api.plugins.JavaPlugin;
2223
import org.gradle.api.plugins.JavaPluginExtension;
2324
import org.gradle.api.provider.Provider;
2425
import org.gradle.api.services.BuildService;
26+
import org.gradle.api.tasks.Exec;
2527
import org.gradle.api.tasks.SourceSet;
2628
import org.gradle.api.tasks.SourceSetContainer;
2729
import org.gradle.api.tasks.testing.Test;
@@ -43,17 +45,19 @@ public class DockerTestPlugin implements Plugin<Project> {
4345
/**
4446
* Name of the {@code dockerTest} task.
4547
*/
46-
public static String DOCKER_TEST_TASK_NAME = "dockerTest";
48+
public static final String DOCKER_TEST_TASK_NAME = "dockerTest";
4749

4850
/**
4951
* Name of the {@code dockerTest} source set.
5052
*/
51-
public static String DOCKER_TEST_SOURCE_SET_NAME = "dockerTest";
53+
public static final String DOCKER_TEST_SOURCE_SET_NAME = "dockerTest";
5254

5355
/**
5456
* Name of the {@code dockerTest} shared service.
5557
*/
56-
public static String DOCKER_TEST_SERVICE_NAME = "dockerTest";
58+
public static final String DOCKER_TEST_SERVICE_NAME = "dockerTest";
59+
60+
private static final String RECLAIM_DOCKER_SPACE_TASK_NAME = "reclaimDockerSpace";
5761

5862
@Override
5963
public void apply(Project project) {
@@ -73,6 +77,8 @@ private void configureDockerTesting(Project project) {
7377
});
7478
project.getDependencies()
7579
.add(dockerTestSourceSet.getRuntimeOnlyConfigurationName(), "org.junit.platform:junit-platform-launcher");
80+
Provider<Exec> reclaimDockerSpace = createReclaimDockerSpaceTask(project, buildService);
81+
project.getTasks().getByName(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(reclaimDockerSpace);
7682
}
7783

7884
private SourceSet createSourceSet(Project project) {
@@ -110,4 +116,28 @@ private Provider<Test> createTestTask(Project project, SourceSet dockerTestSourc
110116
});
111117
}
112118

119+
private Provider<Exec> createReclaimDockerSpaceTask(Project project,
120+
Provider<DockerTestBuildService> buildService) {
121+
return project.getTasks().register(RECLAIM_DOCKER_SPACE_TASK_NAME, Exec.class, (task) -> {
122+
task.usesService(buildService);
123+
task.setGroup(LifecycleBasePlugin.VERIFICATION_GROUP);
124+
task.setDescription("Reclaims Docker space on CI.");
125+
task.shouldRunAfter(DOCKER_TEST_TASK_NAME);
126+
task.onlyIf(this::shouldReclaimDockerSpace);
127+
task.executable("bash");
128+
task.args("-c",
129+
project.getRootDir()
130+
.toPath()
131+
.resolve(".github/scripts/reclaim-docker-diskspace.sh")
132+
.toAbsolutePath());
133+
});
134+
}
135+
136+
private boolean shouldReclaimDockerSpace(Task task) {
137+
if (System.getProperty("os.name").startsWith("Windows")) {
138+
return false;
139+
}
140+
return System.getenv("GITHUB_ACTIONS") != null || System.getenv("RECLAIM_DOCKER_SPACE") != null;
141+
}
142+
113143
}

0 commit comments

Comments
 (0)