From 32d378a348cc79a865f9f485e3a265d28075eee6 Mon Sep 17 00:00:00 2001 From: Scott Frederick Date: Wed, 12 May 2021 13:59:40 -0500 Subject: [PATCH] Use test harness for image building integration tests This commit modifies the integration tests for the Maven and Gradle image building goal and task to use a custom builder as a test harness to verify that the plugins invoke the builder as expected. Fixes gh-25838 --- .../BootBuildImageIntegrationTests.java | 78 ++++---- ...s-buildsImageWithCommandLineOptions.gradle | 7 + ...dsImageWithCustomBuilderAndRunImage.gradle | 4 +- ...tionTests-buildsImageWithCustomName.gradle | 1 + ...WithWarPackagingAndJarConfiguration.gradle | 4 + ...egrationTests-failsWithBuilderError.gradle | 3 +- ...egrationTests-failsWithLaunchScript.gradle | 6 +- .../BootBuildImageIntegrationTests.gradle | 4 + .../boot/maven/BuildImageTests.java | 168 +++++------------- .../build-image-builder-error/pom.xml | 3 +- .../pom.xml | 5 + .../build-image-classifier-source/pom.xml | 5 + .../pom.xml | 5 + .../projects/build-image-classifier/pom.xml | 5 + .../projects/build-image-cmd-line/pom.xml | 29 +++ .../main/java/org/test/SampleApplication.java | 28 +++ .../build-image-custom-builder/pom.xml | 6 +- .../projects/build-image-custom-name/pom.xml | 1 + .../build-image-empty-env-entry/pom.xml | 1 + .../projects/build-image-final-name/pom.xml | 3 + .../build-image-with-repackage/pom.xml | 5 + .../build-image-zip-packaging/pom.xml | 3 + .../src/intTest/projects/build-image/pom.xml | 5 + src/spring-boot-builder/README.adoc | 10 ++ src/spring-boot-builder/build.sh | 15 ++ src/spring-boot-builder/builder/builder.toml | 17 ++ .../buildpacks/test-info/bin/build | 35 ++++ .../buildpacks/test-info/bin/detect | 28 +++ .../buildpacks/test-info/buildpack.toml | 13 ++ 29 files changed, 323 insertions(+), 174 deletions(-) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithCommandLineOptions.gradle create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-cmd-line/pom.xml create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-cmd-line/src/main/java/org/test/SampleApplication.java create mode 100644 src/spring-boot-builder/README.adoc create mode 100755 src/spring-boot-builder/build.sh create mode 100644 src/spring-boot-builder/builder/builder.toml create mode 100755 src/spring-boot-builder/buildpacks/test-info/bin/build create mode 100755 src/spring-boot-builder/buildpacks/test-info/bin/detect create mode 100644 src/spring-boot-builder/buildpacks/test-info/buildpack.toml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests.java index f958154fd3..dedfc8d812 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,8 +29,6 @@ import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.TaskOutcome; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.ExtendWith; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.springframework.boot.buildpack.platform.docker.DockerApi; import org.springframework.boot.buildpack.platform.docker.type.ImageName; @@ -61,14 +59,10 @@ class BootBuildImageIntegrationTests { String projectName = this.gradleBuild.getProjectDir().getName(); assertThat(result.task(":bootBuildImage").getOutcome()).isEqualTo(TaskOutcome.SUCCESS); assertThat(result.getOutput()).contains("docker.io/library/" + projectName); - assertThat(result.getOutput()).contains("paketo-buildpacks/builder"); - ImageReference imageReference = ImageReference.of(ImageName.of(projectName)); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - new DockerApi().image().remove(imageReference, false); - } + assertThat(result.getOutput()).contains("---> Test Info buildpack building"); + assertThat(result.getOutput()).contains("env: BP_JVM_VERSION=8.*"); + assertThat(result.getOutput()).contains("---> Test Info buildpack done"); + removeImage(projectName); } @TestTemplate @@ -78,14 +72,10 @@ class BootBuildImageIntegrationTests { BuildResult result = this.gradleBuild.build("bootBuildImage"); assertThat(result.task(":bootBuildImage").getOutcome()).isEqualTo(TaskOutcome.SUCCESS); assertThat(result.getOutput()).contains("example/test-image-name"); - assertThat(result.getOutput()).contains("paketo-buildpacks/builder"); - ImageReference imageReference = ImageReference.of(ImageName.of("example/test-image-name")); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - new DockerApi().image().remove(imageReference, false); - } + assertThat(result.getOutput()).contains("---> Test Info buildpack building"); + assertThat(result.getOutput()).contains("env: BP_JVM_VERSION=8.*"); + assertThat(result.getOutput()).contains("---> Test Info buildpack done"); + removeImage("example/test-image-name"); } @TestTemplate @@ -95,15 +85,12 @@ class BootBuildImageIntegrationTests { BuildResult result = this.gradleBuild.build("bootBuildImage"); assertThat(result.task(":bootBuildImage").getOutcome()).isEqualTo(TaskOutcome.SUCCESS); assertThat(result.getOutput()).contains("example/test-image-custom"); - assertThat(result.getOutput()).contains("paketobuildpacks/builder:full"); - assertThat(result.getOutput()).contains("paketobuildpacks/run:full-cnb"); - ImageReference imageReference = ImageReference.of(ImageName.of("example/test-image-custom")); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - new DockerApi().image().remove(imageReference, false); - } + assertThat(result.getOutput()) + .contains("projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1"); + assertThat(result.getOutput()).contains("projects.registry.vmware.com/springboot/run:tiny-cnb"); + assertThat(result.getOutput()).contains("---> Test Info buildpack building"); + assertThat(result.getOutput()).contains("---> Test Info buildpack done"); + removeImage("example/test-image-custom"); } @TestTemplate @@ -111,18 +98,16 @@ class BootBuildImageIntegrationTests { writeMainClass(); writeLongNameResource(); BuildResult result = this.gradleBuild.build("bootBuildImage", "--imageName=example/test-image-cmd", - "--builder=paketobuildpacks/builder:full", "--runImage=paketobuildpacks/run:full-cnb"); + "--builder=projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1", + "--runImage=projects.registry.vmware.com/springboot/run:tiny-cnb"); assertThat(result.task(":bootBuildImage").getOutcome()).isEqualTo(TaskOutcome.SUCCESS); assertThat(result.getOutput()).contains("example/test-image-cmd"); - assertThat(result.getOutput()).contains("paketobuildpacks/builder:full"); - assertThat(result.getOutput()).contains("paketobuildpacks/run:full-cnb"); - ImageReference imageReference = ImageReference.of(ImageName.of("example/test-image-cmd")); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - new DockerApi().image().remove(imageReference, false); - } + assertThat(result.getOutput()) + .contains("projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1"); + assertThat(result.getOutput()).contains("projects.registry.vmware.com/springboot/run:tiny-cnb"); + assertThat(result.getOutput()).contains("---> Test Info buildpack building"); + assertThat(result.getOutput()).contains("---> Test Info buildpack done"); + removeImage("example/test-image-cmd"); } @TestTemplate @@ -140,6 +125,7 @@ class BootBuildImageIntegrationTests { writeLongNameResource(); BuildResult result = this.gradleBuild.buildAndFail("bootBuildImage"); assertThat(result.task(":bootBuildImage").getOutcome()).isEqualTo(TaskOutcome.FAILED); + assertThat(result.getOutput()).contains("Forced builder failure"); assertThat(result.getOutput()).containsPattern("Builder lifecycle '.*' failed with status code"); } @@ -170,17 +156,12 @@ class BootBuildImageIntegrationTests { String projectName = this.gradleBuild.getProjectDir().getName(); assertThat(result.task(":bootBuildImage").getOutcome()).isEqualTo(TaskOutcome.SUCCESS); assertThat(result.getOutput()).contains("docker.io/library/" + projectName); - assertThat(result.getOutput()).contains("paketo-buildpacks/builder"); + assertThat(result.getOutput()).contains("---> Test Info buildpack building"); + assertThat(result.getOutput()).contains("---> Test Info buildpack done"); File buildLibs = new File(this.gradleBuild.getProjectDir(), "build/libs"); assertThat(buildLibs.listFiles()) .containsExactly(new File(buildLibs, this.gradleBuild.getProjectDir().getName() + ".war")); - ImageReference imageReference = ImageReference.of(ImageName.of(projectName)); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - new DockerApi().image().remove(imageReference, false); - } + removeImage(projectName); } private void writeMainClass() { @@ -222,4 +203,9 @@ class BootBuildImageIntegrationTests { } } + private void removeImage(String name) throws IOException { + ImageReference imageReference = ImageReference.of(ImageName.of(name)); + new DockerApi().image().remove(imageReference, false); + } + } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithCommandLineOptions.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithCommandLineOptions.gradle new file mode 100644 index 0000000000..8971742147 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithCommandLineOptions.gradle @@ -0,0 +1,7 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '{version}' +} + +sourceCompatibility = '1.8' +targetCompatibility = '1.8' diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithCustomBuilderAndRunImage.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithCustomBuilderAndRunImage.gradle index 9878fe16db..b3fd2aa083 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithCustomBuilderAndRunImage.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithCustomBuilderAndRunImage.gradle @@ -8,6 +8,6 @@ targetCompatibility = '1.8' bootBuildImage { imageName = "example/test-image-custom" - builder = "paketobuildpacks/builder:full" - runImage = "paketobuildpacks/run:full-cnb" + builder = "projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1" + runImage = "projects.registry.vmware.com/springboot/run:tiny-cnb" } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithCustomName.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithCustomName.gradle index e306457624..73e1cc664c 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithCustomName.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithCustomName.gradle @@ -8,4 +8,5 @@ targetCompatibility = '1.8' bootBuildImage { imageName = "example/test-image-name" + builder = "projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1" } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithWarPackagingAndJarConfiguration.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithWarPackagingAndJarConfiguration.gradle index 5aa8c27efe..5c74c2f829 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithWarPackagingAndJarConfiguration.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-buildsImageWithWarPackagingAndJarConfiguration.gradle @@ -9,3 +9,7 @@ bootBuildImage { sourceCompatibility = '1.8' targetCompatibility = '1.8' + +bootBuildImage { + builder = "projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1" +} \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-failsWithBuilderError.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-failsWithBuilderError.gradle index fb706c51ca..cb5cf9966f 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-failsWithBuilderError.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-failsWithBuilderError.gradle @@ -7,5 +7,6 @@ sourceCompatibility = '1.8' targetCompatibility = '1.8' bootBuildImage { - environment = ["BP_JVM_VERSION": "13.9.9"] + builder = "projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1" + environment = ["FORCE_FAILURE": "true"] } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-failsWithLaunchScript.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-failsWithLaunchScript.gradle index a719311038..c69f24eabc 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-failsWithLaunchScript.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests-failsWithLaunchScript.gradle @@ -8,4 +8,8 @@ targetCompatibility = '1.8' bootJar { launchScript() -} \ No newline at end of file +} + +bootBuildImage { + builder = "projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1" +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests.gradle index 5e0df9a58c..cf75779cbb 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/tasks/bundling/BootBuildImageIntegrationTests.gradle @@ -9,3 +9,7 @@ if (project.hasProperty('applyWarPlugin')) { sourceCompatibility = '1.8' targetCompatibility = '1.8' + +bootBuildImage { + builder = "projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1" +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/BuildImageTests.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/BuildImageTests.java index e85ac49971..3f182553b6 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/BuildImageTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/BuildImageTests.java @@ -16,21 +16,15 @@ package org.springframework.boot.maven; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Random; -import java.util.stream.Collectors; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.ExtendWith; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.springframework.boot.buildpack.platform.docker.DockerApi; import org.springframework.boot.buildpack.platform.docker.type.ImageName; @@ -56,16 +50,11 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests { assertThat(jar).isFile(); File original = new File(project, "target/build-image-0.0.1.BUILD-SNAPSHOT.jar.original"); assertThat(original).doesNotExist(); - assertThat(buildLog(project)).contains("Building image").contains("paketo-buildpacks/builder") + assertThat(buildLog(project)).contains("Building image") .contains("docker.io/library/build-image:0.0.1.BUILD-SNAPSHOT") - .contains("Successfully built image"); - ImageReference imageReference = ImageReference.of(ImageName.of("build-image"), "0.0.1.BUILD-SNAPSHOT"); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - removeImage(imageReference); - } + .contains("---> Test Info buildpack building").contains("env: BP_JVM_VERSION=8.*") + .contains("---> Test Info buildpack done").contains("Successfully built image"); + removeImage("build-image", "0.0.1.BUILD-SNAPSHOT"); }); } @@ -79,15 +68,9 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests { assertThat(classifier).doesNotExist(); assertThat(buildLog(project)).contains("Building image") .contains("docker.io/library/build-image-classifier:0.0.1.BUILD-SNAPSHOT") - .contains("Successfully built image"); - ImageReference imageReference = ImageReference.of(ImageName.of("build-image-classifier"), - "0.0.1.BUILD-SNAPSHOT"); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - removeImage(imageReference); - } + .contains("---> Test Info buildpack building").contains("env: BP_JVM_VERSION=8.*") + .contains("---> Test Info buildpack done").contains("Successfully built image"); + removeImage("build-image-classifier", "0.0.1.BUILD-SNAPSHOT"); }); } @@ -103,15 +86,9 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests { assertThat(original).doesNotExist(); assertThat(buildLog(project)).contains("Building image") .contains("docker.io/library/build-image-classifier-source:0.0.1.BUILD-SNAPSHOT") + .contains("---> Test Info buildpack building").contains("---> Test Info buildpack done") .contains("Successfully built image"); - ImageReference imageReference = ImageReference.of(ImageName.of("build-image-classifier-source"), - "0.0.1.BUILD-SNAPSHOT"); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - removeImage(imageReference); - } + removeImage("build-image-classifier-source", "0.0.1.BUILD-SNAPSHOT"); }); } @@ -124,17 +101,11 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests { File original = new File(project, "target/build-image-with-repackage-0.0.1.BUILD-SNAPSHOT.jar.original"); assertThat(original).isFile(); - assertThat(buildLog(project)).contains("Building image").contains("paketo-buildpacks/builder") + assertThat(buildLog(project)).contains("Building image") .contains("docker.io/library/build-image-with-repackage:0.0.1.BUILD-SNAPSHOT") + .contains("---> Test Info buildpack building").contains("---> Test Info buildpack done") .contains("Successfully built image"); - ImageReference imageReference = ImageReference.of(ImageName.of("build-image-with-repackage"), - "0.0.1.BUILD-SNAPSHOT"); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - removeImage(imageReference); - } + removeImage("build-image-with-repackage", "0.0.1.BUILD-SNAPSHOT"); }); } @@ -150,15 +121,9 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests { assertThat(original).isFile(); assertThat(buildLog(project)).contains("Building image") .contains("docker.io/library/build-image-classifier-with-repackage:0.0.1.BUILD-SNAPSHOT") + .contains("---> Test Info buildpack building").contains("---> Test Info buildpack done") .contains("Successfully built image"); - ImageReference imageReference = ImageReference - .of(ImageName.of("build-image-classifier-with-repackage"), "0.0.1.BUILD-SNAPSHOT"); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - removeImage(imageReference); - } + removeImage("build-image-classifier-with-repackage", "0.0.1.BUILD-SNAPSHOT"); }); } @@ -174,15 +139,9 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests { assertThat(original).isFile(); assertThat(buildLog(project)).contains("Building image").contains( "docker.io/library/build-image-classifier-source-with-repackage:0.0.1.BUILD-SNAPSHOT") + .contains("---> Test Info buildpack building").contains("---> Test Info buildpack done") .contains("Successfully built image"); - ImageReference imageReference = ImageReference - .of(ImageName.of("build-image-classifier-source-with-repackage"), "0.0.1.BUILD-SNAPSHOT"); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - removeImage(imageReference); - } + removeImage("build-image-classifier-source-with-repackage", "0.0.1.BUILD-SNAPSHOT"); }); } @@ -198,53 +157,40 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests { assertThat(original).doesNotExist(); assertThat(buildLog(project)).contains("Building image") .contains("example.com/test/build-image:0.0.1.BUILD-SNAPSHOT") + .contains("---> Test Info buildpack building").contains("---> Test Info buildpack done") .contains("Successfully built image"); - ImageReference imageReference = ImageReference - .of("example.com/test/build-image:0.0.1.BUILD-SNAPSHOT"); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - removeImage(imageReference); - } + removeImage("example.com/test/build-image", "0.0.1.BUILD-SNAPSHOT"); }); } @TestTemplate void whenBuildImageIsInvokedWithCommandLineParameters(MavenBuild mavenBuild) { - mavenBuild.project("build-image").goals("package") + mavenBuild.project("build-image-cmd-line").goals("package") .systemProperty("spring-boot.build-image.imageName", "example.com/test/cmd-property-name:v1") - .systemProperty("spring-boot.build-image.builder", "paketobuildpacks/builder:full") - .systemProperty("spring-boot.build-image.runImage", "paketobuildpacks/run:full-cnb") + .systemProperty("spring-boot.build-image.builder", + "projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1") + .systemProperty("spring-boot.build-image.runImage", + "projects.registry.vmware.com/springboot/run:tiny-cnb") .execute((project) -> { assertThat(buildLog(project)).contains("Building image") - .contains("example.com/test/cmd-property-name:v1").contains("paketobuildpacks/builder:full") - .contains("paketobuildpacks/run:full-cnb").contains("Successfully built image"); - ImageReference imageReference = ImageReference.of("example.com/test/cmd-property-name:v1"); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - removeImage(imageReference); - } + .contains("example.com/test/cmd-property-name:v1").contains("spring-boot-cnb-builder:0.0.1") + .contains("projects.registry.vmware.com/springboot/run:tiny-cnb") + .contains("---> Test Info buildpack building").contains("---> Test Info buildpack done") + .contains("Successfully built image"); + removeImage("example.com/test/cmd-property-name", "v1"); }); } @TestTemplate void whenBuildImageIsInvokedWithCustomBuilderImageAndRunImage(MavenBuild mavenBuild) { mavenBuild.project("build-image-custom-builder").goals("package").execute((project) -> { - assertThat(buildLog(project)).contains("Building image").contains("paketobuildpacks/builder:full") - .contains("paketobuildpacks/run:full-cnb") + assertThat(buildLog(project)).contains("Building image") .contains("docker.io/library/build-image-v2-builder:0.0.1.BUILD-SNAPSHOT") + .contains("projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1") + .contains("projects.registry.vmware.com/springboot/run:tiny-cnb") + .contains("---> Test Info buildpack building").contains("---> Test Info buildpack done") .contains("Successfully built image"); - ImageReference imageReference = ImageReference - .of("docker.io/library/build-image-v2-builder:0.0.1.BUILD-SNAPSHOT"); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - removeImage(imageReference); - } + removeImage("docker.io/library/build-image-v2-builder", "0.0.1.BUILD-SNAPSHOT"); }); } @@ -252,52 +198,33 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests { void whenBuildImageIsInvokedWithEmptyEnvEntry(MavenBuild mavenBuild) { mavenBuild.project("build-image-empty-env-entry").goals("package").prepare(this::writeLongNameResource) .execute((project) -> { - assertThat(buildLog(project)).contains("Building image").contains("paketo-buildpacks/builder") + assertThat(buildLog(project)).contains("Building image") .contains("docker.io/library/build-image-empty-env-entry:0.0.1.BUILD-SNAPSHOT") + .contains("---> Test Info buildpack building").contains("---> Test Info buildpack done") .contains("Successfully built image"); - ImageReference imageReference = ImageReference.of(ImageName.of("build-image-empty-env-entry"), - "0.0.1.BUILD-SNAPSHOT"); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - } - finally { - removeImage(imageReference); - } + removeImage("build-image-empty-env-entry", "0.0.1.BUILD-SNAPSHOT"); }); } @TestTemplate void whenBuildImageIsInvokedWithZipPackaging(MavenBuild mavenBuild) { - mavenBuild.project("build-image-zip-packaging"); - mavenBuild.goals("package"); - mavenBuild.prepare(this::writeLongNameResource); - mavenBuild.execute((project) -> { - File jar = new File(project, "target/build-image-zip-packaging-0.0.1.BUILD-SNAPSHOT.jar"); - assertThat(jar).isFile(); - assertThat(buildLog(project)).contains("Building image").contains("paketo-buildpacks/builder") - .contains("docker.io/library/build-image-zip-packaging:0.0.1.BUILD-SNAPSHOT") - .contains("Successfully built image"); - ImageReference imageReference = ImageReference.of(ImageName.of("build-image-zip-packaging"), - "0.0.1.BUILD-SNAPSHOT"); - try (GenericContainer container = new GenericContainer<>(imageReference.toString())) { - container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start(); - container.copyFileFromContainer("/workspace/META-INF/MANIFEST.MF", (inputStream) -> { - String text = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)).lines() - .collect(Collectors.joining("\n")); - assertThat(text).contains("Main-Class: org.springframework.boot.loader.PropertiesLauncher"); - return null; + mavenBuild.project("build-image-zip-packaging").goals("package").prepare(this::writeLongNameResource) + .execute((project) -> { + File jar = new File(project, "target/build-image-zip-packaging-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar).isFile(); + assertThat(buildLog(project)).contains("Building image") + .contains("docker.io/library/build-image-zip-packaging:0.0.1.BUILD-SNAPSHOT") + .contains("Main-Class: org.springframework.boot.loader.PropertiesLauncher") + .contains("Successfully built image"); + removeImage("build-image-zip-packaging", "0.0.1.BUILD-SNAPSHOT"); }); - } - finally { - removeImage(imageReference); - } - }); } @TestTemplate void failsWhenBuilderFails(MavenBuild mavenBuild) { mavenBuild.project("build-image-builder-error").goals("package") .executeAndFail((project) -> assertThat(buildLog(project)).contains("Building image") + .contains("---> Test Info buildpack building").contains("Forced builder failure") .containsPattern("Builder lifecycle '.*' failed with status code")); } @@ -327,7 +254,8 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests { } } - private void removeImage(ImageReference imageReference) { + private void removeImage(String name, String version) { + ImageReference imageReference = ImageReference.of(ImageName.of(name), version); try { new DockerApi().image().remove(imageReference, false); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-builder-error/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-builder-error/pom.xml index 5b7491e88e..f4c6512756 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-builder-error/pom.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-builder-error/pom.xml @@ -23,8 +23,9 @@ + projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 - 13.9.9 + true diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier-source-with-repackage/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier-source-with-repackage/pom.xml index 7734c543d6..07102b08fd 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier-source-with-repackage/pom.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier-source-with-repackage/pom.xml @@ -43,6 +43,11 @@ build-image + + + projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier-source/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier-source/pom.xml index 30b605a5bc..a46cf9d96b 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier-source/pom.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier-source/pom.xml @@ -37,6 +37,11 @@ build-image + + + projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier-with-repackage/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier-with-repackage/pom.xml index d2f34ba4c6..29abc0f7e8 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier-with-repackage/pom.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier-with-repackage/pom.xml @@ -27,6 +27,11 @@ build-image + + + projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier/pom.xml index ba64b1df5f..fd54fc672c 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier/pom.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-classifier/pom.xml @@ -21,6 +21,11 @@ build-image + + + projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-cmd-line/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-cmd-line/pom.xml new file mode 100644 index 0000000000..0451a8426e --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-cmd-line/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + org.springframework.boot.maven.it + build-image + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + build-image + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-cmd-line/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-cmd-line/src/main/java/org/test/SampleApplication.java new file mode 100644 index 0000000000..5053809ef1 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-cmd-line/src/main/java/org/test/SampleApplication.java @@ -0,0 +1,28 @@ +/* + * Copyright 2012-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.test; + +public class SampleApplication { + + public static void main(String[] args) throws Exception { + System.out.println("Launched"); + synchronized(args) { + args.wait(); // Prevent exit" + } + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-custom-builder/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-custom-builder/pom.xml index 457cb7c933..4ad4b944e4 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-custom-builder/pom.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-custom-builder/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot.maven.it build-image-v2-builder @@ -23,8 +23,8 @@ - paketobuildpacks/builder:full - paketobuildpacks/run:full-cnb + projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 + projects.registry.vmware.com/springboot/run:tiny-cnb diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-custom-name/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-custom-name/pom.xml index 57ec39dd84..fac4518529 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-custom-name/pom.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-custom-name/pom.xml @@ -23,6 +23,7 @@ + projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 example.com/test/build-image:${project.version} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-empty-env-entry/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-empty-env-entry/pom.xml index e453fd95d6..7143fda8e5 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-empty-env-entry/pom.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-empty-env-entry/pom.xml @@ -23,6 +23,7 @@ + projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-final-name/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-final-name/pom.xml index 599371978a..0acb2e142c 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-final-name/pom.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-final-name/pom.xml @@ -24,6 +24,9 @@ final-name + + projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-with-repackage/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-with-repackage/pom.xml index c9a9bd0322..f7ba2ef253 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-with-repackage/pom.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-with-repackage/pom.xml @@ -27,6 +27,11 @@ build-image + + + projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-zip-packaging/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-zip-packaging/pom.xml index f62888620a..534c654bed 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-zip-packaging/pom.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-zip-packaging/pom.xml @@ -25,6 +25,9 @@ ZIP + + projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image/pom.xml index 0451a8426e..1ede9fbe03 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image/pom.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image/pom.xml @@ -21,6 +21,11 @@ build-image + + + projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 + + diff --git a/src/spring-boot-builder/README.adoc b/src/spring-boot-builder/README.adoc new file mode 100644 index 0000000000..21a8202851 --- /dev/null +++ b/src/spring-boot-builder/README.adoc @@ -0,0 +1,10 @@ += Spring Boot Test Builder + +This directory contains a Cloud Native Buildpacks https://buildpacks.io/docs/concepts/components/builder/[builder] and https://buildpacks.io/docs/concepts/components/buildpack/[buildpack] that is used by integration tests to verify the behavior of the Spring Boot build plugins. + +== Creating the builder + +* Install the https://buildpacks.io/docs/install-pack/[pack CLI] +* Authenticate to projects.registry.vmware.com via `docker login` +* Use the `build.sh` create the necessary images and push them to the registry + diff --git a/src/spring-boot-builder/build.sh b/src/spring-boot-builder/build.sh new file mode 100755 index 0000000000..aaeb7ec6f4 --- /dev/null +++ b/src/spring-boot-builder/build.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -x -eo pipefail + +docker pull paketobuildpacks/build:tiny-cnb +docker tag paketobuildpacks/build:tiny-cnb projects.registry.vmware.com/springboot/build:tiny-cnb +docker push projects.registry.vmware.com/springboot/build:tiny-cnb + +docker pull paketobuildpacks/run:tiny-cnb +docker tag paketobuildpacks/run:tiny-cnb projects.registry.vmware.com/springboot/run:tiny-cnb +docker push projects.registry.vmware.com/springboot/run:tiny-cnb + +cd builder +pack builder create projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 --config builder.toml +docker push projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.1 +cd - \ No newline at end of file diff --git a/src/spring-boot-builder/builder/builder.toml b/src/spring-boot-builder/builder/builder.toml new file mode 100644 index 0000000000..7088dcbd70 --- /dev/null +++ b/src/spring-boot-builder/builder/builder.toml @@ -0,0 +1,17 @@ +# Buildpacks to include in builder +[[buildpacks]] +id = "spring-boot/test-info" +version = "0.0.1" +uri = "../buildpacks/test-info" + +# Order used for detection +[[order]] +[[order.group]] +id = "spring-boot/test-info" +version = "0.0.1" + +# Stack that will be used by the builder +[stack] +id = "io.paketo.stacks.tiny" +build-image = "projects.registry.vmware.com/springboot/build:tiny-cnb" +run-image = "projects.registry.vmware.com/springboot/run:tiny-cnb" diff --git a/src/spring-boot-builder/buildpacks/test-info/bin/build b/src/spring-boot-builder/buildpacks/test-info/bin/build new file mode 100755 index 0000000000..a9317aa0c6 --- /dev/null +++ b/src/spring-boot-builder/buildpacks/test-info/bin/build @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +set -eo pipefail + +echo "---> Test Info buildpack building" + +# INPUT ARGUMENTS +platform_dir=$2 +env_dir=${platform_dir}/env +bindings_dir=${platform_dir}/bindings + +if [[ -f ${env_dir}/FORCE_FAILURE ]]; then + echo "Forced builder failure" + exit 1 +fi + +if compgen -G "${env_dir}/*" > /dev/null; then + for var in ${env_dir}/*; do + echo "env: $(basename ${var})=$(<${var})" + done +fi + +if compgen -G "${bindings_dir}/*" > /dev/null; then + for binding in ${bindings_dir}/*; do + for f in ${binding}/*; do + echo "binding: $(basename ${binding})/$(basename ${f})=$(<${f})" + done + done +fi + +echo "META-INF/MANIFEST.MF: " +if [[ -f META-INF/MANIFEST.MF ]]; then + cat META-INF/MANIFEST.MF +fi + +echo "---> Test Info buildpack done" diff --git a/src/spring-boot-builder/buildpacks/test-info/bin/detect b/src/spring-boot-builder/buildpacks/test-info/bin/detect new file mode 100755 index 0000000000..f7e1c76ebc --- /dev/null +++ b/src/spring-boot-builder/buildpacks/test-info/bin/detect @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -eo pipefail + +# 1. CHECK IF APPLICABLE +if [[ ! -f META-INF/MANIFEST.MF ]]; then + exit 100 +fi + +# 2. GET ARGS +plan_path=$2 + +# 3. DECLARE DEPENDENCIES (OPTIONAL) +cat >> "${plan_path}" <