From a711b8ff88044d1ea0da27aeb1b351639999f559 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Mon, 30 Jun 2025 15:54:11 +0200 Subject: [PATCH] cmd: fix possible skipped defers for build and bake Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- .golangci.yml | 1 - cmd/buildx/main.go | 8 ++++++++ commands/bake.go | 3 ++- commands/build.go | 6 +++--- util/cobrautil/error.go | 15 +++++++++++++++ 5 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 util/cobrautil/error.go diff --git a/.golangci.yml b/.golangci.yml index 900134f46..c494598d6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -49,7 +49,6 @@ linters: - "assignOp" - "appendAssign" - "singleCaseSwitch" - - "exitAfterDefer" # FIXME gosec: excludes: - G204 diff --git a/cmd/buildx/main.go b/cmd/buildx/main.go index 078adac41..7ebf42d82 100644 --- a/cmd/buildx/main.go +++ b/cmd/buildx/main.go @@ -7,6 +7,7 @@ import ( "path/filepath" "github.com/docker/buildx/commands" + "github.com/docker/buildx/util/cobrautil" "github.com/docker/buildx/util/desktop" "github.com/docker/buildx/version" "github.com/docker/cli/cli" @@ -101,6 +102,13 @@ func main() { os.Exit(sterr.StatusCode) } + // Check for ExitCodeError, which is used to exit with a specific code + // without printing an error message. + var exitCodeErr cobrautil.ExitCodeError + if errors.As(err, &exitCodeErr) { + os.Exit(int(exitCodeErr)) + } + for _, s := range solvererrdefs.Sources(err) { s.Print(cmd.Err()) } diff --git a/commands/bake.go b/commands/bake.go index e1e4e44cc..88bf4127c 100644 --- a/commands/bake.go +++ b/commands/bake.go @@ -24,6 +24,7 @@ import ( "github.com/docker/buildx/builder" "github.com/docker/buildx/localstate" "github.com/docker/buildx/util/buildflags" + "github.com/docker/buildx/util/cobrautil" "github.com/docker/buildx/util/cobrautil/completion" "github.com/docker/buildx/util/confutil" "github.com/docker/buildx/util/desktop" @@ -448,7 +449,7 @@ func runBake(ctx context.Context, dockerCli command.Cli, targets []string, in ba } if exitCode != 0 { - os.Exit(exitCode) + return cobrautil.ExitCodeError(exitCode) } return nil diff --git a/commands/build.go b/commands/build.go index f2b126c3e..39d733be2 100644 --- a/commands/build.go +++ b/commands/build.go @@ -384,10 +384,10 @@ func runBuild(ctx context.Context, dockerCli command.Cli, options buildOptions) } } if opts.CallFunc != nil { - if exitcode, err := printResult(dockerCli.Out(), opts.CallFunc, resp.ExporterResponse, options.target, inputs); err != nil { + if exitCode, err := printResult(dockerCli.Out(), opts.CallFunc, resp.ExporterResponse, options.target, inputs); err != nil { return err - } else if exitcode != 0 { - os.Exit(exitcode) + } else if exitCode != 0 { + return cobrautil.ExitCodeError(exitCode) } } if v, ok := resp.ExporterResponse["frontend.result.inlinemessage"]; ok { diff --git a/util/cobrautil/error.go b/util/cobrautil/error.go new file mode 100644 index 000000000..09627c1ce --- /dev/null +++ b/util/cobrautil/error.go @@ -0,0 +1,15 @@ +package cobrautil + +import ( + "fmt" +) + +type ExitCodeError int + +func (e ExitCodeError) Error() string { + return fmt.Sprintf("exiting with code %d", int(e)) +} + +func (e ExitCodeError) Unwrap() error { + return nil +}