@@ -179,104 +179,113 @@ func runPushTest(containerManager container.ContainerManagerType, imageName, mod
179179 validateContainerBuild (tests .DockerBuildName , buildNumber , imagePath , module , 7 , 5 , 7 , t )
180180}
181181
182- // This test validate the collect build-info flow for fat-manifest images.
183- // The way we build the fat manifest and push it to Artifactory is not important.
184- // Therefore, this test runs only with docker.
185- func TestPushFatManifestImage (t * testing.T ) {
186- if ! * tests .TestDocker {
187- t .Skip ("Skipping test. To run it, add the '-test.docker=true' option." )
188- }
189- buildName := "push-fat-manifest" + tests .DockerBuildName
182+ // Common Methods
190183
191- // Create temp test dir.
184+ func setupWorkspace ( t * testing. T ) ( string , error ) {
192185 workspace , err := filepath .Abs (tests .Out )
193- assert .NoError (t , err )
194- assert .NoError (t , fileutils .CreateDirIfNotExist (workspace ))
186+ if err != nil {
187+ return "" , err
188+ }
189+ err = fileutils .CreateDirIfNotExist (workspace )
190+ if err != nil {
191+ return "" , err
192+ }
195193 testDataDir := filepath .Join (filepath .FromSlash (tests .GetTestResourcesPath ()), "docker" )
196194 files , err := os .ReadDir (testDataDir )
197-
198- assert .NoError (t , err )
195+ if err != nil {
196+ return "" , err
197+ }
199198 for _ , file := range files {
200199 if ! file .IsDir () {
201200 _ , err := tests .ReplaceTemplateVariables (filepath .Join (testDataDir , file .Name ()), tests .Out )
202- assert .NoError (t , err )
201+ if err != nil {
202+ return "" , err
203+ }
203204 }
204205 }
205- // Build the builder image locally.
206+ return workspace , nil
207+ }
208+
209+ func setupContainer (workspace , containerName string ) (* tests.ContainerRequest , error ) {
206210 ctx := context .Background ()
207- testContainer , err := tests .NewContainerRequest ().
211+ testContainerRequest , _ := tests .NewContainerRequest ().
208212 SetDockerfile (workspace , "Dockerfile.Buildx.Fatmanifest" , nil ).
209213 Privileged ().
210214 Networks (rtNetwork ).
211- Name ("buildx_container" ).
215+ Name (containerName ).
212216 Mount (mount.Mount {Type : mount .TypeBind , Source : workspace , Target : "/workspace" , ReadOnly : false }).
213217 Cmd ("--insecure-registry" , tests .RtContainerHostName ).
214- // Docker daemon take times to load. In order to check if it's available we wait for a log message to indications that the Docker daemon has finished initializing.
215218 WaitFor (wait .ForLog ("API listen on /var/run/docker.sock" ).WithStartupTimeout (5 * time .Minute )).
216219 Remove ().
217220 Build (ctx , true )
218- assert .NoError (t , err , "Couldn't run create buildx image." )
219- defer func () { assert .NoError (t , testContainer .Terminate (ctx )) }()
220-
221- // Enable the builder util in the container.
222- err = testContainer .Exec (ctx , "sh" , "script.sh" )
223- assert .NoError (t , err )
221+ _ , err := testContainerRequest .Start (ctx )
222+ if err != nil {
223+ log .Error (err )
224+ return nil , err
225+ }
226+ return testContainerRequest , nil
227+ }
224228
225- // login from the builder container toward the Artifactory.
229+ func loginToArtifactory ( container * tests. ContainerRequest ) error {
226230 password := * tests .JfrogPassword
227231 user := * tests .JfrogUser
228232 if * tests .JfrogAccessToken != "" {
229233 user = auth .ExtractUsernameFromAccessToken (* tests .JfrogAccessToken )
230234 password = * tests .JfrogAccessToken
231235 }
232- assert .NoError (t , testContainer .Exec (
233- ctx ,
234- "docker" ,
235- "login" ,
236+ return container .Exec (
237+ context .Background (),
238+ "docker" , "login" ,
236239 tests .RtContainerHostName ,
237240 "--username=" + user ,
238- "--password=" + password ))
241+ "--password=" + password ,
242+ )
243+ }
244+
245+ // This test validate the collect build-info flow for fat-manifest images.
246+ // The way we build the fat manifest and push it to Artifactory is not important.
247+ // Therefore, this test runs only with docker.
248+ func TestPushFatManifestImage (t * testing.T ) {
249+ if ! * tests .TestDocker {
250+ t .Skip ("Skipping test. To run it, add the '-test.docker=true' option." )
251+ }
252+
253+ buildName := "push-fat-manifest" + tests .DockerBuildName
254+ buildNumber := "1"
255+
256+ workspace , err := setupWorkspace (t )
257+ assert .NoError (t , err )
258+
259+ testContainer , err := setupContainer (workspace , "buildx_container" )
260+ assert .NoError (t , err , "Couldn't create buildx image." )
261+ defer func () { assert .NoError (t , testContainer .Terminate (context .Background ())) }()
262+
263+ err = testContainer .Exec (context .Background (), "sh" , "script.sh" )
264+ assert .NoError (t , err )
265+
266+ err = loginToArtifactory (testContainer )
267+ assert .NoError (t , err )
268+
239269 buildxOutputFile := "buildmetadata"
270+ err = testContainer .Exec (context .Background (),
271+ "docker" , "buildx" , "build" ,
272+ "--platform" , "linux/amd64,linux/arm64,linux/arm/v7" ,
273+ "--tag" , path .Join (tests .RtContainerHostName , tests .DockerLocalRepo , tests .DockerImageName + "-multiarch-image" ),
274+ "-f" , "Dockerfile.Fatmanifest" ,
275+ "--metadata-file" , "/workspace/" + buildxOutputFile ,
276+ "--push" , "." ,
277+ )
278+ assert .NoError (t , err )
240279
241- // Run the builder in the container and push the fat-manifest image to artifactory
242- assert .NoError (t , testContainer .Exec (
243- ctx ,
244- "docker" ,
245- "buildx" ,
246- "build" ,
247- "--platform" ,
248- "linux/amd64,linux/arm64,linux/arm/v7" ,
249- "--tag" , path .Join (tests .RtContainerHostName ,
250- tests .DockerLocalRepo ,
251- tests .DockerImageName + "-multiarch-image" ),
252- "-f" ,
253- "Dockerfile.Fatmanifest" ,
254- "--metadata-file" ,
255- "/workspace/" + buildxOutputFile ,
256- "--push" ,
257- "." ,
258- ))
259-
260- // Run 'build-docker-create' & publish the results to Artifactory.
261280 buildxOutput := filepath .Join (workspace , buildxOutputFile )
262- buildNumber := "1"
263281 assert .NoError (t , artifactoryCli .Exec ("build-docker-create" , tests .DockerLocalRepo , "--image-file=" + buildxOutput , "--build-name=" + buildName , "--build-number=" + buildNumber ))
264282 assert .NoError (t , artifactoryCli .Exec ("build-publish" , buildName , buildNumber ))
265283
266- // Validate the published build-info exits
267284 publishedBuildInfo , found , err := tests .GetBuildInfo (serverDetails , buildName , buildNumber )
268- if err != nil {
269- assert .NoError (t , err )
270- return
271- }
272- if ! found {
273- assert .True (t , found , "build info was expected to be found" )
274- return
275- }
276-
285+ assert .NoError (t , err )
286+ assert .True (t , found , "build info was expected to be found" )
277287 assert .True (t , len (publishedBuildInfo .BuildInfo .Modules ) > 1 )
278288
279- // Validate build-name & build-number properties in all image layers
280289 searchSpec := spec .NewBuilder ().Pattern (tests .DockerLocalRepo + "/*" ).Build (buildName ).Recursive (true ).BuildSpec ()
281290 searchCmd := generic .NewSearchCommand ()
282291 searchCmd .SetServerDetails (serverDetails ).SetSpec (searchSpec )
@@ -295,80 +304,42 @@ func TestPushMultiTaggedImage(t *testing.T) {
295304 buildName := "push-multi-tagged" + tests .DockerBuildName
296305 buildNumber := "1"
297306
298- // Setup workspace
299- workspace , err := filepath .Abs (tests .Out )
300- assert .NoError (t , err )
301- assert .NoError (t , fileutils .CreateDirIfNotExist (workspace ))
302- testDataDir := filepath .Join (filepath .FromSlash (tests .GetTestResourcesPath ()), "docker" )
303- files , err := os .ReadDir (testDataDir )
307+ workspace , err := setupWorkspace (t )
304308 assert .NoError (t , err )
305- for _ , file := range files {
306- if ! file .IsDir () {
307- _ , err := tests .ReplaceTemplateVariables (filepath .Join (testDataDir , file .Name ()), tests .Out )
308- assert .NoError (t , err )
309- }
310- }
311309
312- // Build the builder image locally
313- ctx := context .Background ()
314- testContainer , err := tests .NewContainerRequest ().
315- SetDockerfile (workspace , "Dockerfile.Buildx.Fatmanifest" , nil ).
316- Privileged ().
317- Networks (rtNetwork ).
318- Name ("buildx_multi_tag_container" ).
319- Mount (mount.Mount {Type : mount .TypeBind , Source : workspace , Target : "/workspace" , ReadOnly : false }).
320- Cmd ("--insecure-registry" , tests .RtContainerHostName ).
321- WaitFor (wait .ForLog ("API listen on /var/run/docker.sock" ).WithStartupTimeout (5 * time .Minute )).
322- Remove ().
323- Build (ctx , true )
310+ testContainer , err := setupContainer (workspace , "buildx_multi_tag_container" )
324311 assert .NoError (t , err , "Couldn't create buildx container." )
325- defer func () { assert .NoError (t , testContainer .Terminate (ctx )) }()
312+ defer func () { assert .NoError (t , testContainer .Terminate (context . Background () )) }()
326313
327- // Enable builder
328- assert .NoError (t , testContainer . Exec ( ctx , "sh" , "script.sh" ) )
314+ err = testContainer . Exec ( context . Background (), "sh" , "script.sh" )
315+ assert .NoError (t , err )
329316
330- // Login to Artifactory
331- password := * tests .JfrogPassword
332- user := * tests .JfrogUser
333- if * tests .JfrogAccessToken != "" {
334- user = auth .ExtractUsernameFromAccessToken (* tests .JfrogAccessToken )
335- password = * tests .JfrogAccessToken
336- }
337- assert .NoError (t , testContainer .Exec (
338- ctx ,
339- "docker" , "login" ,
340- tests .RtContainerHostName ,
341- "--username=" + user ,
342- "--password=" + password ))
317+ err = loginToArtifactory (testContainer )
318+ assert .NoError (t , err )
343319
344- // Build & push image with multiple tags
345320 imageName1 := path .Join (tests .RtContainerHostName , tests .DockerLocalRepo , tests .DockerImageName + "-multi:v1" )
346321 imageName2 := path .Join (tests .RtContainerHostName , tests .DockerLocalRepo , tests .DockerImageName + "-multi:latest" )
347322 buildxOutputFile := "multi-build-metadata"
348-
349- assert .NoError (t , testContainer .Exec (
350- ctx ,
323+ err = testContainer .Exec (context .Background (),
351324 "docker" , "buildx" , "build" ,
352325 "--platform" , "linux/amd64,linux/arm64" ,
353326 "-t" , imageName1 ,
354327 "-t" , imageName2 ,
355328 "-f" , "Dockerfile.Fatmanifest" ,
356329 "--metadata-file" , "/workspace/" + buildxOutputFile ,
357330 "--push" , "." ,
358- ))
331+ )
332+ assert .NoError (t , err )
359333
360- // Run build-docker-create & publish
361334 buildxOutput := filepath .Join (workspace , buildxOutputFile )
362335 assert .NoError (t , artifactoryCli .Exec ("build-docker-create" , tests .DockerLocalRepo , "--image-file=" + buildxOutput , "--build-name=" + buildName , "--build-number=" + buildNumber ))
363336 assert .NoError (t , artifactoryCli .Exec ("build-publish" , buildName , buildNumber ))
364337
365- // Validate build-info is published
366338 publishedBuildInfo , found , err := tests .GetBuildInfo (serverDetails , buildName , buildNumber )
367339 assert .NoError (t , err )
368340 assert .True (t , found , "build info was expected to be found" )
369341 assert .True (t , len (publishedBuildInfo .BuildInfo .Modules ) >= 1 )
370342
371- // Validate build-name & build-number properties in all layers
372343 searchSpec := spec .NewBuilder ().Pattern (tests .DockerLocalRepo + "/*" ).Build (buildName ).Recursive (true ).BuildSpec ()
373344 searchCmd := generic .NewSearchCommand ()
374345 searchCmd .SetServerDetails (serverDetails ).SetSpec (searchSpec )
0 commit comments