From 16d5b38f2bd6688255ad41fa44950c5a996b3729 Mon Sep 17 00:00:00 2001 From: Justin Chadwell Date: Mon, 24 Apr 2023 09:58:02 +0100 Subject: [PATCH] debug: display build warnings after each build Signed-off-by: Justin Chadwell --- commands/bake.go | 3 +-- commands/build.go | 16 ++++++++++------ util/progress/printer.go | 38 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/commands/bake.go b/commands/bake.go index 4a33cd6e..7e31c4fd 100644 --- a/commands/bake.go +++ b/commands/bake.go @@ -17,7 +17,6 @@ import ( "github.com/docker/buildx/util/tracing" "github.com/docker/cli/cli/command" "github.com/moby/buildkit/util/appcontext" - "github.com/moby/buildkit/util/progress/progressui" "github.com/pkg/errors" "github.com/spf13/cobra" ) @@ -118,7 +117,7 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com } printer, err := progress.NewPrinter(ctx2, os.Stderr, os.Stderr, cFlags.progress, - progressui.WithDesc(progressTextDesc, progressConsoleDesc), + progress.WithDesc(progressTextDesc, progressConsoleDesc), ) if err != nil { return err diff --git a/commands/build.go b/commands/build.go index 9f84f091..ceaeb28c 100644 --- a/commands/build.go +++ b/commands/build.go @@ -40,7 +40,6 @@ import ( "github.com/moby/buildkit/solver/errdefs" "github.com/moby/buildkit/util/appcontext" "github.com/moby/buildkit/util/grpcerrors" - "github.com/moby/buildkit/util/progress/progressui" "github.com/morikuni/aec" "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -225,10 +224,16 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) { if err != nil { return err } - printer, err := progress.NewPrinter(ctx2, os.Stderr, os.Stderr, progressMode, progressui.WithDesc( - fmt.Sprintf("building with %q instance using %s driver", b.Name, b.Driver), - fmt.Sprintf("%s:%s", b.Driver, b.Name), - )) + var printer *progress.Printer + printer, err = progress.NewPrinter(ctx2, os.Stderr, os.Stderr, progressMode, + progress.WithDesc( + fmt.Sprintf("building with %q instance using %s driver", b.Name, b.Driver), + fmt.Sprintf("%s:%s", b.Driver, b.Name), + ), + progress.WithOnClose(func() { + printWarnings(os.Stderr, printer.Warnings(), progressMode) + }), + ) if err != nil { return err } @@ -244,7 +249,6 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) { if err := printer.Wait(); retErr == nil { retErr = err } - printWarnings(os.Stderr, printer.Warnings(), progressMode) if retErr != nil { return retErr } diff --git a/util/progress/printer.go b/util/progress/printer.go index ea9849c0..97ed8833 100644 --- a/util/progress/printer.go +++ b/util/progress/printer.go @@ -84,7 +84,12 @@ func (p *Printer) ClearLogSource(v interface{}) { } } -func NewPrinter(ctx context.Context, w io.Writer, out console.File, mode string, solveStatusOpt ...progressui.DisplaySolveStatusOpt) (*Printer, error) { +func NewPrinter(ctx context.Context, w io.Writer, out console.File, mode string, opts ...PrinterOpt) (*Printer, error) { + opt := &printerOpts{} + for _, o := range opts { + o(opt) + } + if v := os.Getenv("BUILDKIT_PROGRESS"); v != "" && mode == PrinterModeAuto { mode = v } @@ -119,10 +124,13 @@ func NewPrinter(ctx context.Context, w io.Writer, out console.File, mode string, resumeLogs := logutil.Pause(logrus.StandardLogger()) // not using shared context to not disrupt display but let is finish reporting errors - pw.warnings, pw.err = progressui.DisplaySolveStatus(ctx, c, w, pw.status, solveStatusOpt...) + pw.warnings, pw.err = progressui.DisplaySolveStatus(ctx, c, w, pw.status, opt.displayOpts...) resumeLogs() close(pw.done) + if opt.onclose != nil { + opt.onclose() + } if pw.paused == nil { break } @@ -135,3 +143,29 @@ func NewPrinter(ctx context.Context, w io.Writer, out console.File, mode string, <-pw.ready return pw, nil } + +type printerOpts struct { + displayOpts []progressui.DisplaySolveStatusOpt + + onclose func() +} + +type PrinterOpt func(b *printerOpts) + +func WithPhase(phase string) PrinterOpt { + return func(opt *printerOpts) { + opt.displayOpts = append(opt.displayOpts, progressui.WithPhase(phase)) + } +} + +func WithDesc(text string, console string) PrinterOpt { + return func(opt *printerOpts) { + opt.displayOpts = append(opt.displayOpts, progressui.WithDesc(text, console)) + } +} + +func WithOnClose(onclose func()) PrinterOpt { + return func(opt *printerOpts) { + opt.onclose = onclose + } +}