Skip to content

Commit 59e0f73

Browse files
Avoid image pulls in integration tests
This commit sets the pull policy to `IF_NOT_PRESENT` where possible in integration tests for the Maven and Gradle plugins to reduce the number of times the default Paketo builder and run images are pulled from Docker Hub. Fixes gh-24113
1 parent 21d9752 commit 59e0f73

File tree

2 files changed

+48
-47
lines changed

2 files changed

+48
-47
lines changed

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,10 @@ class BootBuildImageIntegrationTests {
5656
void buildsImageWithDefaultBuilder() throws IOException {
5757
writeMainClass();
5858
writeLongNameResource();
59-
BuildResult result = this.gradleBuild.build("bootBuildImage");
59+
BuildResult result = this.gradleBuild.build("bootBuildImage", "--pullPolicy=IF_NOT_PRESENT");
6060
String projectName = this.gradleBuild.getProjectDir().getName();
6161
assertThat(result.task(":bootBuildImage").getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
6262
assertThat(result.getOutput()).contains("docker.io/library/" + projectName);
63-
assertThat(result.getOutput()).contains("paketobuildpacks/builder");
6463
ImageReference imageReference = ImageReference.of(ImageName.of(projectName));
6564
try (GenericContainer<?> container = new GenericContainer<>(imageReference.toString())) {
6665
container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start();
@@ -74,10 +73,9 @@ void buildsImageWithDefaultBuilder() throws IOException {
7473
void buildsImageWithCustomName() throws IOException {
7574
writeMainClass();
7675
writeLongNameResource();
77-
BuildResult result = this.gradleBuild.build("bootBuildImage");
76+
BuildResult result = this.gradleBuild.build("bootBuildImage", "--pullPolicy=IF_NOT_PRESENT");
7877
assertThat(result.task(":bootBuildImage").getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
7978
assertThat(result.getOutput()).contains("example/test-image-name");
80-
assertThat(result.getOutput()).contains("paketobuildpacks/builder");
8179
ImageReference imageReference = ImageReference.of(ImageName.of("example/test-image-name"));
8280
try (GenericContainer<?> container = new GenericContainer<>(imageReference.toString())) {
8381
container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start();
@@ -91,11 +89,9 @@ void buildsImageWithCustomName() throws IOException {
9189
void buildsImageWithCustomBuilderAndRunImage() throws IOException {
9290
writeMainClass();
9391
writeLongNameResource();
94-
BuildResult result = this.gradleBuild.build("bootBuildImage");
92+
BuildResult result = this.gradleBuild.build("bootBuildImage", "--pullPolicy=IF_NOT_PRESENT");
9593
assertThat(result.task(":bootBuildImage").getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
9694
assertThat(result.getOutput()).contains("example/test-image-custom");
97-
assertThat(result.getOutput()).contains("paketobuildpacks/builder:full");
98-
assertThat(result.getOutput()).contains("paketobuildpacks/run:full");
9995
ImageReference imageReference = ImageReference.of(ImageName.of("example/test-image-custom"));
10096
try (GenericContainer<?> container = new GenericContainer<>(imageReference.toString())) {
10197
container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start();
@@ -109,12 +105,11 @@ void buildsImageWithCustomBuilderAndRunImage() throws IOException {
109105
void buildsImageWithCommandLineOptions() throws IOException {
110106
writeMainClass();
111107
writeLongNameResource();
112-
BuildResult result = this.gradleBuild.build("bootBuildImage", "--imageName=example/test-image-cmd",
113-
"--builder=paketobuildpacks/builder:full", "--runImage=paketobuildpacks/run:full-cnb");
108+
BuildResult result = this.gradleBuild.build("bootBuildImage", "--pullPolicy=IF_NOT_PRESENT",
109+
"--imageName=example/test-image-cmd", "--builder=paketobuildpacks/builder:full",
110+
"--runImage=paketobuildpacks/run:full-cnb");
114111
assertThat(result.task(":bootBuildImage").getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
115112
assertThat(result.getOutput()).contains("example/test-image-cmd");
116-
assertThat(result.getOutput()).contains("paketobuildpacks/builder:full");
117-
assertThat(result.getOutput()).contains("paketobuildpacks/run:full");
118113
ImageReference imageReference = ImageReference.of(ImageName.of("example/test-image-cmd"));
119114
try (GenericContainer<?> container = new GenericContainer<>(imageReference.toString())) {
120115
container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start();
@@ -162,7 +157,7 @@ void failsWithLaunchScript() {
162157
void failsWithBuilderError() {
163158
writeMainClass();
164159
writeLongNameResource();
165-
BuildResult result = this.gradleBuild.buildAndFail("bootBuildImage");
160+
BuildResult result = this.gradleBuild.buildAndFail("bootBuildImage", "--pullPolicy=IF_NOT_PRESENT");
166161
assertThat(result.task(":bootBuildImage").getOutcome()).isEqualTo(TaskOutcome.FAILED);
167162
assertThat(result.getOutput()).containsPattern("Builder lifecycle '.*' failed with status code");
168163
}

spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/BuildImageTests.java

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -47,27 +47,31 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests {
4747

4848
@TestTemplate
4949
void whenBuildImageIsInvokedWithoutRepackageTheArchiveIsRepackagedOnTheFly(MavenBuild mavenBuild) {
50-
mavenBuild.project("build-image").goals("package").prepare(this::writeLongNameResource).execute((project) -> {
51-
File jar = new File(project, "target/build-image-0.0.1.BUILD-SNAPSHOT.jar");
52-
assertThat(jar).isFile();
53-
File original = new File(project, "target/build-image-0.0.1.BUILD-SNAPSHOT.jar.original");
54-
assertThat(original).doesNotExist();
55-
assertThat(buildLog(project)).contains("Building image").contains("paketobuildpacks/builder")
56-
.contains("docker.io/library/build-image:0.0.1.BUILD-SNAPSHOT")
57-
.contains("Successfully built image");
58-
ImageReference imageReference = ImageReference.of(ImageName.of("build-image"), "0.0.1.BUILD-SNAPSHOT");
59-
try (GenericContainer<?> container = new GenericContainer<>(imageReference.toString())) {
60-
container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start();
61-
}
62-
finally {
63-
removeImage(imageReference);
64-
}
65-
});
50+
mavenBuild.project("build-image").goals("package")
51+
.systemProperty("spring-boot.build-image.pullPolicy", "IF_NOT_PRESENT")
52+
.prepare(this::writeLongNameResource).execute((project) -> {
53+
File jar = new File(project, "target/build-image-0.0.1.BUILD-SNAPSHOT.jar");
54+
assertThat(jar).isFile();
55+
File original = new File(project, "target/build-image-0.0.1.BUILD-SNAPSHOT.jar.original");
56+
assertThat(original).doesNotExist();
57+
assertThat(buildLog(project)).contains("Building image")
58+
.contains("docker.io/library/build-image:0.0.1.BUILD-SNAPSHOT")
59+
.contains("Successfully built image");
60+
ImageReference imageReference = ImageReference.of(ImageName.of("build-image"),
61+
"0.0.1.BUILD-SNAPSHOT");
62+
try (GenericContainer<?> container = new GenericContainer<>(imageReference.toString())) {
63+
container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start();
64+
}
65+
finally {
66+
removeImage(imageReference);
67+
}
68+
});
6669
}
6770

6871
@TestTemplate
6972
void whenBuildImageIsInvokedWithCustomImageName(MavenBuild mavenBuild) {
7073
mavenBuild.project("build-image-custom-name").goals("package")
74+
.systemProperty("spring-boot.build-image.pullPolicy", "IF_NOT_PRESENT")
7175
.systemProperty("spring-boot.build-image.imageName", "example.com/test/property-ignored:pom-preferred")
7276
.execute((project) -> {
7377
File jar = new File(project, "target/build-image-custom-name-0.0.1.BUILD-SNAPSHOT.jar");
@@ -92,13 +96,13 @@ void whenBuildImageIsInvokedWithCustomImageName(MavenBuild mavenBuild) {
9296
@TestTemplate
9397
void whenBuildImageIsInvokedWithCommandLineParameters(MavenBuild mavenBuild) {
9498
mavenBuild.project("build-image").goals("package")
99+
.systemProperty("spring-boot.build-image.pullPolicy", "IF_NOT_PRESENT")
95100
.systemProperty("spring-boot.build-image.imageName", "example.com/test/cmd-property-name:v1")
96101
.systemProperty("spring-boot.build-image.builder", "paketobuildpacks/builder:full")
97102
.systemProperty("spring-boot.build-image.runImage", "paketobuildpacks/run:full-cnb")
98103
.execute((project) -> {
99104
assertThat(buildLog(project)).contains("Building image")
100-
.contains("example.com/test/cmd-property-name:v1").contains("paketobuildpacks/builder:full")
101-
.contains("paketobuildpacks/run:full").contains("Successfully built image");
105+
.contains("example.com/test/cmd-property-name:v1").contains("Successfully built image");
102106
ImageReference imageReference = ImageReference.of("example.com/test/cmd-property-name:v1");
103107
try (GenericContainer<?> container = new GenericContainer<>(imageReference.toString())) {
104108
container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start();
@@ -111,27 +115,28 @@ void whenBuildImageIsInvokedWithCommandLineParameters(MavenBuild mavenBuild) {
111115

112116
@TestTemplate
113117
void whenBuildImageIsInvokedWithCustomBuilderImageAndRunImage(MavenBuild mavenBuild) {
114-
mavenBuild.project("build-image-custom-builder").goals("package").execute((project) -> {
115-
assertThat(buildLog(project)).contains("Building image").contains("paketobuildpacks/builder:full")
116-
.contains("paketobuildpacks/run:full")
117-
.contains("docker.io/library/build-image-v2-builder:0.0.1.BUILD-SNAPSHOT")
118-
.contains("Successfully built image");
119-
ImageReference imageReference = ImageReference
120-
.of("docker.io/library/build-image-v2-builder:0.0.1.BUILD-SNAPSHOT");
121-
try (GenericContainer<?> container = new GenericContainer<>(imageReference.toString())) {
122-
container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start();
123-
}
124-
finally {
125-
removeImage(imageReference);
126-
}
127-
});
118+
mavenBuild.project("build-image-custom-builder").goals("package")
119+
.systemProperty("spring-boot.build-image.pullPolicy", "IF_NOT_PRESENT").execute((project) -> {
120+
assertThat(buildLog(project)).contains("Building image")
121+
.contains("docker.io/library/build-image-v2-builder:0.0.1.BUILD-SNAPSHOT")
122+
.contains("Successfully built image");
123+
ImageReference imageReference = ImageReference
124+
.of("docker.io/library/build-image-v2-builder:0.0.1.BUILD-SNAPSHOT");
125+
try (GenericContainer<?> container = new GenericContainer<>(imageReference.toString())) {
126+
container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start();
127+
}
128+
finally {
129+
removeImage(imageReference);
130+
}
131+
});
128132
}
129133

130134
@TestTemplate
131135
void whenBuildImageIsInvokedWithEmptyEnvEntry(MavenBuild mavenBuild) {
132-
mavenBuild.project("build-image-empty-env-entry").goals("package").prepare(this::writeLongNameResource)
133-
.execute((project) -> {
134-
assertThat(buildLog(project)).contains("Building image").contains("paketobuildpacks/builder")
136+
mavenBuild.project("build-image-empty-env-entry").goals("package")
137+
.systemProperty("spring-boot.build-image.pullPolicy", "IF_NOT_PRESENT")
138+
.prepare(this::writeLongNameResource).execute((project) -> {
139+
assertThat(buildLog(project)).contains("Building image")
135140
.contains("docker.io/library/build-image-empty-env-entry:0.0.1.BUILD-SNAPSHOT")
136141
.contains("Successfully built image");
137142
ImageReference imageReference = ImageReference.of(ImageName.of("build-image-empty-env-entry"),
@@ -154,6 +159,7 @@ void failsWhenPublishWithoutPublishRegistryConfigured(MavenBuild mavenBuild) {
154159
@TestTemplate
155160
void failsWhenBuilderFails(MavenBuild mavenBuild) {
156161
mavenBuild.project("build-image-builder-error").goals("package")
162+
.systemProperty("spring-boot.build-image.pullPolicy", "IF_NOT_PRESENT")
157163
.executeAndFail((project) -> assertThat(buildLog(project)).contains("Building image")
158164
.containsPattern("Builder lifecycle '.*' failed with status code"));
159165
}

0 commit comments

Comments
 (0)