@@ -287,6 +287,98 @@ func TestPushFatManifestImage(t *testing.T) {
287287 assert .True (t , totalResults > 1 )
288288}
289289
290+ func TestPushMultiTaggedImage (t * testing.T ) {
291+ if ! * tests .TestDocker {
292+ t .Skip ("Skipping test. To run it, add the '-test.docker=true' option." )
293+ }
294+
295+ buildName := "push-multi-tagged" + tests .DockerBuildName
296+ buildNumber := "1"
297+
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 )
304+ 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+ }
311+
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 )
324+ assert .NoError (t , err , "Couldn't create buildx container." )
325+ defer func () { assert .NoError (t , testContainer .Terminate (ctx )) }()
326+
327+ // Enable builder
328+ assert .NoError (t , testContainer .Exec (ctx , "sh" , "script.sh" ))
329+
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 ))
343+
344+ // Build & push image with multiple tags
345+ imageName1 := path .Join (tests .RtContainerHostName , tests .DockerLocalRepo , tests .DockerImageName + "-multi:v1" )
346+ imageName2 := path .Join (tests .RtContainerHostName , tests .DockerLocalRepo , tests .DockerImageName + "-multi:latest" )
347+ buildxOutputFile := "multi-build-metadata"
348+
349+ assert .NoError (t , testContainer .Exec (
350+ ctx ,
351+ "docker" , "buildx" , "build" ,
352+ "--platform" , "linux/amd64,linux/arm64" ,
353+ "-t" , imageName1 ,
354+ "-t" , imageName2 ,
355+ "-f" , "Dockerfile.Fatmanifest" ,
356+ "--metadata-file" , "/workspace/" + buildxOutputFile ,
357+ "--push" , "." ,
358+ ))
359+
360+ // Run build-docker-create & publish
361+ buildxOutput := filepath .Join (workspace , buildxOutputFile )
362+ assert .NoError (t , artifactoryCli .Exec ("build-docker-create" , tests .DockerLocalRepo , "--image-file=" + buildxOutput , "--build-name=" + buildName , "--build-number=" + buildNumber ))
363+ assert .NoError (t , artifactoryCli .Exec ("build-publish" , buildName , buildNumber ))
364+
365+ // Validate build-info is published
366+ publishedBuildInfo , found , err := tests .GetBuildInfo (serverDetails , buildName , buildNumber )
367+ assert .NoError (t , err )
368+ assert .True (t , found , "build info was expected to be found" )
369+ assert .True (t , len (publishedBuildInfo .BuildInfo .Modules ) >= 1 )
370+
371+ // Validate build-name & build-number properties in all layers
372+ searchSpec := spec .NewBuilder ().Pattern (tests .DockerLocalRepo + "/*" ).Build (buildName ).Recursive (true ).BuildSpec ()
373+ searchCmd := generic .NewSearchCommand ()
374+ searchCmd .SetServerDetails (serverDetails ).SetSpec (searchSpec )
375+ reader , err := searchCmd .Search ()
376+ assert .NoError (t , err )
377+ totalResults , err := reader .Length ()
378+ assert .NoError (t , err )
379+ assert .True (t , totalResults > 1 )
380+ }
381+
290382func TestContainerPushMultipleImages (t * testing.T ) {
291383 containerManagers := initContainerTest (t )
292384 imageNames := []string {
0 commit comments