@ -32,7 +32,7 @@ import org.springframework.boot.buildpack.platform.docker.DockerApi.ImageApi;
@@ -32,7 +32,7 @@ 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.DockerLog ;
import org.springframework.boot.buildpack.platform.docker.TotalProgressPullListener ;
import org.springframework.boot.buildpack.platform.docker.configuration.DockerConfigur ation ;
import org.springframework.boot.buildpack.platform.docker.configuration.DockerRegistryAuthentic ation ;
import org.springframework.boot.buildpack.platform.docker.transport.DockerEngineException ;
import org.springframework.boot.buildpack.platform.docker.type.Binding ;
import org.springframework.boot.buildpack.platform.docker.type.ContainerReference ;
@ -49,6 +49,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
@@ -49,6 +49,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
import static org.assertj.core.api.Assertions.assertThatIllegalStateException ;
import static org.assertj.core.api.Assertions.assertThatNoException ;
import static org.mockito.ArgumentMatchers.any ;
import static org.mockito.ArgumentMatchers.argThat ;
import static org.mockito.ArgumentMatchers.eq ;
import static org.mockito.ArgumentMatchers.isNull ;
import static org.mockito.BDDMockito.given ;
@ -66,6 +67,15 @@ import static org.mockito.Mockito.times;
@@ -66,6 +67,15 @@ import static org.mockito.Mockito.times;
* /
class BuilderTests {
private static final ImageReference PAKETO_BUILDPACKS_BUILDER = ImageReference
. of ( "gcr.io/paketo-buildpacks/builder" ) ;
private static final ImageReference LATEST_PAKETO_BUILDPACKS_BUILDER = PAKETO_BUILDPACKS_BUILDER . inTaggedForm ( ) ;
private static final ImageReference DEFAULT_BUILDER = ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ;
private static final ImageReference BASE_CNB = ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ;
@Test
void createWhenLogIsNullThrowsException ( ) {
assertThatIllegalArgumentException ( ) . isThrownBy ( ( ) - > new Builder ( ( BuildLog ) null ) )
@ -108,12 +118,9 @@ class BuilderTests {
@@ -108,12 +118,9 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( BASE_CNB ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , null ) ;
BuildRequest request = getTestRequest ( ) ;
@ -121,11 +128,8 @@ class BuilderTests {
@@ -121,11 +128,8 @@ class BuilderTests {
assertThat ( out . toString ( ) ) . contains ( "Running creator" ) ;
assertThat ( out . toString ( ) ) . contains ( "Successfully built image 'docker.io/library/my-application:latest'" ) ;
ArgumentCaptor < ImageArchive > archive = ArgumentCaptor . forClass ( ImageArchive . class ) ;
then ( docker . image ( ) ) . should ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) , isNull ( ) ) ;
then ( docker . image ( ) ) . should ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , isNull ( ) ) ;
then ( docker . image ( ) ) . should ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) ;
then ( docker . image ( ) ) . should ( ) . pull ( eq ( BASE_CNB ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , isNull ( ) ) ;
then ( docker . image ( ) ) . should ( ) . load ( archive . capture ( ) , any ( ) ) ;
then ( docker . image ( ) ) . should ( ) . remove ( archive . getValue ( ) . getTag ( ) , true ) ;
then ( docker . image ( ) ) . shouldHaveNoMoreInteractions ( ) ;
@ -137,16 +141,14 @@ class BuilderTests {
@@ -137,16 +141,14 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
DockerConfiguration dockerConfiguration = new DockerConfiguration ( )
. withBuilderRegistryTokenAuthentication ( "builder token" )
. withPublishRegistryTokenAuthentication ( "publish token" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) ,
eq ( dockerConfiguration . getBuilderRegistryAuthentication ( ) . getAuthHeader ( ) ) ) )
DockerRegistryAuthentication builderToken = DockerRegistryAuthentication . token ( "builder token" ) ;
DockerRegistryAuthentication publishToken = DockerRegistryAuthentication . token ( "publish token" ) ;
BuilderDockerConfiguration dockerConfiguration = new BuilderDockerConfiguration ( )
. withBuilderRegistryAuthentication ( builderToken )
. withPublishRegistryAuthentication ( publishToken ) ;
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , regAuthEq ( builderToken ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , eq ( dockerConfiguration . getBuilderRegistryAuthentication ( ) . getAuthHeader ( ) ) ) )
given ( docker . image ( ) . pull ( eq ( BASE_CNB ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , regAuthEq ( builderToken ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , dockerConfiguration ) ;
BuildRequest request = getTestRequest ( ) . withPublish ( true ) ;
@ -154,15 +156,10 @@ class BuilderTests {
@@ -154,15 +156,10 @@ class BuilderTests {
assertThat ( out . toString ( ) ) . contains ( "Running creator" ) ;
assertThat ( out . toString ( ) ) . contains ( "Successfully built image 'docker.io/library/my-application:latest'" ) ;
ArgumentCaptor < ImageArchive > archive = ArgumentCaptor . forClass ( ImageArchive . class ) ;
then ( docker . image ( ) ) . should ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , regAuthEq ( builderToken ) ) ;
then ( docker . image ( ) ) . should ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) ,
eq ( dockerConfiguration . getBuilderRegistryAuthentication ( ) . getAuthHeader ( ) ) ) ;
then ( docker . image ( ) ) . should ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , eq ( dockerConfiguration . getBuilderRegistryAuthentication ( ) . getAuthHeader ( ) ) ) ;
then ( docker . image ( ) ) . should ( )
. push ( eq ( request . getName ( ) ) , any ( ) ,
eq ( dockerConfiguration . getPublishRegistryAuthentication ( ) . getAuthHeader ( ) ) ) ;
. pull ( eq ( BASE_CNB ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , regAuthEq ( builderToken ) ) ;
then ( docker . image ( ) ) . should ( ) . push ( eq ( request . getName ( ) ) , any ( ) , regAuthEq ( publishToken ) ) ;
then ( docker . image ( ) ) . should ( ) . load ( archive . capture ( ) , any ( ) ) ;
then ( docker . image ( ) ) . should ( ) . remove ( archive . getValue ( ) . getTag ( ) , true ) ;
then ( docker . image ( ) ) . shouldHaveNoMoreInteractions ( ) ;
@ -174,15 +171,14 @@ class BuilderTests {
@@ -174,15 +171,14 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image-with-no-run-image-tag.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "gcr.io/paketo-buildpacks/builder:latest" ) ) , isNull ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( LATEST_PAKETO_BUILDPACKS_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:latest" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , null ) ;
BuildRequest request = getTestRequest ( ) . withBuilder ( ImageReference . of ( "gcr.io/paketo-buildpacks/builder" ) ) ;
BuildRequest request = getTestRequest ( ) . withBuilder ( PAKETO_BUILDPACKS_BUILDER ) ;
builder . build ( request ) ;
assertThat ( out . toString ( ) ) . contains ( "Running creator" ) ;
assertThat ( out . toString ( ) ) . contains ( "Successfully built image 'docker.io/library/my-application:latest'" ) ;
@ -197,8 +193,7 @@ class BuilderTests {
@@ -197,8 +193,7 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image-with-run-image-digest.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference
@ -221,15 +216,12 @@ class BuilderTests {
@@ -221,15 +216,12 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image-with-empty-stack.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "gcr.io/paketo-buildpacks/builder:latest" ) ) , isNull ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( LATEST_PAKETO_BUILDPACKS_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( BASE_CNB ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , null ) ;
BuildRequest request = getTestRequest ( ) . withBuilder ( ImageReference . of ( "gcr.io/paketo-buildpacks/builder" ) ) ;
BuildRequest request = getTestRequest ( ) . withBuilder ( PAKETO_BUILDPACKS_BUILDER ) ;
builder . build ( request ) ;
assertThat ( out . toString ( ) ) . contains ( "Running creator" ) ;
assertThat ( out . toString ( ) ) . contains ( "Successfully built image 'docker.io/library/my-application:latest'" ) ;
@ -244,8 +236,7 @@ class BuilderTests {
@@ -244,8 +236,7 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "example.com/custom/run:latest" ) ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) ,
@ -267,17 +258,12 @@ class BuilderTests {
@@ -267,17 +258,12 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( BASE_CNB ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
given ( docker . image ( ) . inspect ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) ) )
. willReturn ( builderImage ) ;
given ( docker . image ( ) . inspect ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) ) )
. willReturn ( runImage ) ;
given ( docker . image ( ) . inspect ( eq ( DEFAULT_BUILDER ) ) ) . willReturn ( builderImage ) ;
given ( docker . image ( ) . inspect ( eq ( BASE_CNB ) ) ) . willReturn ( runImage ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , null ) ;
BuildRequest request = getTestRequest ( ) . withPullPolicy ( PullPolicy . NEVER ) ;
builder . build ( request ) ;
@ -296,17 +282,12 @@ class BuilderTests {
@@ -296,17 +282,12 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( BASE_CNB ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
given ( docker . image ( ) . inspect ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) ) )
. willReturn ( builderImage ) ;
given ( docker . image ( ) . inspect ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) ) )
. willReturn ( runImage ) ;
given ( docker . image ( ) . inspect ( eq ( DEFAULT_BUILDER ) ) ) . willReturn ( builderImage ) ;
given ( docker . image ( ) . inspect ( eq ( BASE_CNB ) ) ) . willReturn ( runImage ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , null ) ;
BuildRequest request = getTestRequest ( ) . withPullPolicy ( PullPolicy . ALWAYS ) ;
builder . build ( request ) ;
@ -325,18 +306,15 @@ class BuilderTests {
@@ -325,18 +306,15 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( BASE_CNB ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
given ( docker . image ( ) . inspect ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) ) )
given ( docker . image ( ) . inspect ( eq ( DEFAULT_BUILDER ) ) )
. willThrow (
new DockerEngineException ( "docker://localhost/" , new URI ( "example" ) , 404 , "NOT FOUND" , null , null ) )
. willReturn ( builderImage ) ;
given ( docker . image ( ) . inspect ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) ) )
given ( docker . image ( ) . inspect ( eq ( BASE_CNB ) ) )
. willThrow (
new DockerEngineException ( "docker://localhost/" , new URI ( "example" ) , 404 , "NOT FOUND" , null , null ) )
. willReturn ( runImage ) ;
@ -358,12 +336,9 @@ class BuilderTests {
@@ -358,12 +336,9 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( BASE_CNB ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , null ) ;
BuildRequest request = getTestRequest ( ) . withTags ( ImageReference . of ( "my-application:1.2.3" ) ) ;
@ -383,37 +358,31 @@ class BuilderTests {
@@ -383,37 +358,31 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
DockerConfiguration dockerConfiguration = new DockerConfiguration ( )
. withBuilderRegistryTokenAuthentication ( "builder token" )
. withPublishRegistryTokenAuthentication ( "publish token" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) ,
eq ( dockerConfiguration . getBuilderRegistryAuthentication ( ) . getAuthHeader ( ) ) ) )
DockerRegistryAuthentication builderToken = DockerRegistryAuthentication . token ( "builder token" ) ;
DockerRegistryAuthentication publishToken = DockerRegistryAuthentication . token ( "publish token" ) ;
BuilderDockerConfiguration dockerConfiguration = new BuilderDockerConfiguration ( )
. withBuilderRegistryAuthentication ( builderToken )
. withPublishRegistryAuthentication ( publishToken ) ;
ImageReference defaultBuilderImageReference = DEFAULT_BUILDER ;
given ( docker . image ( ) . pull ( eq ( defaultBuilderImageReference ) , isNull ( ) , any ( ) , regAuthEq ( builderToken ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
ImageReference baseImageReference = BASE_CNB ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , eq ( dockerConfiguration . getBuilderRegistryAuthentication ( ) . getAuthHeader ( ) ) ) )
. pull ( eq ( baseImageReference ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , regAuthEq ( builderToken ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , dockerConfiguration ) ;
BuildRequest request = getTestRequest ( ) . withPublish ( true ) . withTags ( ImageReference . of ( "my-application:1.2.3" ) ) ;
ImageReference builtImageReference = ImageReference . of ( "my-application:1.2.3" ) ;
BuildRequest request = getTestRequest ( ) . withPublish ( true ) . withTags ( builtImageReference ) ;
builder . build ( request ) ;
assertThat ( out . toString ( ) ) . contains ( "Running creator" ) ;
assertThat ( out . toString ( ) ) . contains ( "Successfully built image 'docker.io/library/my-application:latest'" ) ;
assertThat ( out . toString ( ) ) . contains ( "Successfully created image tag 'docker.io/library/my-application:1.2.3'" ) ;
then ( docker . image ( ) ) . should ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) ,
eq ( dockerConfiguration . getBuilderRegistryAuthentication ( ) . getAuthHeader ( ) ) ) ;
then ( docker . image ( ) ) . should ( ) . pull ( eq ( defaultBuilderImageReference ) , isNull ( ) , any ( ) , regAuthEq ( builderToken ) ) ;
then ( docker . image ( ) ) . should ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , eq ( dockerConfiguration . getBuilderRegistryAuthentication ( ) . getAuthHeader ( ) ) ) ;
then ( docker . image ( ) ) . should ( )
. push ( eq ( request . getName ( ) ) , any ( ) ,
eq ( dockerConfiguration . getPublishRegistryAuthentication ( ) . getAuthHeader ( ) ) ) ;
then ( docker . image ( ) ) . should ( ) . tag ( eq ( request . getName ( ) ) , eq ( ImageReference . of ( "my-application:1.2.3" ) ) ) ;
then ( docker . image ( ) ) . should ( )
. push ( eq ( ImageReference . of ( "my-application:1.2.3" ) ) , any ( ) ,
eq ( dockerConfiguration . getPublishRegistryAuthentication ( ) . getAuthHeader ( ) ) ) ;
. pull ( eq ( baseImageReference ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , regAuthEq ( builderToken ) ) ;
then ( docker . image ( ) ) . should ( ) . push ( eq ( request . getName ( ) ) , any ( ) , regAuthEq ( publishToken ) ) ;
then ( docker . image ( ) ) . should ( ) . tag ( eq ( request . getName ( ) ) , eq ( builtImageReference ) ) ;
then ( docker . image ( ) ) . should ( ) . push ( eq ( builtImageReference ) , any ( ) , regAuthEq ( publishToken ) ) ;
ArgumentCaptor < ImageArchive > archive = ArgumentCaptor . forClass ( ImageArchive . class ) ;
then ( docker . image ( ) ) . should ( ) . load ( archive . capture ( ) , any ( ) ) ;
then ( docker . image ( ) ) . should ( ) . remove ( archive . getValue ( ) . getTag ( ) , true ) ;
@ -427,22 +396,17 @@ class BuilderTests {
@@ -427,22 +396,17 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( platform ) ;
Image builderImage = loadImage ( "image-with-platform.json" ) ;
Image runImage = loadImage ( "run-image-with-platform.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , eq ( platform ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , eq ( platform ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( platform ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
given ( docker . image ( ) . pull ( eq ( BASE_CNB ) , eq ( platform ) , any ( ) , isNull ( ) ) ) . willAnswer ( withPulledImage ( runImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , null ) ;
BuildRequest request = getTestRequest ( ) . withImagePlatform ( "linux/arm64/v1" ) ;
builder . build ( request ) ;
assertThat ( out . toString ( ) ) . contains ( "Running creator" ) ;
assertThat ( out . toString ( ) ) . contains ( "Successfully built image 'docker.io/library/my-application:latest'" ) ;
ArgumentCaptor < ImageArchive > archive = ArgumentCaptor . forClass ( ImageArchive . class ) ;
then ( docker . image ( ) ) . should ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , eq ( platform ) , any ( ) , isNull ( ) ) ;
then ( docker . image ( ) ) . should ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( platform ) , any ( ) , isNull ( ) ) ;
then ( docker . image ( ) ) . should ( ) . pull ( eq ( DEFAULT_BUILDER ) , eq ( platform ) , any ( ) , isNull ( ) ) ;
then ( docker . image ( ) ) . should ( ) . pull ( eq ( BASE_CNB ) , eq ( platform ) , any ( ) , isNull ( ) ) ;
then ( docker . image ( ) ) . should ( ) . load ( archive . capture ( ) , any ( ) ) ;
then ( docker . image ( ) ) . should ( ) . remove ( archive . getValue ( ) . getTag ( ) , true ) ;
then ( docker . image ( ) ) . shouldHaveNoMoreInteractions ( ) ;
@ -454,12 +418,9 @@ class BuilderTests {
@@ -454,12 +418,9 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
Image runImage = loadImage ( "run-image-with-bad-stack.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( BASE_CNB ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , null ) ;
BuildRequest request = getTestRequest ( ) ;
@ -474,12 +435,9 @@ class BuilderTests {
@@ -474,12 +435,9 @@ class BuilderTests {
DockerApi docker = mockDockerApiLifecycleError ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( BASE_CNB ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , null ) ;
BuildRequest request = getTestRequest ( ) ;
@ -492,11 +450,11 @@ class BuilderTests {
@@ -492,11 +450,11 @@ class BuilderTests {
TestPrintStream out = new TestPrintStream ( ) ;
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image-with-run-image-different-registry.json" ) ;
DockerConfiguration dockerConfiguration = new DockerConfiguration ( )
. withBuilderRegistryTokenAuthentication ( "builder token" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , any ( ) , any ( ) ,
eq ( dockerConfiguration . getBuilderRegistryAuthentication ( ) . getAuthHeader ( ) ) ) )
DockerRegistryAuthentication builderToken = DockerRegistryAuthentication . token ( "builder token" ) ;
BuilderDockerConfiguration dockerConfiguration = new BuilderDockerConfiguration ( )
. withBuilderRegistryAuthentication ( builderToken ) ;
ImageReference builderImageReference = DEFAULT_BUILDER ;
given ( docker . image ( ) . pull ( eq ( builderImageReference ) , any ( ) , any ( ) , regAuthEq ( builderToken ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , dockerConfiguration ) ;
BuildRequest request = getTestRequest ( ) ;
@ -510,11 +468,10 @@ class BuilderTests {
@@ -510,11 +468,10 @@ class BuilderTests {
TestPrintStream out = new TestPrintStream ( ) ;
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
DockerConfiguration dockerConfiguration = new DockerConfiguration ( )
. withBuilderRegistryTokenAuthentication ( "builder token" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , any ( ) , any ( ) ,
eq ( dockerConfiguration . getBuilderRegistryAuthentication ( ) . getAuthHeader ( ) ) ) )
DockerRegistryAuthentication builderToken = DockerRegistryAuthentication . token ( "builder token" ) ;
BuilderDockerConfiguration dockerConfiguration = new BuilderDockerConfiguration ( )
. withBuilderRegistryAuthentication ( builderToken ) ;
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , any ( ) , any ( ) , regAuthEq ( builderToken ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , dockerConfiguration ) ;
BuildRequest request = getTestRequest ( ) . withRunImage ( ImageReference . of ( "example.com/custom/run:latest" ) ) ;
@ -529,11 +486,9 @@ class BuilderTests {
@@ -529,11 +486,9 @@ class BuilderTests {
DockerApi docker = mockDockerApiLifecycleError ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , any ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , any ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( ) . pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , any ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
given ( docker . image ( ) . pull ( eq ( BASE_CNB ) , any ( ) , any ( ) , isNull ( ) ) ) . willAnswer ( withPulledImage ( runImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , null ) ;
BuildpackReference reference = BuildpackReference . of ( "urn:cnb:builder:example/buildpack@1.2.3" ) ;
BuildRequest request = getTestRequest ( ) . withBuildpacks ( reference ) ;
@ -548,12 +503,9 @@ class BuilderTests {
@@ -548,12 +503,9 @@ class BuilderTests {
DockerApi docker = mockDockerApi ( ) ;
Image builderImage = loadImage ( "image.json" ) ;
Image runImage = loadImage ( "run-image.json" ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( BuildRequest . DEFAULT_BUILDER_IMAGE_REF ) ) , isNull ( ) , any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( DEFAULT_BUILDER ) , isNull ( ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( builderImage ) ) ;
given ( docker . image ( )
. pull ( eq ( ImageReference . of ( "docker.io/cloudfoundry/run:base-cnb" ) ) , eq ( ImagePlatform . from ( builderImage ) ) ,
any ( ) , isNull ( ) ) )
given ( docker . image ( ) . pull ( eq ( BASE_CNB ) , eq ( ImagePlatform . from ( builderImage ) ) , any ( ) , isNull ( ) ) )
. willAnswer ( withPulledImage ( runImage ) ) ;
Builder builder = new Builder ( BuildLog . to ( out ) , docker , null ) ;
BuildRequest request = getTestRequest ( ) . withBindings ( Binding . from ( "/host" , "/cnb" ) ) ;
@ -611,7 +563,10 @@ class BuilderTests {
@@ -611,7 +563,10 @@ class BuilderTests {
listener . onFinish ( ) ;
return image ;
} ;
}
private static String regAuthEq ( DockerRegistryAuthentication authentication ) {
return argThat ( authentication . getAuthHeader ( ) : : equals ) ;
}
static class TestPrintStream extends PrintStream {