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 }