From f60ab00b315878a0cbb3b7cae7fe202ef3f28036 Mon Sep 17 00:00:00 2001 From: apostasie Date: Mon, 14 Apr 2025 09:13:53 -0700 Subject: [PATCH] Workaround buildg time-out See https://github.com/containerd/nerdctl/issues/4046 Root cause is undiagnosed / unclear, but it seems like in some circumstances, buildg command is too late to read from stdin. This workaround introduces an arbitrary delay before writing to stdin, as a temporary solution to reduce test flakyness. Signed-off-by: apostasie --- Dockerfile | 3 +++ cmd/nerdctl/builder/builder.go | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 0f69003ac81..08d237a46b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -250,6 +250,9 @@ COPY docs /out/share/doc/nerdctl/docs RUN (cd /out && find ! -type d | sort | xargs sha256sum > /tmp/SHA256SUMS ) && \ mv /tmp/SHA256SUMS /out/share/doc/nerdctl-full/SHA256SUMS && \ chown -R 0:0 /out +RUN git clone https://github.com/apostasie/buildg.git /tmp/buildg; cd /tmp/buildg; \ + go build -o /out/bin/buildg . + FROM scratch AS out-full COPY --from=build-full /out / diff --git a/cmd/nerdctl/builder/builder.go b/cmd/nerdctl/builder/builder.go index 46ae2cfc66d..9d6d4599f0b 100644 --- a/cmd/nerdctl/builder/builder.go +++ b/cmd/nerdctl/builder/builder.go @@ -21,10 +21,13 @@ import ( "os" "os/exec" "strings" + "time" "github.com/docker/go-units" "github.com/spf13/cobra" + "github.com/containerd/log" + "github.com/containerd/nerdctl/v2/cmd/nerdctl/helpers" "github.com/containerd/nerdctl/v2/pkg/api/types" "github.com/containerd/nerdctl/v2/pkg/cmd/builder" @@ -228,7 +231,18 @@ func debugAction(cmd *cobra.Command, args []string) error { buildgCmd.Stdout = cmd.OutOrStdout() buildgCmd.Stderr = cmd.ErrOrStderr() if err := buildgCmd.Start(); err != nil { - return err + // Tentative workaround for https://github.com/containerd/nerdctl/issues/4046 + log.L.Errorf("failed to start buildg: %v", err) + time.Sleep(time.Second) + buildgCmd = exec.Command(buildgBinary, append(buildgArgs, args[0])...) + buildgCmd.Env = os.Environ() + buildgCmd.Stdin = cmd.InOrStdin() + buildgCmd.Stdout = cmd.OutOrStdout() + buildgCmd.Stderr = cmd.ErrOrStderr() + if err := buildgCmd.Start(); err != nil { + log.L.Errorf("failed to start buildg (retry): %v", err) + return err + } } return buildgCmd.Wait()