|
|
|
|
@@ -31,13 +31,14 @@ import org.junit.jupiter.api.condition.OS;
|
|
|
|
|
import org.junit.jupiter.api.extension.ExtendWith;
|
|
|
|
|
|
|
|
|
|
import org.springframework.boot.buildpack.platform.docker.DockerApi;
|
|
|
|
|
import org.springframework.boot.buildpack.platform.docker.DockerApi.ImageApi;
|
|
|
|
|
import org.springframework.boot.buildpack.platform.docker.DockerApi.VolumeApi;
|
|
|
|
|
import org.springframework.boot.buildpack.platform.docker.transport.DockerEngineException;
|
|
|
|
|
import org.springframework.boot.buildpack.platform.docker.type.Image;
|
|
|
|
|
import org.springframework.boot.buildpack.platform.docker.type.ImageName;
|
|
|
|
|
import org.springframework.boot.buildpack.platform.docker.type.ImageReference;
|
|
|
|
|
import org.springframework.boot.buildpack.platform.docker.type.VolumeName;
|
|
|
|
|
import org.springframework.boot.testsupport.container.DisabledIfDockerUnavailable;
|
|
|
|
|
import org.springframework.boot.testsupport.junit.DisabledOnOs;
|
|
|
|
|
import org.springframework.util.FileSystemUtils;
|
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
|
|
|
@@ -51,8 +52,6 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|
|
|
|
*/
|
|
|
|
|
@ExtendWith(MavenBuildExtension.class)
|
|
|
|
|
@DisabledIfDockerUnavailable
|
|
|
|
|
@DisabledOnOs(os = { OS.LINUX, OS.MAC }, architecture = "aarch64",
|
|
|
|
|
disabledReason = "The builder image has no ARM support")
|
|
|
|
|
class BuildImageTests extends AbstractArchiveIntegrationTests {
|
|
|
|
|
|
|
|
|
|
@TestTemplate
|
|
|
|
|
@@ -460,7 +459,6 @@ class BuildImageTests extends AbstractArchiveIntegrationTests {
|
|
|
|
|
mavenBuild.project("dockerTest", "build-image-created-date")
|
|
|
|
|
.goals("package")
|
|
|
|
|
.systemProperty("spring-boot.build-image.pullPolicy", "IF_NOT_PRESENT")
|
|
|
|
|
.systemProperty("test-build-id", testBuildId)
|
|
|
|
|
.execute((project) -> {
|
|
|
|
|
assertThat(buildLog(project)).contains("Building image")
|
|
|
|
|
.contains("docker.io/library/build-image-created-date:0.0.1.BUILD-SNAPSHOT")
|
|
|
|
|
@@ -474,11 +472,9 @@ class BuildImageTests extends AbstractArchiveIntegrationTests {
|
|
|
|
|
|
|
|
|
|
@TestTemplate
|
|
|
|
|
void whenBuildImageIsInvokedWithCurrentCreatedDate(MavenBuild mavenBuild) {
|
|
|
|
|
String testBuildId = randomString();
|
|
|
|
|
mavenBuild.project("dockerTest", "build-image-current-created-date")
|
|
|
|
|
.goals("package")
|
|
|
|
|
.systemProperty("spring-boot.build-image.pullPolicy", "IF_NOT_PRESENT")
|
|
|
|
|
.systemProperty("test-build-id", testBuildId)
|
|
|
|
|
.execute((project) -> {
|
|
|
|
|
assertThat(buildLog(project)).contains("Building image")
|
|
|
|
|
.contains("docker.io/library/build-image-current-created-date:0.0.1.BUILD-SNAPSHOT")
|
|
|
|
|
@@ -497,11 +493,9 @@ class BuildImageTests extends AbstractArchiveIntegrationTests {
|
|
|
|
|
|
|
|
|
|
@TestTemplate
|
|
|
|
|
void whenBuildImageIsInvokedWithApplicationDirectory(MavenBuild mavenBuild) {
|
|
|
|
|
String testBuildId = randomString();
|
|
|
|
|
mavenBuild.project("dockerTest", "build-image-app-dir")
|
|
|
|
|
.goals("package")
|
|
|
|
|
.systemProperty("spring-boot.build-image.pullPolicy", "IF_NOT_PRESENT")
|
|
|
|
|
.systemProperty("test-build-id", testBuildId)
|
|
|
|
|
.execute((project) -> {
|
|
|
|
|
assertThat(buildLog(project)).contains("Building image")
|
|
|
|
|
.contains("docker.io/library/build-image-app-dir:0.0.1.BUILD-SNAPSHOT")
|
|
|
|
|
@@ -512,11 +506,9 @@ class BuildImageTests extends AbstractArchiveIntegrationTests {
|
|
|
|
|
|
|
|
|
|
@TestTemplate
|
|
|
|
|
void whenBuildImageIsInvokedWithEmptySecurityOptions(MavenBuild mavenBuild) {
|
|
|
|
|
String testBuildId = randomString();
|
|
|
|
|
mavenBuild.project("dockerTest", "build-image-security-opts")
|
|
|
|
|
.goals("package")
|
|
|
|
|
.systemProperty("spring-boot.build-image.pullPolicy", "IF_NOT_PRESENT")
|
|
|
|
|
.systemProperty("test-build-id", testBuildId)
|
|
|
|
|
.execute((project) -> {
|
|
|
|
|
assertThat(buildLog(project)).contains("Building image")
|
|
|
|
|
.contains("docker.io/library/build-image-security-opts:0.0.1.BUILD-SNAPSHOT")
|
|
|
|
|
@@ -525,6 +517,49 @@ class BuildImageTests extends AbstractArchiveIntegrationTests {
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@TestTemplate
|
|
|
|
|
@EnabledOnOs(value = { OS.LINUX, OS.MAC }, architectures = "aarch64",
|
|
|
|
|
disabledReason = "Lifecycle will only run on ARM architecture")
|
|
|
|
|
void whenBuildImageIsInvokedOnLinuxArmWithImagePlatformLinuxArm(MavenBuild mavenBuild) throws IOException {
|
|
|
|
|
String builderImage = "ghcr.io/spring-io/spring-boot-cnb-test-builder:0.0.1";
|
|
|
|
|
String runImage = "docker.io/paketobuildpacks/run-jammy-tiny:latest";
|
|
|
|
|
String buildpackImage = "ghcr.io/spring-io/spring-boot-test-info:0.0.1";
|
|
|
|
|
removeImages(builderImage, runImage, buildpackImage);
|
|
|
|
|
mavenBuild.project("dockerTest", "build-image-platform-linux-arm").goals("package").execute((project) -> {
|
|
|
|
|
File jar = new File(project, "target/build-image-platform-linux-arm-0.0.1.BUILD-SNAPSHOT.jar");
|
|
|
|
|
assertThat(jar).isFile();
|
|
|
|
|
assertThat(buildLog(project)).contains("Building image")
|
|
|
|
|
.contains("docker.io/library/build-image-platform-linux-arm:0.0.1.BUILD-SNAPSHOT")
|
|
|
|
|
.contains("Pulling builder image '" + builderImage + "' for platform 'linux/arm64'")
|
|
|
|
|
.contains("Pulling run image '" + runImage + "' for platform 'linux/arm64'")
|
|
|
|
|
.contains("Pulling buildpack image '" + buildpackImage + "' for platform 'linux/arm64'")
|
|
|
|
|
.contains("---> Test Info buildpack building")
|
|
|
|
|
.contains("---> Test Info buildpack done")
|
|
|
|
|
.contains("Successfully built image");
|
|
|
|
|
removeImage("docker.io/library/build-image-platform-linux-arm", "0.0.1.BUILD-SNAPSHOT");
|
|
|
|
|
});
|
|
|
|
|
removeImages(builderImage, runImage, buildpackImage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@TestTemplate
|
|
|
|
|
@EnabledOnOs(value = { OS.LINUX, OS.MAC }, architectures = "amd64",
|
|
|
|
|
disabledReason = "The expected failure condition will not fail on ARM architectures")
|
|
|
|
|
void failsWhenBuildImageIsInvokedOnLinuxAmdWithImagePlatformLinuxArm(MavenBuild mavenBuild) throws IOException {
|
|
|
|
|
String builderImage = "ghcr.io/spring-io/spring-boot-cnb-test-builder:0.0.1";
|
|
|
|
|
String runImage = "docker.io/paketobuildpacks/run-jammy-tiny:latest";
|
|
|
|
|
String buildpackImage = "ghcr.io/spring-io/spring-boot-test-info:0.0.1";
|
|
|
|
|
removeImages(buildpackImage, runImage, buildpackImage);
|
|
|
|
|
mavenBuild.project("dockerTest", "build-image-platform-linux-arm")
|
|
|
|
|
.goals("package")
|
|
|
|
|
.executeAndFail((project) -> assertThat(buildLog(project)).contains("Building image")
|
|
|
|
|
.contains("docker.io/library/build-image-platform-linux-arm:0.0.1.BUILD-SNAPSHOT")
|
|
|
|
|
.contains("Pulling builder image '" + builderImage + "' for platform 'linux/arm64'")
|
|
|
|
|
.contains("Pulling run image '" + runImage + "' for platform 'linux/arm64'")
|
|
|
|
|
.contains("Pulling buildpack image '" + buildpackImage + "' for platform 'linux/arm64'")
|
|
|
|
|
.contains("exec format error"));
|
|
|
|
|
removeImages(builderImage, runImage, buildpackImage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@TestTemplate
|
|
|
|
|
void failsWhenBuildImageIsInvokedOnMultiModuleProjectWithBuildImageGoal(MavenBuild mavenBuild) {
|
|
|
|
|
mavenBuild.project("dockerTest", "build-image-multi-module")
|
|
|
|
|
@@ -582,6 +617,18 @@ class BuildImageTests extends AbstractArchiveIntegrationTests {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void removeImages(String... names) throws IOException {
|
|
|
|
|
ImageApi imageApi = new DockerApi().image();
|
|
|
|
|
for (String name : names) {
|
|
|
|
|
try {
|
|
|
|
|
imageApi.remove(ImageReference.of(name), false);
|
|
|
|
|
}
|
|
|
|
|
catch (DockerEngineException ex) {
|
|
|
|
|
// ignore image remove failures
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void removeImage(String name, String version) {
|
|
|
|
|
ImageReference imageReference = ImageReference.of(ImageName.of(name), version);
|
|
|
|
|
try {
|
|
|
|
|
|