Skip to content

Commit 4c167d2

Browse files
Surface extension build output on build-script failures
Co-authored-by: richardpark-msft <51494936+richardpark-msft@users.noreply.github.com>
1 parent 76fb417 commit 4c167d2

2 files changed

Lines changed: 37 additions & 3 deletions

File tree

cli/azd/extensions/microsoft.azd.extensions/internal/cmd/build.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"errors"
99
"fmt"
10+
"io"
1011
"log"
1112
"os"
1213
"os/exec"
@@ -124,9 +125,13 @@ func runBuildAction(ctx context.Context, flags *buildFlags) error {
124125
}
125126

126127
var buildWarnings []string
128+
var buildFailureOutput string
127129
// Flush collected validation warnings after the live TaskList canvas completes,
128130
// regardless of whether a later task fails.
129-
defer func() { writeCollectedWarnings(os.Stdout, buildWarnings) }()
131+
defer func() {
132+
writeCollectedWarnings(os.Stdout, buildWarnings)
133+
writeBuildFailureOutput(os.Stderr, buildFailureOutput)
134+
}()
130135

131136
taskList := ux.NewTaskList(nil).
132137
AddTask(ux.TaskOptions{
@@ -203,10 +208,11 @@ func runBuildAction(ctx context.Context, flags *buildFlags) error {
203208

204209
if result, err := cmd.CombinedOutput(); err != nil {
205210
flags.skipInstall = true
211+
buildFailureOutput = string(result)
206212

207213
return ux.Error, common.NewDetailedError(
208-
"Build Failed",
209-
fmt.Errorf("failed to build artifacts: %s, %w", string(result), err),
214+
"Build failed"+subprocessErrorTail(result),
215+
fmt.Errorf("failed to build artifacts: %w", err),
210216
)
211217
}
212218
}
@@ -420,3 +426,14 @@ func defaultBuildFlags(flags *buildFlags) {
420426
flags.outputPath = "bin"
421427
}
422428
}
429+
430+
func writeBuildFailureOutput(writer io.Writer, buildOutput string) {
431+
trimmed := strings.TrimSpace(buildOutput)
432+
if trimmed == "" {
433+
return
434+
}
435+
436+
fmt.Fprintln(writer, output.WithErrorFormat("Build output:"))
437+
fmt.Fprintln(writer, trimmed)
438+
fmt.Fprintln(writer)
439+
}

cli/azd/extensions/microsoft.azd.extensions/internal/cmd/init_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,23 @@ func TestValidationWarningSummary(t *testing.T) {
468468
assert.Equal(t, "2 validation warnings", validationWarningSummary([]string{"first", "second"}))
469469
}
470470

471+
func TestWriteBuildFailureOutput(t *testing.T) {
472+
t.Run("writes heading and output when present", func(t *testing.T) {
473+
var buf bytes.Buffer
474+
writeBuildFailureOutput(&buf, "\n build failed at step 2 \n")
475+
476+
out := buf.String()
477+
assert.Contains(t, out, "Build output:")
478+
assert.Contains(t, out, "build failed at step 2")
479+
})
480+
481+
t.Run("no output when empty", func(t *testing.T) {
482+
var buf bytes.Buffer
483+
writeBuildFailureOutput(&buf, " \n\t")
484+
assert.Empty(t, buf.String())
485+
})
486+
}
487+
471488
func TestSubprocessErrorTail(t *testing.T) {
472489
tests := []struct {
473490
name string

0 commit comments

Comments
 (0)