github.com/GoogleContainerTools/skaffold@v1.39.18/pkg/skaffold/build/gcb/jib_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  	"os"
    22  	"path/filepath"
    23  	"testing"
    24  
    25  	v1 "github.com/opencontainers/image-spec/specs-go/v1"
    26  	"google.golang.org/api/cloudbuild/v1"
    27  
    28  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/build/jib"
    29  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/platform"
    30  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest"
    31  	"github.com/GoogleContainerTools/skaffold/testutil"
    32  )
    33  
    34  func TestMain(m *testing.M) {
    35  	// these tests don't actually require a JVM
    36  	jib.JVMFound = func(context.Context) bool { return true }
    37  	os.Exit(m.Run())
    38  }
    39  
    40  func TestJibMavenBuildSpec(t *testing.T) {
    41  	tests := []struct {
    42  		description  string
    43  		skipTests    bool
    44  		baseImage    string
    45  		platforms    platform.Matcher
    46  		expectedArgs []string
    47  	}{
    48  		{
    49  			description:  "skip tests",
    50  			skipTests:    true,
    51  			expectedArgs: []string{"-c", "mvn -Duser.home=$$HOME --batch-mode jib:_skaffold-fail-if-jib-out-of-date -Djib.requiredVersion=" + jib.MinimumJibMavenVersion + " --non-recursive -DskipTests=true prepare-package jib:build -Dimage=img"},
    52  		},
    53  		{
    54  			description:  "do not skip tests",
    55  			skipTests:    false,
    56  			expectedArgs: []string{"-c", "mvn -Duser.home=$$HOME --batch-mode jib:_skaffold-fail-if-jib-out-of-date -Djib.requiredVersion=" + jib.MinimumJibMavenVersion + " --non-recursive prepare-package jib:build -Dimage=img"},
    57  		},
    58  		{
    59  			description:  "custom base image",
    60  			baseImage:    "busybox",
    61  			skipTests:    false,
    62  			expectedArgs: []string{"-c", "mvn -Duser.home=$$HOME --batch-mode jib:_skaffold-fail-if-jib-out-of-date -Djib.requiredVersion=" + jib.MinimumJibMavenVersion + " --non-recursive prepare-package jib:build -Djib.from.image=busybox -Dimage=img"},
    63  		},
    64  		{
    65  			description:  "custom base image from required artifacts",
    66  			baseImage:    "img2",
    67  			skipTests:    false,
    68  			expectedArgs: []string{"-c", "mvn -Duser.home=$$HOME --batch-mode jib:_skaffold-fail-if-jib-out-of-date -Djib.requiredVersion=" + jib.MinimumJibMavenVersion + " --non-recursive prepare-package jib:build -Djib.from.image=img2:tag -Dimage=img"},
    69  		},
    70  		{
    71  			description:  "cross platform",
    72  			platforms:    platform.Matcher{Platforms: []v1.Platform{{Architecture: "arm", OS: "freebsd"}}},
    73  			expectedArgs: []string{"-c", "mvn -Duser.home=$$HOME --batch-mode jib:_skaffold-fail-if-jib-out-of-date -Djib.requiredVersion=" + jib.MinimumJibMavenVersionForCrossPlatform + " --non-recursive prepare-package jib:build -Djib.from.platforms=freebsd/arm -Dimage=img"},
    74  		},
    75  		{
    76  			description:  "multi platform",
    77  			platforms:    platform.Matcher{Platforms: []v1.Platform{{Architecture: "arm", OS: "freebsd"}, {Architecture: "arm64", OS: "linux"}}},
    78  			expectedArgs: []string{"-c", "mvn -Duser.home=$$HOME --batch-mode jib:_skaffold-fail-if-jib-out-of-date -Djib.requiredVersion=" + jib.MinimumJibMavenVersionForCrossPlatform + " --non-recursive prepare-package jib:build -Djib.from.platforms=freebsd/arm,linux/arm64 -Dimage=img"},
    79  		},
    80  	}
    81  	for _, test := range tests {
    82  		testutil.Run(t, test.description, func(t *testutil.T) {
    83  			artifact := &latest.Artifact{
    84  				ArtifactType: latest.ArtifactType{
    85  					JibArtifact: &latest.JibArtifact{Type: string(jib.JibMaven), BaseImage: test.baseImage},
    86  				},
    87  				Dependencies: []*latest.ArtifactDependency{
    88  					{ImageName: "img2", Alias: "img2"},
    89  					{ImageName: "img3", Alias: "img3"},
    90  				},
    91  			}
    92  
    93  			store := mockArtifactStore{
    94  				"img2": "img2:tag",
    95  				"img3": "img3:tag",
    96  			}
    97  			builder := NewBuilder(&mockBuilderContext{artifactStore: store}, &latest.GoogleCloudBuild{
    98  				MavenImage: "maven:3.6.0",
    99  			})
   100  			builder.skipTests = test.skipTests
   101  
   102  			buildSpec, err := builder.buildSpec(context.Background(), artifact, "img", test.platforms, "bucket", "object")
   103  			t.CheckNoError(err)
   104  
   105  			expected := []*cloudbuild.BuildStep{{
   106  				Entrypoint: "sh",
   107  				Name:       "maven:3.6.0",
   108  				Args:       test.expectedArgs,
   109  			}}
   110  
   111  			t.CheckDeepEqual(expected, buildSpec.Steps)
   112  			t.CheckEmpty(buildSpec.Images)
   113  		})
   114  	}
   115  }
   116  
   117  func TestJibGradleBuildSpec(t *testing.T) {
   118  	tests := []struct {
   119  		description  string
   120  		skipTests    bool
   121  		platforms    platform.Matcher
   122  		expectedArgs []string
   123  	}{
   124  		{
   125  			description:  "skip tests",
   126  			skipTests:    true,
   127  			expectedArgs: []string{"-c", "gradle -Duser.home=$$HOME --console=plain _skaffoldFailIfJibOutOfDate -Djib.requiredVersion=" + jib.MinimumJibGradleVersion + " :jib -x test --image=img"},
   128  		},
   129  		{
   130  			description:  "do not skip tests",
   131  			skipTests:    false,
   132  			expectedArgs: []string{"-c", "gradle -Duser.home=$$HOME --console=plain _skaffoldFailIfJibOutOfDate -Djib.requiredVersion=" + jib.MinimumJibGradleVersion + " :jib --image=img"},
   133  		},
   134  		{
   135  			description:  "cross platform",
   136  			platforms:    platform.Matcher{Platforms: []v1.Platform{{Architecture: "arm", OS: "freebsd"}}},
   137  			expectedArgs: []string{"-c", "gradle -Duser.home=$$HOME --console=plain _skaffoldFailIfJibOutOfDate -Djib.requiredVersion=" + jib.MinimumJibGradleVersionForCrossPlatform + " :jib -Djib.from.platforms=freebsd/arm --image=img"},
   138  		},
   139  		{
   140  			description:  "multi platform",
   141  			platforms:    platform.Matcher{Platforms: []v1.Platform{{Architecture: "arm", OS: "freebsd"}, {Architecture: "arm64", OS: "linux"}}},
   142  			expectedArgs: []string{"-c", "gradle -Duser.home=$$HOME --console=plain _skaffoldFailIfJibOutOfDate -Djib.requiredVersion=" + jib.MinimumJibGradleVersionForCrossPlatform + " :jib -Djib.from.platforms=freebsd/arm,linux/arm64 --image=img"},
   143  		},
   144  	}
   145  	for _, test := range tests {
   146  		testutil.Run(t, test.description, func(t *testutil.T) {
   147  			artifact := &latest.Artifact{
   148  				ArtifactType: latest.ArtifactType{
   149  					JibArtifact: &latest.JibArtifact{Type: string(jib.JibGradle)},
   150  				},
   151  			}
   152  
   153  			builder := NewBuilder(&mockBuilderContext{}, &latest.GoogleCloudBuild{
   154  				GradleImage: "gradle:5.1.1",
   155  			})
   156  			builder.skipTests = test.skipTests
   157  
   158  			buildSpec, err := builder.buildSpec(context.Background(), artifact, "img", test.platforms, "bucket", "object")
   159  			t.CheckNoError(err)
   160  
   161  			expected := []*cloudbuild.BuildStep{{
   162  				Entrypoint: "sh",
   163  				Name:       "gradle:5.1.1",
   164  				Args:       test.expectedArgs,
   165  			}}
   166  
   167  			t.CheckDeepEqual(expected, buildSpec.Steps)
   168  			t.CheckEmpty(buildSpec.Images)
   169  		})
   170  	}
   171  }
   172  
   173  func TestJibAddWorkspaceToDependencies(t *testing.T) {
   174  	tests := []struct {
   175  		description       string
   176  		workspacePaths    []string
   177  		dependencies      []string
   178  		expectedWorkspace []string
   179  	}{
   180  		{
   181  			description:       "basic test",
   182  			workspacePaths:    []string{"a/b/file", "c/file", "file"},
   183  			dependencies:      []string{"dependencyA", "dependencyB"},
   184  			expectedWorkspace: []string{"", "/a", "/a/b", "/a/b/file", "/c", "/c/file", "/file"},
   185  		},
   186  		{
   187  			description:       "ignore target with pom",
   188  			workspacePaths:    []string{"pom.xml", "target/fileA", "target/fileB", "watchedFile"},
   189  			dependencies:      []string{"dependencyA", "dependencyB"},
   190  			expectedWorkspace: []string{"", "/pom.xml", "/watchedFile"},
   191  		},
   192  		{
   193  			description:       "don't ignore target without pom",
   194  			workspacePaths:    []string{"target/fileA", "target/fileB", "watchedFile"},
   195  			dependencies:      []string{"dependencyA", "dependencyB"},
   196  			expectedWorkspace: []string{"", "/target", "/target/fileA", "/target/fileB", "/watchedFile"},
   197  		},
   198  		{
   199  			description:       "ignore build with build.gradle",
   200  			workspacePaths:    []string{"build.gradle", "build/fileA", "build/fileB", "watchedFile"},
   201  			dependencies:      []string{"dependencyA", "dependencyB"},
   202  			expectedWorkspace: []string{"", "/build.gradle", "/watchedFile"},
   203  		},
   204  		{
   205  			description:       "don't ignore build without build.gradle",
   206  			workspacePaths:    []string{"build/fileA", "build/fileB", "watchedFile"},
   207  			dependencies:      []string{"dependencyA", "dependencyB"},
   208  			expectedWorkspace: []string{"", "/build", "/build/fileA", "/build/fileB", "/watchedFile"},
   209  		},
   210  	}
   211  	for _, test := range tests {
   212  		testutil.Run(t, test.description, func(t *testutil.T) {
   213  			tmpDir := t.NewTempDir()
   214  			for _, f := range test.workspacePaths {
   215  				tmpDir.Write(filepath.FromSlash(f), "")
   216  			}
   217  
   218  			for i := range test.expectedWorkspace {
   219  				test.expectedWorkspace[i] = tmpDir.Root() + filepath.FromSlash(test.expectedWorkspace[i])
   220  			}
   221  			expectedDependencies := append(test.dependencies, test.expectedWorkspace...)
   222  
   223  			actualDepedencies, err := jibAddWorkspaceToDependencies(tmpDir.Root(), test.dependencies)
   224  
   225  			t.CheckNoError(err)
   226  			t.CheckDeepEqual(expectedDependencies, actualDepedencies)
   227  		})
   228  	}
   229  }