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  }