github.com/GoogleContainerTools/skaffold@v1.39.18/pkg/skaffold/build/gcb/buildpacks_test.go (about) 1 /* 2 Copyright 2019 The Skaffold Authors 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package gcb 18 19 import ( 20 "context" 21 "testing" 22 23 "google.golang.org/api/cloudbuild/v1" 24 25 "github.com/GoogleContainerTools/skaffold/pkg/skaffold/platform" 26 "github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest" 27 "github.com/GoogleContainerTools/skaffold/pkg/skaffold/util" 28 "github.com/GoogleContainerTools/skaffold/testutil" 29 ) 30 31 func TestBuildpackBuildSpec(t *testing.T) { 32 tests := []struct { 33 description string 34 artifact *latest.BuildpackArtifact 35 expected cloudbuild.Build 36 shouldErr bool 37 }{ 38 { 39 description: "default run image", 40 artifact: &latest.BuildpackArtifact{ 41 Builder: "builder", 42 ProjectDescriptor: "project.toml", 43 }, 44 expected: cloudbuild.Build{ 45 Steps: []*cloudbuild.BuildStep{{ 46 Name: "pack/image", 47 Args: []string{"pack", "build", "img", "--builder", "builder"}, 48 }}, 49 Images: []string{"img"}, 50 }, 51 }, 52 { 53 description: "env variables", 54 artifact: &latest.BuildpackArtifact{ 55 Builder: "builder", 56 Env: []string{"KEY=VALUE", "FOO={{.BAR}}"}, 57 ProjectDescriptor: "project.toml", 58 }, 59 expected: cloudbuild.Build{ 60 Steps: []*cloudbuild.BuildStep{{ 61 Name: "pack/image", 62 Args: []string{"pack", "build", "img", "--builder", "builder", "--env", "KEY=VALUE", "--env", "FOO=bar"}, 63 }}, 64 Images: []string{"img"}, 65 }, 66 }, 67 { 68 description: "run image", 69 artifact: &latest.BuildpackArtifact{ 70 Builder: "otherbuilder", 71 RunImage: "run/image", 72 ProjectDescriptor: "project.toml", 73 }, 74 expected: cloudbuild.Build{ 75 Steps: []*cloudbuild.BuildStep{{ 76 Name: "pack/image", 77 Args: []string{"pack", "build", "img", "--builder", "otherbuilder", "--run-image", "run/image"}, 78 }}, 79 Images: []string{"img"}, 80 }, 81 }, 82 { 83 description: "custom build image", 84 artifact: &latest.BuildpackArtifact{ 85 Builder: "img2", 86 RunImage: "run/image", 87 ProjectDescriptor: "project.toml", 88 }, 89 expected: cloudbuild.Build{ 90 Steps: []*cloudbuild.BuildStep{{ 91 Name: "pack/image", 92 Args: []string{"pack", "build", "img", "--builder", "img2:tag", "--run-image", "run/image"}, 93 }}, 94 Images: []string{"img"}, 95 }, 96 }, 97 { 98 description: "custom run image", 99 artifact: &latest.BuildpackArtifact{ 100 Builder: "otherbuilder", 101 RunImage: "img3", 102 ProjectDescriptor: "project.toml", 103 }, 104 expected: cloudbuild.Build{ 105 Steps: []*cloudbuild.BuildStep{{ 106 Name: "pack/image", 107 Args: []string{"pack", "build", "img", "--builder", "otherbuilder", "--run-image", "img3:tag"}, 108 }}, 109 Images: []string{"img"}, 110 }, 111 }, 112 { 113 description: "custom build and run image", 114 artifact: &latest.BuildpackArtifact{ 115 Builder: "img2", 116 RunImage: "img3", 117 ProjectDescriptor: "project.toml", 118 }, 119 expected: cloudbuild.Build{ 120 Steps: []*cloudbuild.BuildStep{{ 121 Name: "pack/image", 122 Args: []string{"pack", "build", "img", "--builder", "img2:tag", "--run-image", "img3:tag"}, 123 }}, 124 Images: []string{"img"}, 125 }, 126 }, 127 { 128 description: "invalid env", 129 artifact: &latest.BuildpackArtifact{ 130 Builder: "builder", 131 Env: []string{"FOO={{INVALID}}"}, 132 }, 133 shouldErr: true, 134 }, 135 { 136 description: "buildpacks list", 137 artifact: &latest.BuildpackArtifact{ 138 Builder: "builder", 139 Buildpacks: []string{"buildpack1", "buildpack2"}, 140 ProjectDescriptor: "project.toml", 141 }, 142 expected: cloudbuild.Build{ 143 Steps: []*cloudbuild.BuildStep{{ 144 Name: "pack/image", 145 Args: []string{"pack", "build", "img", "--builder", "builder", "--buildpack", "buildpack1", "--buildpack", "buildpack2"}, 146 }}, 147 Images: []string{"img"}, 148 }, 149 }, 150 { 151 description: "trusted builder", 152 artifact: &latest.BuildpackArtifact{ 153 Builder: "builder", 154 ProjectDescriptor: "project.toml", 155 TrustBuilder: true, 156 }, 157 expected: cloudbuild.Build{ 158 Steps: []*cloudbuild.BuildStep{{ 159 Name: "pack/image", 160 Args: []string{"pack", "build", "img", "--builder", "builder", "--trust-builder"}, 161 }}, 162 Images: []string{"img"}, 163 }, 164 }, 165 { 166 description: "project descriptor", 167 artifact: &latest.BuildpackArtifact{ 168 Builder: "builder", 169 ProjectDescriptor: "non-default.toml", 170 }, 171 expected: cloudbuild.Build{ 172 Steps: []*cloudbuild.BuildStep{{ 173 Name: "pack/image", 174 Args: []string{"pack", "build", "img", "--builder", "builder", "--descriptor", "non-default.toml"}, 175 }}, 176 Images: []string{"img"}, 177 }, 178 }, 179 } 180 for _, test := range tests { 181 testutil.Run(t, test.description, func(t *testutil.T) { 182 t.Override(&util.OSEnviron, func() []string { return []string{"BAR=bar"} }) 183 184 artifact := &latest.Artifact{ 185 ImageName: "img", 186 ArtifactType: latest.ArtifactType{ 187 BuildpackArtifact: test.artifact, 188 }, 189 Dependencies: []*latest.ArtifactDependency{{ImageName: "img2", Alias: "img2"}, {ImageName: "img3", Alias: "img3"}}, 190 } 191 store := mockArtifactStore{ 192 "img2": "img2:tag", 193 "img3": "img3:tag", 194 } 195 builder := NewBuilder(&mockBuilderContext{artifactStore: store}, &latest.GoogleCloudBuild{ 196 PackImage: "pack/image", 197 }) 198 buildSpec, err := builder.buildSpec(context.Background(), artifact, "img", platform.Matcher{}, "bucket", "object") 199 t.CheckError(test.shouldErr, err) 200 201 if !test.shouldErr { 202 t.CheckDeepEqual(test.expected.Steps, buildSpec.Steps) 203 t.CheckDeepEqual(test.expected.Images, buildSpec.Images) 204 } 205 }) 206 } 207 }