Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9a2536d

Browse files
committed
test: multi exporters
Signed-off-by: CrazyMax <[email protected]>
1 parent a03263a commit 9a2536d

File tree

2 files changed

+294
-1
lines changed

2 files changed

+294
-1
lines changed

tests/bake.go

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,19 @@ package tests
22

33
import (
44
"encoding/json"
5+
"fmt"
56
"os"
67
"path/filepath"
8+
"strings"
79
"testing"
810

911
"github.com/containerd/continuity/fs/fstest"
1012
"github.com/docker/buildx/util/gitutil"
13+
"github.com/moby/buildkit/identity"
14+
"github.com/moby/buildkit/util/contentutil"
15+
"github.com/moby/buildkit/util/testutil"
1116
"github.com/moby/buildkit/util/testutil/integration"
17+
"github.com/pkg/errors"
1218
"github.com/stretchr/testify/require"
1319
)
1420

@@ -36,6 +42,8 @@ var bakeTests = []func(t *testing.T, sb integration.Sandbox){
3642
testBakeShmSize,
3743
testBakeUlimits,
3844
testBakeRefs,
45+
testBakeMultiExporters,
46+
testBakeLoadPush,
3947
}
4048

4149
func testBakeLocal(t *testing.T, sb integration.Sandbox) {
@@ -631,3 +639,155 @@ target "default" {
631639

632640
require.NotEmpty(t, md.Default.BuildRef)
633641
}
642+
643+
func testBakeMultiExporters(t *testing.T, sb integration.Sandbox) {
644+
if sb.Name() != "docker" {
645+
t.Skip("skipping test for non-docker workers")
646+
}
647+
648+
registry, err := sb.NewRegistry()
649+
if errors.Is(err, integration.ErrRequirements) {
650+
t.Skip(err.Error())
651+
}
652+
require.NoError(t, err)
653+
654+
targetReg := registry + "/buildx/registry:latest"
655+
targetStore := "buildx:local-" + identity.NewID()
656+
657+
var builderName string
658+
t.Cleanup(func() {
659+
if builderName == "" {
660+
return
661+
}
662+
663+
cmd := dockerCmd(sb, withArgs("image", "rm", targetStore))
664+
cmd.Stderr = os.Stderr
665+
require.NoError(t, cmd.Run())
666+
667+
out, err := rmCmd(sb, withArgs(builderName))
668+
require.NoError(t, err, out)
669+
})
670+
671+
// TODO: use stable buildkit image when v0.13.0 released
672+
out, err := createCmd(sb, withArgs(
673+
"--driver", "docker-container",
674+
"--buildkitd-flags=--allow-insecure-entitlement=network.host",
675+
"--driver-opt", "network=host",
676+
"--driver-opt", "image=moby/buildkit:v0.13.0-rc3",
677+
))
678+
require.NoError(t, err, out)
679+
builderName = strings.TrimSpace(out)
680+
681+
dockerfile := []byte(`
682+
FROM scratch
683+
COPY foo /foo
684+
`)
685+
bakefile := []byte(`
686+
target "default" {
687+
}
688+
`)
689+
dir := tmpdir(
690+
t,
691+
fstest.CreateFile("docker-bake.hcl", bakefile, 0600),
692+
fstest.CreateFile("Dockerfile", dockerfile, 0600),
693+
fstest.CreateFile("foo", []byte("foo"), 0600),
694+
)
695+
696+
outputs := []string{
697+
"--set", fmt.Sprintf("*.output=type=image,name=%s,push=true", targetReg),
698+
"--set", fmt.Sprintf("*.output=type=docker,name=%s", targetStore),
699+
"--set", fmt.Sprintf("*.output=type=oci,dest=%s/result", dir),
700+
}
701+
cmd := buildxCmd(sb, withDir(dir), withArgs("bake"), withArgs(outputs...))
702+
cmd.Env = append(cmd.Env, "BUILDX_BUILDER="+builderName)
703+
outb, err := cmd.CombinedOutput()
704+
require.NoError(t, err, string(outb))
705+
706+
// test registry
707+
desc, provider, err := contentutil.ProviderFromRef(targetReg)
708+
require.NoError(t, err)
709+
_, err = testutil.ReadImages(sb.Context(), provider, desc)
710+
require.NoError(t, err)
711+
712+
// test docker store
713+
cmd = dockerCmd(sb, withArgs("image", "inspect", targetStore))
714+
cmd.Stderr = os.Stderr
715+
require.NoError(t, cmd.Run())
716+
717+
// test oci
718+
_, err = os.ReadFile(fmt.Sprintf("%s/result", dir))
719+
require.NoError(t, err)
720+
721+
// TODO: test metadata file when supported by multi exporters https://github.com/docker/buildx/issues/2181
722+
}
723+
724+
func testBakeLoadPush(t *testing.T, sb integration.Sandbox) {
725+
if sb.Name() != "docker" {
726+
t.Skip("skipping test for non-docker workers")
727+
}
728+
729+
registry, err := sb.NewRegistry()
730+
if errors.Is(err, integration.ErrRequirements) {
731+
t.Skip(err.Error())
732+
}
733+
require.NoError(t, err)
734+
735+
target := registry + "/buildx/registry:" + identity.NewID()
736+
737+
var builderName string
738+
t.Cleanup(func() {
739+
if builderName == "" {
740+
return
741+
}
742+
743+
cmd := dockerCmd(sb, withArgs("image", "rm", target))
744+
cmd.Stderr = os.Stderr
745+
require.NoError(t, cmd.Run())
746+
747+
out, err := rmCmd(sb, withArgs(builderName))
748+
require.NoError(t, err, out)
749+
})
750+
751+
// TODO: use stable buildkit image when v0.13.0 released
752+
out, err := createCmd(sb, withArgs(
753+
"--driver", "docker-container",
754+
"--buildkitd-flags=--allow-insecure-entitlement=network.host",
755+
"--driver-opt", "network=host",
756+
"--driver-opt", "image=moby/buildkit:v0.13.0-rc3",
757+
))
758+
require.NoError(t, err, out)
759+
builderName = strings.TrimSpace(out)
760+
761+
dockerfile := []byte(`
762+
FROM scratch
763+
COPY foo /foo
764+
`)
765+
bakefile := []byte(`
766+
target "default" {
767+
}
768+
`)
769+
dir := tmpdir(
770+
t,
771+
fstest.CreateFile("docker-bake.hcl", bakefile, 0600),
772+
fstest.CreateFile("Dockerfile", dockerfile, 0600),
773+
fstest.CreateFile("foo", []byte("foo"), 0600),
774+
)
775+
776+
cmd := buildxCmd(sb, withDir(dir), withArgs("bake", "--push", "--load", fmt.Sprintf("--set=*.tags=%s", target)))
777+
cmd.Env = append(cmd.Env, "BUILDX_BUILDER="+builderName)
778+
outb, err := cmd.CombinedOutput()
779+
require.NoError(t, err, string(outb))
780+
781+
// test registry
782+
desc, provider, err := contentutil.ProviderFromRef(target)
783+
require.NoError(t, err)
784+
_, err = testutil.ReadImages(sb.Context(), provider, desc)
785+
require.NoError(t, err)
786+
787+
// test docker store
788+
cmd = dockerCmd(sb, withArgs("image", "inspect", target))
789+
cmd.Stderr = os.Stderr
790+
require.NoError(t, cmd.Run())
791+
792+
// TODO: test metadata file when supported by multi exporters https://github.com/docker/buildx/issues/2181
793+
}

tests/build.go

Lines changed: 134 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/containerd/containerd/platforms"
1717
"github.com/containerd/continuity/fs/fstest"
1818
"github.com/creack/pty"
19+
"github.com/moby/buildkit/identity"
1920
"github.com/moby/buildkit/util/appdefaults"
2021
"github.com/moby/buildkit/util/contentutil"
2122
"github.com/moby/buildkit/util/testutil"
@@ -54,6 +55,8 @@ var buildTests = []func(t *testing.T, sb integration.Sandbox){
5455
testBuildShmSize,
5556
testBuildUlimit,
5657
testBuildRef,
58+
testBuildMultiExporters,
59+
testBuildLoadPush,
5760
}
5861

5962
func testBuild(t *testing.T, sb integration.Sandbox) {
@@ -437,7 +440,7 @@ func testBuildNetworkModeBridge(t *testing.T, sb integration.Sandbox) {
437440
})
438441

439442
// 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"))
441444
require.NoError(t, err, out)
442445
builderName = strings.TrimSpace(out)
443446

@@ -542,6 +545,136 @@ func testBuildRef(t *testing.T, sb integration.Sandbox) {
542545
require.NotEmpty(t, md.BuildRef)
543546
}
544547

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+
545678
func createTestProject(t *testing.T) string {
546679
dockerfile := []byte(`
547680
FROM busybox:latest AS base

0 commit comments

Comments
 (0)