From e22be7075cf46e279e89644b2f6b5c0b6a5d5420 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Fri, 3 Apr 2026 12:05:17 +0200 Subject: [PATCH 1/5] tests: add a k3s kubernetes integration worker Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- .github/workflows/build.yml | 5 + Dockerfile | 26 +++ tests/helpers/k3s.go | 165 ++++++++++++++++++ tests/integration_test.go | 1 + tests/workers/kubernetes.go | 109 ++++++++++++ .../util/testutil/integration/registry.go | 4 +- .../buildkit/util/testutil/integration/run.go | 1 + .../util/testutil/integration/sandbox.go | 3 +- 8 files changed, 311 insertions(+), 3 deletions(-) create mode 100644 tests/helpers/k3s.go create mode 100644 tests/workers/kubernetes.go diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bd369d2b6ea0..b8272faccd58 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -94,6 +94,11 @@ jobs: - worker: "docker+containerd@27.5" # same as docker, but with containerd snapshotter pkg: ./tests mode: experimental + - worker: kubernetes + pkg: ./tests + - worker: kubernetes + pkg: ./tests + mode: experimental steps: - name: Prepare diff --git a/Dockerfile b/Dockerfile index 00645b41efc0..1d3f13ffefc7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,6 +14,7 @@ ARG REGISTRY_VERSION=3.0.0 ARG BUILDKIT_VERSION=v0.29.0 ARG COMPOSE_VERSION=v5.1.0 ARG UNDOCK_VERSION=0.9.0 +ARG K3S_VERSION=v1.32.13-k3s1 FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS golatest @@ -27,6 +28,7 @@ FROM registry:$REGISTRY_VERSION AS registry FROM moby/buildkit:$BUILDKIT_VERSION AS buildkit FROM docker/compose-bin:$COMPOSE_VERSION AS compose FROM crazymax/undock:$UNDOCK_VERSION AS undock +FROM rancher/k3s:${K3S_VERSION} AS k3s FROM golatest AS gobase COPY --from=xx / / @@ -128,15 +130,24 @@ FROM gobase AS integration-test-base RUN apk add --no-cache \ bash \ btrfs-progs \ + busybox-binsh \ + cni-plugin-flannel \ + cni-plugins \ + conntrack-tools \ + coreutils \ + dbus \ e2fsprogs \ e2fsprogs-extra \ + findutils \ ip6tables \ + ipset \ iptables \ make \ openssl \ shadow-uidmap \ xfsprogs \ xz +ENV PATH="/usr/libexec/cni:${PATH}" COPY --link --from=gotestsum /out /usr/bin/ COPY --link --from=registry /bin/registry /usr/bin/ COPY --link --from=docker-engine / /usr/bin/ @@ -145,6 +156,8 @@ COPY --link --from=docker-engine-alt28 / /opt/docker-alt-28/ COPY --link --from=docker-engine-alt27 / /opt/docker-alt-27/ COPY --link --from=docker-cli-alt28 / /opt/docker-alt-28/ COPY --link --from=docker-cli-alt27 / /opt/docker-alt-27/ +COPY --link --from=k3s /bin/k3s /usr/bin/ +COPY --link --from=k3s /bin/kubectl /usr/bin/ COPY --link --from=buildkit /usr/bin/buildkitd /usr/bin/ COPY --link --from=buildkit /usr/bin/buildctl /usr/bin/ COPY --link --from=compose /docker-compose /usr/bin/compose @@ -152,6 +165,19 @@ COPY --link --from=undock /usr/local/bin/undock /usr/bin/ COPY --link --from=binaries /buildx /usr/bin/ RUN mkdir -p /usr/local/lib/docker/cli-plugins && ln -s /usr/bin/buildx /usr/local/lib/docker/cli-plugins/docker-buildx ENV TEST_DOCKER_EXTRA="docker@28.5=/opt/docker-alt-28,docker@27.5=/opt/docker-alt-27" +COPY --chmod=755 <<-"EOF" /entrypoint.sh +#!/bin/sh +set -e +# cgroup v2: enable nesting +# https://github.com/moby/moby/blob/v25.0.0/hack/dind#L59-L69 +if [ -f /sys/fs/cgroup/cgroup.controllers ]; then + mkdir -p /sys/fs/cgroup/init + xargs -rn1 < /sys/fs/cgroup/cgroup.procs > /sys/fs/cgroup/init/cgroup.procs || : + sed -e 's/ / +/g' -e 's/^/+/' < /sys/fs/cgroup/cgroup.controllers > /sys/fs/cgroup/cgroup.subtree_control +fi +exec "$@" +EOF +ENTRYPOINT ["/entrypoint.sh"] FROM integration-test-base AS integration-test COPY . . diff --git a/tests/helpers/k3s.go b/tests/helpers/k3s.go new file mode 100644 index 000000000000..536a000ac57a --- /dev/null +++ b/tests/helpers/k3s.go @@ -0,0 +1,165 @@ +package helpers + +import ( + "bytes" + "fmt" + "net" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/moby/buildkit/util/testutil/integration" + "github.com/pkg/errors" +) + +const ( + k3sBin = "k3s" + kubectlBin = "kubectl" + k3sNodeName = "integrationk3s" + k3sWaitWindow = 3 * time.Minute + k3sWaitDelay = 5 * time.Second +) + +func NewK3sServer(cfg *integration.BackendConfig) (kubeConfig string, cl func() error, err error) { + if _, err := exec.LookPath(k3sBin); err != nil { + return "", nil, errors.Wrapf(err, "failed to lookup %s binary", k3sBin) + } + if _, err := exec.LookPath(kubectlBin); err != nil { + return "", nil, errors.Wrapf(err, "failed to lookup %s binary", kubectlBin) + } + + deferF := &integration.MultiCloser{} + cl = deferF.F() + defer func() { + if err != nil { + deferF.F()() + cl = nil + } + }() + + cfgfile, err := os.CreateTemp("", "kubeconfig*.yml") + if err != nil { + return "", nil, err + } + if err := cfgfile.Close(); err != nil { + return "", nil, err + } + kubeConfig = cfgfile.Name() + deferF.Append(func() error { + return os.Remove(cfgfile.Name()) + }) + + k3sDataDir, err := os.MkdirTemp("", "kubedata") + if err != nil { + return "", nil, err + } + deferF.Append(func() error { + return os.RemoveAll(k3sDataDir) + }) + + l, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + return "", nil, err + } + _ = l.Close() + lport := strconv.Itoa(l.Addr().(*net.TCPAddr).Port) + + k3sGlobalDir := "/etc/rancher/k3s" + if err := os.MkdirAll(k3sGlobalDir, 0o755); err != nil { + return "", nil, err + } + + registriesFile := filepath.Join(k3sGlobalDir, "registries.yaml") + if cfg.Mirror != "" { + mirror := cfg.Mirror + if port, ok := strings.CutPrefix(mirror, "localhost:"); ok { + mirror = "host.k3s.internal:" + port + } + dt := []byte(fmt.Sprintf(` +mirrors: + "docker.io": + endpoint: + - "%s" + +configs: + "%s": + insecure_skip_verify: true +`, mirror, mirror)) + if err := os.WriteFile(registriesFile, dt, 0o644); err != nil { + return "", nil, err + } + deferF.Append(func() error { + if err := os.Remove(registriesFile); errors.Is(err, os.ErrNotExist) { + return nil + } else { + return err + } + }) + } + + cmd := exec.Command( + k3sBin, + "server", + "--bind-address", "0.0.0.0", + "--https-listen-port", lport, + "--data-dir", k3sDataDir, + "--write-kubeconfig", cfgfile.Name(), + "--write-kubeconfig-mode", "666", + "--node-name", k3sNodeName, + ) + stop, err := integration.StartCmd(cmd, cfg.Logs) + if err != nil { + return "", nil, err + } + + if err = waitK3s(cfg, kubeConfig); err != nil { + stop() + containerdLogs, _ := os.ReadFile(filepath.Join(k3sDataDir, "agent", "containerd", "containerd.log")) + containerdConfig, _ := os.ReadFile(filepath.Join(k3sDataDir, "agent", "etc", "containerd", "config.toml")) + registries, _ := os.ReadFile(registriesFile) + return "", nil, errors.Wrapf(err, "k3s did not start up: %s\ncontainerd.log: %s\ncontainerd.config.toml: %s\nregistries.yaml: %s", formatLogs(cfg.Logs), containerdLogs, containerdConfig, registries) + } + + deferF.Append(stop) + return kubeConfig, cl, nil +} + +func waitK3s(cfg *integration.BackendConfig, kubeConfig string) error { + logbuf := new(bytes.Buffer) + defer func() { + if logbuf.Len() > 0 { + cfg.Logs["waitK3s: "] = logbuf + } + }() + + deadline := time.Now().Add(k3sWaitWindow) + var lastErr error + for time.Now().Before(deadline) { + cmd := exec.Command(kubectlBin, "--kubeconfig", kubeConfig, "wait", "--timeout=5s", "--for=condition=Ready", "node/"+k3sNodeName) + out, err := cmd.CombinedOutput() + if err == nil && bytes.Contains(out, []byte("condition met")) { + return nil + } + lastErr = errors.Wrapf(err, "node is not ready: %s %s", cmd.String(), string(out)) + logbuf.Reset() + logbuf.WriteString(lastErr.Error()) + time.Sleep(k3sWaitDelay) + } + if lastErr == nil { + lastErr = errors.New("node did not become ready") + } + return lastErr +} + +func formatLogs(m map[string]*bytes.Buffer) string { + var ss []string + for k, b := range m { + if b != nil { + ss = append(ss, fmt.Sprintf("%q:%s", k, b.String())) + } + } + return strings.Join(ss, ",") +} diff --git a/tests/integration_test.go b/tests/integration_test.go index 574251dc5075..f4116ef4d17e 100644 --- a/tests/integration_test.go +++ b/tests/integration_test.go @@ -17,6 +17,7 @@ func init() { workers.InitRemoteMultiNodeWorker() } else { workers.InitRemoteWorker() + workers.InitKubernetesWorker() } } diff --git a/tests/workers/kubernetes.go b/tests/workers/kubernetes.go new file mode 100644 index 000000000000..ad7ca3ebbf86 --- /dev/null +++ b/tests/workers/kubernetes.go @@ -0,0 +1,109 @@ +package workers + +import ( + "context" + "os" + "os/exec" + "path/filepath" + "strings" + "sync" + + "github.com/docker/buildx/tests/helpers" + "github.com/moby/buildkit/identity" + "github.com/moby/buildkit/util/testutil/integration" + "github.com/pkg/errors" +) + +func InitKubernetesWorker() { + integration.Register(&kubernetesWorker{ + id: "kubernetes", + }) +} + +type kubernetesWorker struct { + id string + + unsupported []string + + k3sConfig string + k3sClose func() error + k3sErr error + k3sOnce sync.Once +} + +func (w *kubernetesWorker) Name() string { + return w.id +} + +func (w *kubernetesWorker) Rootless() bool { + return false +} + +func (w *kubernetesWorker) NetNSDetached() bool { + return false +} + +func (w *kubernetesWorker) New(ctx context.Context, cfg *integration.BackendConfig) (integration.Backend, func() error, error) { + w.k3sOnce.Do(func() { + w.k3sConfig, w.k3sClose, w.k3sErr = helpers.NewK3sServer(cfg) + }) + if w.k3sErr != nil { + return nil, w.k3sClose, w.k3sErr + } + + cfgfile, release, err := integration.WriteConfig(cfg.DaemonConfig) + if err != nil { + return nil, nil, err + } + if release != nil { + defer release() + } + defer os.RemoveAll(filepath.Dir(cfgfile)) + + name := "integration-kubernetes-" + identity.NewID() + cmd := exec.CommandContext(ctx, "buildx", "create", + "--bootstrap", + "--name="+name, + "--buildkitd-config="+cfgfile, + "--driver=kubernetes", + ) + cmd.Env = append( + os.Environ(), + "BUILDX_CONFIG=/tmp/buildx-"+name, + "KUBECONFIG="+w.k3sConfig, + ) + out, err := cmd.CombinedOutput() + if err != nil { + return nil, nil, errors.Wrapf(err, "failed to create buildx instance %s: %s", name, strings.TrimSpace(string(out))) + } + + cl := func() error { + cmd := exec.CommandContext(context.Background(), "buildx", "rm", "-f", name) + cmd.Env = append( + os.Environ(), + "BUILDX_CONFIG=/tmp/buildx-"+name, + "KUBECONFIG="+w.k3sConfig, + ) + return cmd.Run() + } + + return &backend{ + builder: name, + unsupportedFeatures: w.unsupported, + }, cl, nil +} + +func (w *kubernetesWorker) Close() error { + if c := w.k3sClose; c != nil { + if err := c(); err != nil { + return err + } + } + + w.k3sConfig = "" + w.k3sClose = nil + w.k3sErr = nil + w.k3sOnce = sync.Once{} + + return nil +} diff --git a/vendor/github.com/moby/buildkit/util/testutil/integration/registry.go b/vendor/github.com/moby/buildkit/util/testutil/integration/registry.go index 0cbc7434266a..855665620698 100644 --- a/vendor/github.com/moby/buildkit/util/testutil/integration/registry.go +++ b/vendor/github.com/moby/buildkit/util/testutil/integration/registry.go @@ -48,7 +48,7 @@ storage: filesystem: rootdirectory: %s http: - addr: 127.0.0.1:0 + addr: 0.0.0.0:0 `, filepath.Join(dir, "data")) if err := os.WriteFile(filepath.Join(dir, "config.yaml"), []byte(template), 0600); err != nil { @@ -79,7 +79,7 @@ http: } func detectPort(ctx context.Context, rc io.ReadCloser) (string, error) { - r := regexp.MustCompile(`listening on 127\.0\.0\.1:(\d+)`) + r := regexp.MustCompile(`listening on (?:\[\:\:\]|0\.0\.0\.0):(\d+)`) s := bufio.NewScanner(rc) found := make(chan struct{}) defer func() { diff --git a/vendor/github.com/moby/buildkit/util/testutil/integration/run.go b/vendor/github.com/moby/buildkit/util/testutil/integration/run.go index aad4cedf8a48..3b7e8c79ae91 100644 --- a/vendor/github.com/moby/buildkit/util/testutil/integration/run.go +++ b/vendor/github.com/moby/buildkit/util/testutil/integration/run.go @@ -72,6 +72,7 @@ type BackendConfig struct { Logs map[string]*bytes.Buffer DaemonConfig []ConfigUpdater CDISpecDir string + Mirror string } type Worker interface { diff --git a/vendor/github.com/moby/buildkit/util/testutil/integration/sandbox.go b/vendor/github.com/moby/buildkit/util/testutil/integration/sandbox.go index b3f770186b77..c9faff58ebed 100644 --- a/vendor/github.com/moby/buildkit/util/testutil/integration/sandbox.go +++ b/vendor/github.com/moby/buildkit/util/testutil/integration/sandbox.go @@ -92,7 +92,8 @@ func (sb *sandbox) Value(k string) any { func newSandbox(ctx context.Context, t *testing.T, w Worker, mirror string, mv matrixValue) (s Sandbox, cl func() error, err error) { cfg := &BackendConfig{ - Logs: make(map[string]*bytes.Buffer), + Logs: make(map[string]*bytes.Buffer), + Mirror: mirror, } for _, v := range mv.values { From fd66789d6fce1cb0cde60ae5d146d6398a00098b Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Fri, 3 Apr 2026 15:09:03 +0200 Subject: [PATCH 2/5] tests: patch kubernetes builders to use host networking Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- tests/workers/kubernetes.go | 47 ++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/tests/workers/kubernetes.go b/tests/workers/kubernetes.go index ad7ca3ebbf86..7e1620df48bc 100644 --- a/tests/workers/kubernetes.go +++ b/tests/workers/kubernetes.go @@ -61,29 +61,37 @@ func (w *kubernetesWorker) New(ctx context.Context, cfg *integration.BackendConf defer os.RemoveAll(filepath.Dir(cfgfile)) name := "integration-kubernetes-" + identity.NewID() + env := append( + os.Environ(), + "BUILDX_CONFIG=/tmp/buildx-"+name, + "KUBECONFIG="+w.k3sConfig, + ) + cmd := exec.CommandContext(ctx, "buildx", "create", - "--bootstrap", "--name="+name, "--buildkitd-config="+cfgfile, "--driver=kubernetes", ) - cmd.Env = append( - os.Environ(), - "BUILDX_CONFIG=/tmp/buildx-"+name, - "KUBECONFIG="+w.k3sConfig, - ) + cmd.Env = env out, err := cmd.CombinedOutput() if err != nil { return nil, nil, errors.Wrapf(err, "failed to create buildx instance %s: %s", name, strings.TrimSpace(string(out))) } + if err := patchBuilderDeployment(ctx, env, name); err != nil { + return nil, nil, err + } + + cmd = exec.CommandContext(ctx, "buildx", "inspect", "--bootstrap", name) + cmd.Env = env + out, err = cmd.CombinedOutput() + if err != nil { + return nil, nil, errors.Wrapf(err, "failed to bootstrap buildx instance %s: %s", name, strings.TrimSpace(string(out))) + } + cl := func() error { cmd := exec.CommandContext(context.Background(), "buildx", "rm", "-f", name) - cmd.Env = append( - os.Environ(), - "BUILDX_CONFIG=/tmp/buildx-"+name, - "KUBECONFIG="+w.k3sConfig, - ) + cmd.Env = env return cmd.Run() } @@ -93,6 +101,23 @@ func (w *kubernetesWorker) New(ctx context.Context, cfg *integration.BackendConf }, cl, nil } +func patchBuilderDeployment(ctx context.Context, env []string, name string) error { + cmd := exec.CommandContext(ctx, "kubectl", "patch", "deployment", name, "--type=merge", "-p", `{"spec":{"template":{"spec":{"hostNetwork":true,"dnsPolicy":"ClusterFirstWithHostNet"}}}}`) + cmd.Env = env + out, err := cmd.CombinedOutput() + if err != nil { + return errors.Wrapf(err, "failed to patch deployment %s for host networking: %s", name, strings.TrimSpace(string(out))) + } + + cmd = exec.CommandContext(ctx, "kubectl", "rollout", "status", "deployment/"+name, "--timeout=120s") + cmd.Env = env + out, err = cmd.CombinedOutput() + if err != nil { + return errors.Wrapf(err, "deployment %s did not roll out after host-network patch: %s", name, strings.TrimSpace(string(out))) + } + return nil +} + func (w *kubernetesWorker) Close() error { if c := w.k3sClose; c != nil { if err := c(); err != nil { From d2f7cb41ff64d5db737e5006476cd0cd865450de Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Fri, 3 Apr 2026 15:36:36 +0200 Subject: [PATCH 3/5] tests: patch the kubernetes builder node deployment Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- tests/workers/kubernetes.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/workers/kubernetes.go b/tests/workers/kubernetes.go index 7e1620df48bc..2a29412c7155 100644 --- a/tests/workers/kubernetes.go +++ b/tests/workers/kubernetes.go @@ -61,6 +61,7 @@ func (w *kubernetesWorker) New(ctx context.Context, cfg *integration.BackendConf defer os.RemoveAll(filepath.Dir(cfgfile)) name := "integration-kubernetes-" + identity.NewID() + nodeName := "buildkit-" + identity.NewID() env := append( os.Environ(), "BUILDX_CONFIG=/tmp/buildx-"+name, @@ -69,6 +70,7 @@ func (w *kubernetesWorker) New(ctx context.Context, cfg *integration.BackendConf cmd := exec.CommandContext(ctx, "buildx", "create", "--name="+name, + "--node="+nodeName, "--buildkitd-config="+cfgfile, "--driver=kubernetes", ) @@ -78,7 +80,7 @@ func (w *kubernetesWorker) New(ctx context.Context, cfg *integration.BackendConf return nil, nil, errors.Wrapf(err, "failed to create buildx instance %s: %s", name, strings.TrimSpace(string(out))) } - if err := patchBuilderDeployment(ctx, env, name); err != nil { + if err := patchBuilderDeployment(ctx, env, nodeName); err != nil { return nil, nil, err } @@ -101,19 +103,19 @@ func (w *kubernetesWorker) New(ctx context.Context, cfg *integration.BackendConf }, cl, nil } -func patchBuilderDeployment(ctx context.Context, env []string, name string) error { - cmd := exec.CommandContext(ctx, "kubectl", "patch", "deployment", name, "--type=merge", "-p", `{"spec":{"template":{"spec":{"hostNetwork":true,"dnsPolicy":"ClusterFirstWithHostNet"}}}}`) +func patchBuilderDeployment(ctx context.Context, env []string, nodeName string) error { + cmd := exec.CommandContext(ctx, "kubectl", "patch", "deployment", nodeName, "--type=merge", "-p", `{"spec":{"template":{"spec":{"hostNetwork":true,"dnsPolicy":"ClusterFirstWithHostNet"}}}}`) cmd.Env = env out, err := cmd.CombinedOutput() if err != nil { - return errors.Wrapf(err, "failed to patch deployment %s for host networking: %s", name, strings.TrimSpace(string(out))) + return errors.Wrapf(err, "failed to patch deployment %s for host networking: %s", nodeName, strings.TrimSpace(string(out))) } - cmd = exec.CommandContext(ctx, "kubectl", "rollout", "status", "deployment/"+name, "--timeout=120s") + cmd = exec.CommandContext(ctx, "kubectl", "rollout", "status", "deployment/"+nodeName, "--timeout=120s") cmd.Env = env out, err = cmd.CombinedOutput() if err != nil { - return errors.Wrapf(err, "deployment %s did not roll out after host-network patch: %s", name, strings.TrimSpace(string(out))) + return errors.Wrapf(err, "deployment %s did not roll out after host-network patch: %s", nodeName, strings.TrimSpace(string(out))) } return nil } From b644614791b591c05da9cb2db35891fe150d369c Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Fri, 3 Apr 2026 16:54:12 +0200 Subject: [PATCH 4/5] tests: patch kubernetes builders after bootstrap Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- tests/workers/kubernetes.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/workers/kubernetes.go b/tests/workers/kubernetes.go index 2a29412c7155..b92abee959d8 100644 --- a/tests/workers/kubernetes.go +++ b/tests/workers/kubernetes.go @@ -80,15 +80,22 @@ func (w *kubernetesWorker) New(ctx context.Context, cfg *integration.BackendConf return nil, nil, errors.Wrapf(err, "failed to create buildx instance %s: %s", name, strings.TrimSpace(string(out))) } + cmd = exec.CommandContext(ctx, "buildx", "inspect", "--bootstrap", name) + cmd.Env = env + out, err = cmd.CombinedOutput() + if err != nil { + return nil, nil, errors.Wrapf(err, "failed to bootstrap buildx instance %s: %s", name, strings.TrimSpace(string(out))) + } + if err := patchBuilderDeployment(ctx, env, nodeName); err != nil { return nil, nil, err } - cmd = exec.CommandContext(ctx, "buildx", "inspect", "--bootstrap", name) + cmd = exec.CommandContext(ctx, "buildx", "inspect", name) cmd.Env = env out, err = cmd.CombinedOutput() if err != nil { - return nil, nil, errors.Wrapf(err, "failed to bootstrap buildx instance %s: %s", name, strings.TrimSpace(string(out))) + return nil, nil, errors.Wrapf(err, "failed to inspect buildx instance %s after host-network patch: %s", name, strings.TrimSpace(string(out))) } cl := func() error { From 31342c76852b37e19c590793f7fc9d443b7605c5 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Fri, 3 Apr 2026 17:32:15 +0200 Subject: [PATCH 5/5] ci: serialize kubernetes integration tests Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b8272faccd58..c42f2cb3d29f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -109,7 +109,7 @@ jobs: fi testFlags="--run=//worker=$(echo "${{ matrix.worker }}" | sed 's/\+/\\+/g')$" case "${{ matrix.worker }}" in - docker | docker+containerd | docker@* | docker+containerd@* | remote+multinode) + docker | docker+containerd | docker@* | docker+containerd@* | remote+multinode | kubernetes) echo "TESTFLAGS=${{ env.TESTFLAGS_DOCKER }} $testFlags" >> $GITHUB_ENV ;; *)