From 56df4e98a0d32ea126d71e90a14ed1fe6bcae1f1 Mon Sep 17 00:00:00 2001 From: idnandre Date: Sat, 20 Jul 2024 17:15:00 +0700 Subject: [PATCH] tests: build multiplatform Signed-off-by: idnandre --- tests/bake.go | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/build.go | 49 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 91 insertions(+), 9 deletions(-) diff --git a/tests/bake.go b/tests/bake.go index 364b697d..390a2aad 100644 --- a/tests/bake.go +++ b/tests/bake.go @@ -56,6 +56,7 @@ var bakeTests = []func(t *testing.T, sb integration.Sandbox){ testListVariables, testBakeCallCheck, testBakeCallCheckFlag, + testBakeMultiPlatform, } func testBakePrint(t *testing.T, sb integration.Sandbox) { @@ -887,6 +888,56 @@ target "def" { require.Len(t, md.BuildWarnings, 3, string(dt)) } +func testBakeMultiPlatform(t *testing.T, sb integration.Sandbox) { + registry, err := sb.NewRegistry() + if errors.Is(err, integration.ErrRequirements) { + t.Skip(err.Error()) + } + require.NoError(t, err) + target := registry + "/buildx/registry:latest" + + dockerfile := []byte(` + FROM --platform=$BUILDPLATFORM busybox:latest AS base + COPY foo /etc/foo + RUN cp /etc/foo /etc/bar + + FROM scratch + COPY --from=base /etc/bar /bar + `) + bakefile := []byte(` + target "default" { + platforms = ["linux/amd64", "linux/arm64"] + } + `) + dir := tmpdir( + t, + fstest.CreateFile("docker-bake.hcl", bakefile, 0600), + fstest.CreateFile("Dockerfile", dockerfile, 0600), + fstest.CreateFile("foo", []byte("foo"), 0600), + ) + + cmd := buildxCmd(sb, withDir(dir), withArgs("bake"), withArgs("--set", fmt.Sprintf("*.output=type=image,name=%s,push=true", target))) + out, err := cmd.CombinedOutput() + + if !isMobyWorker(sb) { + require.NoError(t, err, string(out)) + + desc, provider, err := contentutil.ProviderFromRef(target) + require.NoError(t, err) + imgs, err := testutil.ReadImages(sb.Context(), provider, desc) + require.NoError(t, err) + + img := imgs.Find("linux/amd64") + require.NotNil(t, img) + img = imgs.Find("linux/arm64") + require.NotNil(t, img) + + } else { + require.Error(t, err, string(out)) + require.Contains(t, string(out), "Multi-platform build is not supported") + } +} + func testBakeMultiExporters(t *testing.T, sb integration.Sandbox) { if !isDockerContainerWorker(sb) { t.Skip("only testing with docker-container worker") diff --git a/tests/build.go b/tests/build.go index 9c946369..8968a2ee 100644 --- a/tests/build.go +++ b/tests/build.go @@ -62,7 +62,7 @@ var buildTests = []func(t *testing.T, sb integration.Sandbox){ testBuildLabelNoKey, testBuildCacheExportNotSupported, testBuildOCIExportNotSupported, - testBuildMultiPlatformNotSupported, + testBuildMultiPlatform, testDockerHostGateway, testBuildNetworkModeBridge, testBuildShmSize, @@ -616,16 +616,47 @@ func testBuildOCIExportNotSupported(t *testing.T, sb integration.Sandbox) { require.Contains(t, string(out), "OCI exporter is not supported") } -func testBuildMultiPlatformNotSupported(t *testing.T, sb integration.Sandbox) { - if !isMobyWorker(sb) { - t.Skip("only testing with docker worker") - } +func testBuildMultiPlatform(t *testing.T, sb integration.Sandbox) { + dockerfile := []byte(` + FROM --platform=$BUILDPLATFORM busybox:latest AS base + COPY foo /etc/foo + RUN cp /etc/foo /etc/bar - dir := createTestProject(t) - cmd := buildxCmd(sb, withArgs("build", "--platform=linux/amd64,linux/arm64", dir)) + FROM scratch + COPY --from=base /etc/bar /bar + `) + dir := tmpdir( + t, + fstest.CreateFile("Dockerfile", dockerfile, 0600), + fstest.CreateFile("foo", []byte("foo"), 0600), + ) + registry, err := sb.NewRegistry() + if errors.Is(err, integration.ErrRequirements) { + t.Skip(err.Error()) + } + require.NoError(t, err) + target := registry + "/buildx/registry:latest" + + cmd := buildxCmd(sb, withArgs("build", "--platform=linux/amd64,linux/arm64", fmt.Sprintf("--output=type=image,name=%s,push=true", target), dir)) out, err := cmd.CombinedOutput() - require.Error(t, err, string(out)) - require.Contains(t, string(out), "Multi-platform build is not supported") + + if !isMobyWorker(sb) { + require.NoError(t, err, string(out)) + + desc, provider, err := contentutil.ProviderFromRef(target) + require.NoError(t, err) + imgs, err := testutil.ReadImages(sb.Context(), provider, desc) + require.NoError(t, err) + + img := imgs.Find("linux/amd64") + require.NotNil(t, img) + img = imgs.Find("linux/arm64") + require.NotNil(t, img) + + } else { + require.Error(t, err, string(out)) + require.Contains(t, string(out), "Multi-platform build is not supported") + } } func testDockerHostGateway(t *testing.T, sb integration.Sandbox) {