From c608380ca9cea7fb2c1f5ce3874f8f835b79cfb3 Mon Sep 17 00:00:00 2001 From: Mariano Reingart Date: Sat, 18 Jan 2025 22:07:14 -0600 Subject: [PATCH] buildx integration test --- integration/build_test.go | 53 +++++++++++++++++++++++ integration/testdata/buildx/Dockerfile | 12 +++++ integration/testdata/buildx/config | 9 ++++ integration/testdata/buildx/main.go | 14 ++++++ integration/testdata/buildx/skaffold.yaml | 12 +++++ pkg/skaffold/build/docker/docker.go | 2 +- 6 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 integration/testdata/buildx/Dockerfile create mode 100644 integration/testdata/buildx/config create mode 100644 integration/testdata/buildx/main.go create mode 100644 integration/testdata/buildx/skaffold.yaml diff --git a/integration/build_test.go b/integration/build_test.go index eb46951049f..6c9724a2776 100644 --- a/integration/build_test.go +++ b/integration/build_test.go @@ -53,6 +53,12 @@ func TestBuild(t *testing.T) { description: "docker build", dir: "testdata/build", }, + { + setup: setupBuildX, + description: "docker buildx", + args: []string{"--config", "config", "--verbosity=trace"}, + dir: "testdata/buildx", + }, { description: "git tagger", dir: "testdata/tagPolicy", @@ -131,6 +137,7 @@ func TestBuildWithWithPlatform(t *testing.T) { dir string args []string image string + setup func(t *testing.T, workdir string) expectedPlatforms []v1.Platform }{ { @@ -145,11 +152,28 @@ func TestBuildWithWithPlatform(t *testing.T) { args: []string{"--platform", "linux/arm64"}, expectedPlatforms: []v1.Platform{{OS: "linux", Architecture: "arm64"}}, }, + { + setup: setupBuildX, + description: "docker buildx linux/amd64", + dir: "testdata/buildx", + args: []string{"--platform", "linux/amd64", "--cache-artifacts=false", "--config", "config", "--verbosity=trace"}, + expectedPlatforms: []v1.Platform{{OS: "linux", Architecture: "amd64"}}, + }, + { + setup: setupBuildX, + description: "docker buildx linux/arm64", + dir: "testdata/buildx", + args: []string{"--platform", "linux/arm64", "--cache-artifacts=false", "--config", "config", "--verbosity=trace"}, + expectedPlatforms: []v1.Platform{{OS: "linux", Architecture: "arm64"}}, + }, } for _, test := range tests { t.Run(test.description, func(t *testing.T) { MarkIntegrationTest(t, CanRunWithoutGcp) + if test.setup != nil { + test.setup(t, test.dir) + } tmpfile := testutil.TempFile(t, "", []byte{}) args := append(test.args, "--file-output", tmpfile) skaffold.Build(args...).InDir(test.dir).RunOrFail(t) @@ -314,6 +338,35 @@ func setupGitRepo(t *testing.T, dir string) { } } +// setupBuildX sets up a docker buildx builder using buildkit +func setupBuildX(t *testing.T, dir string) { + t.Cleanup(func() { + dockerArgs := [][]string{ + {"buildx", "uninstall"}, + {"buildx", "rm", "buildkit"}, + } + for _, args := range dockerArgs { + cmd := exec.Command("docker", args...) + if buf, err := util.RunCmdOut(context.Background(), cmd); err != nil { + t.Log(string(buf)) + t.Fatal(err) + } + } + }) + + dockerArgs := [][]string{ + {"buildx", "install"}, + {"buildx", "create", "--driver", "docker-container", "--name", "buildkit"}, + } + for _, args := range dockerArgs { + cmd := exec.Command("docker", args...) + if buf, err := util.RunCmdOut(context.Background(), cmd); err != nil { + t.Log(string(buf)) + t.Fatal(err) + } + } +} + // nowInChicago returns the dateTime string as generated by the dateTime tagger func nowInChicago() string { loc, _ := tz.LoadLocation("America/Chicago") diff --git a/integration/testdata/buildx/Dockerfile b/integration/testdata/buildx/Dockerfile new file mode 100644 index 00000000000..970447876b9 --- /dev/null +++ b/integration/testdata/buildx/Dockerfile @@ -0,0 +1,12 @@ +# syntax=docker/dockerfile:1 + +FROM golang:1.23-alpine AS builder + +COPY main.go . +RUN go build -o /app main.go + +FROM alpine:3 + +COPY --from=builder /app . + +CMD ["/app"] diff --git a/integration/testdata/buildx/config b/integration/testdata/buildx/config new file mode 100644 index 00000000000..dcee1db963b --- /dev/null +++ b/integration/testdata/buildx/config @@ -0,0 +1,9 @@ +global: + cache-tag: cache + buildx-builder: buildkit + survey: + last-prompted: "2025-01-19T21:32:47Z" + collect-metrics: true + update: + last-prompted: "2025-01-19T23:10:47Z" +kubeContexts: [] diff --git a/integration/testdata/buildx/main.go b/integration/testdata/buildx/main.go new file mode 100644 index 00000000000..8c3e45267d6 --- /dev/null +++ b/integration/testdata/buildx/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "fmt" + "time" +) + +func main() { + for counter := 0; ; counter++ { + fmt.Println("Hello world!", counter) + + time.Sleep(time.Second * 1) + } +} diff --git a/integration/testdata/buildx/skaffold.yaml b/integration/testdata/buildx/skaffold.yaml new file mode 100644 index 00000000000..bbd8f22a5d2 --- /dev/null +++ b/integration/testdata/buildx/skaffold.yaml @@ -0,0 +1,12 @@ +apiVersion: skaffold/v4beta12 +kind: Config +build: + artifacts: + - image: my-app + docker: + dockerfile: Dockerfile + local: + useBuildkit: true + useDockerCLI: true + tryImportMissing: true + push: false diff --git a/pkg/skaffold/build/docker/docker.go b/pkg/skaffold/build/docker/docker.go index 7680691f468..77271618d3c 100644 --- a/pkg/skaffold/build/docker/docker.go +++ b/pkg/skaffold/build/docker/docker.go @@ -279,7 +279,7 @@ func parseBuildxMetadataFile(ctx context.Context, filename string) (string, erro if err == nil { // avoid panic: interface conversion: interface {} is nil, not string (if keys don't exists) var digest string - if value := metadata["containerimage.digest"]; value != nil { + if value := metadata["containerimage.config.digest"]; value != nil { digest = value.(string) } var name string