Skip to content

Commit

Permalink
Merge pull request #2086 from ktock/debug-errormessage
Browse files Browse the repository at this point in the history
debug: Following-up patches for error messages
  • Loading branch information
tonistiigi authored Oct 25, 2023
2 parents e437f7b + 14834e6 commit 6f71ea8
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 14 deletions.
13 changes: 10 additions & 3 deletions commands/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -401,13 +401,17 @@ func runControllerBuild(ctx context.Context, dockerCli command.Cli, opts *contro
pw2.Close() // propagate EOF
return nil
})
err = options.invokeConfig.runDebug(ctx, ref, opts, c, pr2, os.Stdout, os.Stderr, printer)
monitorBuildResult, err := options.invokeConfig.runDebug(ctx, ref, opts, c, pr2, os.Stdout, os.Stderr, printer)
if err := pw2.Close(); err != nil {
logrus.Debug("failed to close monitor stdin pipe reader")
}
if err != nil {
logrus.Warnf("failed to run monitor: %v", err)
}
if monitorBuildResult != nil {
// Update return values with the last build result from monitor
resp, retErr = monitorBuildResult.Resp, monitorBuildResult.Err
}
} else {
if err := c.Disconnect(ctx, ref); err != nil {
logrus.Warnf("disconnect error: %v", err)
Expand All @@ -418,6 +422,9 @@ func runControllerBuild(ctx context.Context, dockerCli command.Cli, opts *contro
}

func printError(err error, printer *progress.Printer) error {
if err == nil {
return nil
}
if err := printer.Pause(); err != nil {
return err
}
Expand Down Expand Up @@ -841,14 +848,14 @@ func (cfg *invokeConfig) needsDebug(retErr error) bool {
}
}

func (cfg *invokeConfig) runDebug(ctx context.Context, ref string, options *controllerapi.BuildOptions, c control.BuildxController, stdin io.ReadCloser, stdout io.WriteCloser, stderr console.File, progress *progress.Printer) error {
func (cfg *invokeConfig) runDebug(ctx context.Context, ref string, options *controllerapi.BuildOptions, c control.BuildxController, stdin io.ReadCloser, stdout io.WriteCloser, stderr console.File, progress *progress.Printer) (*monitor.MonitorBuildResult, error) {
con := console.Current()
if err := con.SetRaw(); err != nil {
// TODO: run disconnect in build command (on error case)
if err := c.Disconnect(ctx, ref); err != nil {
logrus.Warnf("disconnect error: %v", err)
}
return errors.Errorf("failed to configure terminal: %v", err)
return nil, errors.Errorf("failed to configure terminal: %v", err)
}
defer con.Reset()
return monitor.RunMonitor(ctx, ref, options, cfg.InvokeConfig, c, stdin, stdout, stderr, progress)
Expand Down
2 changes: 1 addition & 1 deletion commands/debug/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ func RootCmd(dockerCli command.Cli, children ...DebuggableCmd) *cobra.Command {
return errors.Errorf("failed to configure terminal: %v", err)
}

err = monitor.RunMonitor(ctx, "", nil, controllerapi.InvokeConfig{
_, err = monitor.RunMonitor(ctx, "", nil, controllerapi.InvokeConfig{
Tty: true,
}, c, dockerCli.In(), os.Stdout, os.Stderr, printer)
con.Reset()
Expand Down
6 changes: 1 addition & 5 deletions controller/processes/processes.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,7 @@ func (m *Manager) StartProcess(pid string, resultCtx *build.ResultHandle, cfg *p
go func() {
var err error
if err = ctr.Exec(ctx, cfg, in.Stdin, in.Stdout, in.Stderr); err != nil {
if errors.Is(err, context.Canceled) {
logrus.Debugf("process canceled: %v", err)
} else {
logrus.Errorf("failed to exec process: %v", err)
}
logrus.Debugf("process error: %v", err)
}
logrus.Debugf("finished process %s %v", pid, cfg.Entrypoint)
m.processes.Delete(pid)
Expand Down
6 changes: 6 additions & 0 deletions monitor/commands/reload.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
controllerapi "github.com/docker/buildx/controller/pb"
"github.com/docker/buildx/monitor/types"
"github.com/docker/buildx/util/progress"
"github.com/moby/buildkit/solver/errdefs"
"github.com/pkg/errors"
)

Expand Down Expand Up @@ -70,6 +71,11 @@ func (cm *ReloadCmd) Exec(ctx context.Context, args []string) error {
} else {
fmt.Printf("failed to reload: %v\n", err)
}
// report error
for _, s := range errdefs.Sources(err) {
s.Print(cm.stdout)
}
fmt.Fprintf(cm.stdout, "ERROR: %v\n", err)
} else {
resultUpdated = true
}
Expand Down
28 changes: 23 additions & 5 deletions monitor/monitor.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,28 @@ import (
"github.com/docker/buildx/util/ioset"
"github.com/docker/buildx/util/progress"
"github.com/google/shlex"
"github.com/moby/buildkit/client"
"github.com/moby/buildkit/identity"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"golang.org/x/term"
)

type MonitorBuildResult struct {
Resp *client.SolveResponse
Err error
}

// RunMonitor provides an interactive session for running and managing containers via specified IO.
func RunMonitor(ctx context.Context, curRef string, options *controllerapi.BuildOptions, invokeConfig controllerapi.InvokeConfig, c control.BuildxController, stdin io.ReadCloser, stdout io.WriteCloser, stderr console.File, progress *progress.Printer) error {
func RunMonitor(ctx context.Context, curRef string, options *controllerapi.BuildOptions, invokeConfig controllerapi.InvokeConfig, c control.BuildxController, stdin io.ReadCloser, stdout io.WriteCloser, stderr console.File, progress *progress.Printer) (*MonitorBuildResult, error) {
defer func() {
if err := c.Disconnect(ctx, curRef); err != nil {
logrus.Warnf("disconnect error: %v", err)
}
}()

if err := progress.Pause(); err != nil {
return err
return nil, err
}
defer progress.Unpause()

Expand Down Expand Up @@ -169,10 +175,10 @@ func RunMonitor(ctx context.Context, curRef string, options *controllerapi.Build
select {
case <-doneCh:
m.close()
return nil
return m.lastBuildResult, nil
case err := <-errCh:
m.close()
return err
return m.lastBuildResult, err
case <-monitorDisableCh:
}
monitorForwarder.SetOut(nil)
Expand Down Expand Up @@ -233,6 +239,14 @@ type monitor struct {
invokeIO *ioset.Forwarder
invokeCancel func()
attachedPid atomic.Value

lastBuildResult *MonitorBuildResult
}

func (m *monitor) Build(ctx context.Context, options controllerapi.BuildOptions, in io.ReadCloser, progress progress.Writer) (ref string, resp *client.SolveResponse, err error) {
ref, resp, err = m.BuildxController.Build(ctx, options, in, progress)
m.lastBuildResult = &MonitorBuildResult{Resp: resp, Err: err} // Record build result
return
}

func (m *monitor) DisconnectSession(ctx context.Context, targetID string) error {
Expand Down Expand Up @@ -288,7 +302,11 @@ func (m *monitor) startInvoke(ctx context.Context, pid string, cfg controllerapi
go func() {
// Start a new invoke
if err := m.invoke(ctx, pid, cfg); err != nil {
logrus.Debugf("invoke error: %v", err)
if errors.Is(err, context.Canceled) {
logrus.Debugf("process canceled: %v", err)
} else {
logrus.Errorf("invoke: %v", err)
}
}
if pid == m.attachedPid.Load() {
m.attachedPid.Store("")
Expand Down

0 comments on commit 6f71ea8

Please sign in to comment.