@@ -16,6 +16,7 @@ import (
16
16
"github.com/containerd/containerd/platforms"
17
17
"github.com/containerd/continuity/fs/fstest"
18
18
"github.com/creack/pty"
19
+ "github.com/moby/buildkit/identity"
19
20
"github.com/moby/buildkit/util/appdefaults"
20
21
"github.com/moby/buildkit/util/contentutil"
21
22
"github.com/moby/buildkit/util/testutil"
@@ -54,6 +55,8 @@ var buildTests = []func(t *testing.T, sb integration.Sandbox){
54
55
testBuildShmSize ,
55
56
testBuildUlimit ,
56
57
testBuildRef ,
58
+ testBuildMultiExporters ,
59
+ testBuildLoadPush ,
57
60
}
58
61
59
62
func testBuild (t * testing.T , sb integration.Sandbox ) {
@@ -437,7 +440,7 @@ func testBuildNetworkModeBridge(t *testing.T, sb integration.Sandbox) {
437
440
})
438
441
439
442
// TODO: use stable buildkit image when v0.13.0 released
440
- out , err := createCmd (sb , withArgs ("--driver" , "docker-container" , "--buildkitd-flags=--oci-worker-net=bridge --allow-insecure-entitlement=network.host" , "--driver-opt" , "image=moby/buildkit:master " ))
443
+ out , err := createCmd (sb , withArgs ("--driver" , "docker-container" , "--buildkitd-flags=--oci-worker-net=bridge --allow-insecure-entitlement=network.host" , "--driver-opt" , "image=moby/buildkit:v0.13.0-rc3 " ))
441
444
require .NoError (t , err , out )
442
445
builderName = strings .TrimSpace (out )
443
446
@@ -542,6 +545,136 @@ func testBuildRef(t *testing.T, sb integration.Sandbox) {
542
545
require .NotEmpty (t , md .BuildRef )
543
546
}
544
547
548
+ func testBuildMultiExporters (t * testing.T , sb integration.Sandbox ) {
549
+ if sb .Name () != "docker" {
550
+ t .Skip ("skipping test for non-docker workers" )
551
+ }
552
+
553
+ registry , err := sb .NewRegistry ()
554
+ if errors .Is (err , integration .ErrRequirements ) {
555
+ t .Skip (err .Error ())
556
+ }
557
+ require .NoError (t , err )
558
+
559
+ targetReg := registry + "/buildx/registry:latest"
560
+ targetStore := "buildx:local-" + identity .NewID ()
561
+
562
+ var builderName string
563
+ t .Cleanup (func () {
564
+ if builderName == "" {
565
+ return
566
+ }
567
+
568
+ cmd := dockerCmd (sb , withArgs ("image" , "rm" , targetStore ))
569
+ cmd .Stderr = os .Stderr
570
+ require .NoError (t , cmd .Run ())
571
+
572
+ out , err := rmCmd (sb , withArgs (builderName ))
573
+ require .NoError (t , err , out )
574
+ })
575
+
576
+ // TODO: use stable buildkit image when v0.13.0 released
577
+ out , err := createCmd (sb , withArgs (
578
+ "--driver" , "docker-container" ,
579
+ "--buildkitd-flags=--allow-insecure-entitlement=network.host" ,
580
+ "--driver-opt" , "network=host" ,
581
+ "--driver-opt" , "image=moby/buildkit:v0.13.0-rc3" ,
582
+ ))
583
+ require .NoError (t , err , out )
584
+ builderName = strings .TrimSpace (out )
585
+
586
+ dir := createTestProject (t )
587
+
588
+ outputs := []string {
589
+ "--output" , fmt .Sprintf ("type=image,name=%s,push=true" , targetReg ),
590
+ "--output" , fmt .Sprintf ("type=docker,name=%s" , targetStore ),
591
+ "--output" , fmt .Sprintf ("type=oci,dest=%s/result" , dir ),
592
+ }
593
+ cmd := buildxCmd (sb , withArgs ("build" ), withArgs (outputs ... ), withArgs (dir ))
594
+ cmd .Env = append (cmd .Env , "BUILDX_BUILDER=" + builderName )
595
+ outb , err := cmd .CombinedOutput ()
596
+ require .NoError (t , err , string (outb ))
597
+
598
+ // test registry
599
+ desc , provider , err := contentutil .ProviderFromRef (targetReg )
600
+ require .NoError (t , err )
601
+ _ , err = testutil .ReadImages (sb .Context (), provider , desc )
602
+ require .NoError (t , err )
603
+
604
+ // test docker store
605
+ cmd = dockerCmd (sb , withArgs ("image" , "inspect" , targetStore ))
606
+ cmd .Stderr = os .Stderr
607
+ require .NoError (t , cmd .Run ())
608
+
609
+ // test oci
610
+ _ , err = os .ReadFile (fmt .Sprintf ("%s/result" , dir ))
611
+ require .NoError (t , err )
612
+
613
+ // TODO: test metadata file when supported by multi exporters https://github.com/docker/buildx/issues/2181
614
+ }
615
+
616
+ func testBuildLoadPush (t * testing.T , sb integration.Sandbox ) {
617
+ if sb .Name () != "docker" {
618
+ t .Skip ("skipping test for non-docker workers" )
619
+ }
620
+
621
+ registry , err := sb .NewRegistry ()
622
+ if errors .Is (err , integration .ErrRequirements ) {
623
+ t .Skip (err .Error ())
624
+ }
625
+ require .NoError (t , err )
626
+
627
+ target := registry + "/buildx/registry:" + identity .NewID ()
628
+
629
+ var builderName string
630
+ t .Cleanup (func () {
631
+ if builderName == "" {
632
+ return
633
+ }
634
+
635
+ cmd := dockerCmd (sb , withArgs ("image" , "rm" , target ))
636
+ cmd .Stderr = os .Stderr
637
+ require .NoError (t , cmd .Run ())
638
+
639
+ out , err := rmCmd (sb , withArgs (builderName ))
640
+ require .NoError (t , err , out )
641
+ })
642
+
643
+ // TODO: use stable buildkit image when v0.13.0 released
644
+ out , err := createCmd (sb , withArgs (
645
+ "--driver" , "docker-container" ,
646
+ "--buildkitd-flags=--allow-insecure-entitlement=network.host" ,
647
+ "--driver-opt" , "network=host" ,
648
+ "--driver-opt" , "image=moby/buildkit:v0.13.0-rc3" ,
649
+ ))
650
+ require .NoError (t , err , out )
651
+ builderName = strings .TrimSpace (out )
652
+
653
+ dir := createTestProject (t )
654
+
655
+ cmd := buildxCmd (sb , withArgs (
656
+ "build" , "--push" , "--load" ,
657
+ fmt .Sprintf ("-t=%s" , target ),
658
+ dir ,
659
+ ))
660
+ cmd .Env = append (cmd .Env , "BUILDX_BUILDER=" + builderName )
661
+ outb , err := cmd .CombinedOutput ()
662
+ require .NoError (t , err , string (outb ))
663
+
664
+ // test registry
665
+ desc , provider , err := contentutil .ProviderFromRef (target )
666
+ require .NoError (t , err )
667
+ _ , err = testutil .ReadImages (sb .Context (), provider , desc )
668
+ require .NoError (t , err )
669
+
670
+ // test docker store
671
+ cmd = dockerCmd (sb , withArgs ("image" , "inspect" , target ))
672
+ cmd .Stderr = os .Stderr
673
+ require .NoError (t , cmd .Run ())
674
+
675
+ // TODO: test metadata file when supported by multi exporters https://github.com/docker/buildx/issues/2181
676
+ }
677
+
545
678
func createTestProject (t * testing.T ) string {
546
679
dockerfile := []byte (`
547
680
FROM busybox:latest AS base
0 commit comments