feat(builder): log build failure output as separate lines
Log each line of build failure output as a separate structured log entry at WARN level, making output readable and queryable in Loki/Grafana. Add repo and rev fields to all build-related log entries. Add truncateOutputLines helper that returns a []string for per-line logging. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package builder
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
@@ -83,6 +84,54 @@ func makeLines(n int) []string {
|
||||
return lines
|
||||
}
|
||||
|
||||
func TestTruncateOutputLines(t *testing.T) {
|
||||
t.Run("short output returns all lines", func(t *testing.T) {
|
||||
input := "line1\nline2\nline3"
|
||||
got := truncateOutputLines(input, 50)
|
||||
if len(got) != 3 {
|
||||
t.Errorf("got %d lines, want 3", len(got))
|
||||
}
|
||||
if got[0] != "line1" || got[1] != "line2" || got[2] != "line3" {
|
||||
t.Errorf("unexpected lines: %v", got)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("over threshold returns head + marker + tail", func(t *testing.T) {
|
||||
lines := makeLines(200)
|
||||
input := strings.Join(lines, "\n")
|
||||
got := truncateOutputLines(input, 50)
|
||||
|
||||
// Should be 50 head + 1 marker + 50 tail = 101
|
||||
if len(got) != 101 {
|
||||
t.Errorf("got %d lines, want 101", len(got))
|
||||
}
|
||||
|
||||
// Check first and last lines preserved
|
||||
if got[0] != lines[0] {
|
||||
t.Errorf("first line = %q, want %q", got[0], lines[0])
|
||||
}
|
||||
if got[len(got)-1] != lines[len(lines)-1] {
|
||||
t.Errorf("last line = %q, want %q", got[len(got)-1], lines[len(lines)-1])
|
||||
}
|
||||
|
||||
// Check omitted marker
|
||||
marker := got[50]
|
||||
expected := fmt.Sprintf("... (%d lines omitted) ...", 100)
|
||||
if marker != expected {
|
||||
t.Errorf("marker = %q, want %q", marker, expected)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("exactly at threshold returns all lines", func(t *testing.T) {
|
||||
lines := makeLines(100)
|
||||
input := strings.Join(lines, "\n")
|
||||
got := truncateOutputLines(input, 50)
|
||||
if len(got) != 100 {
|
||||
t.Errorf("got %d lines, want 100", len(got))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestTruncateOutputPreservesContent(t *testing.T) {
|
||||
// Create input with distinct first and last lines
|
||||
lines := make([]string, 200)
|
||||
|
||||
Reference in New Issue
Block a user