返回 DeepSeek-Reasonix
ci_output.go
根目录 / internal / agent / ci_output.go
1 package agent
2
3 import (
4 "regexp"
5 "strings"
6 )
7
8 var (
9 teamcityLine = regexp.MustCompile(`(?m)^##teamcity\[.*\]$`)
10 failTestLine = regexp.MustCompile(`(?i)(FAIL|ERROR|error:|failed|exit status|exit code)`)
11 exitCodeLine = regexp.MustCompile(`(?i)exit (status|code)[:= ]+(-?\d+)`)
12 )
13
14 func summarizeCIOutput(body string) string {
15 if !looksLikeCILog(body) {
16 return body
17 }
18 lines := strings.Split(body, "\n")
19 var failures []string
20 exit := ""
21 for _, line := range lines {
22 trim := strings.TrimSpace(line)
23 if trim == "" {
24 continue
25 }
26 if exit == "" {
27 if m := exitCodeLine.FindStringSubmatch(trim); len(m) == 3 {
28 exit = m[2]
29 }
30 }
31 if failTestLine.MatchString(trim) || strings.Contains(trim, "##teamcity") {
32 if len(failures) < 12 {
33 failures = append(failures, trim)
34 }
35 }
36 }
37 head, tail := ciHeadTail(body, 8, 8)
38 var b strings.Builder
39 b.WriteString("CI/log summary (full original retained locally):\n")
40 if exit != "" {
41 b.WriteString("exit_code: ")
42 b.WriteString(exit)
43 b.WriteByte('\n')
44 }
45 if len(failures) > 0 {
46 b.WriteString("failures:\n")
47 for _, line := range failures {
48 b.WriteString("- ")
49 b.WriteString(line)
50 b.WriteByte('\n')
51 }
52 }
53 b.WriteString("head:\n")
54 b.WriteString(head)
55 b.WriteString("\n...\ntail:\n")
56 b.WriteString(tail)
57 return strings.TrimRight(b.String(), "\n")
58 }
59
60 func looksLikeCILog(body string) bool {
61 if teamcityLine.MatchString(body) {
62 return true
63 }
64 if strings.Contains(body, "TeamCity") || strings.Contains(body, "BUILD FAILED") {
65 return true
66 }
67 return strings.Count(body, "FAIL") >= 3 && len(body) > 8<<10
68 }
69
70 func ciHeadTail(body string, headLines, tailLines int) (string, string) {
71 lines := strings.Split(body, "\n")
72 if len(lines) <= headLines+tailLines {
73 return body, ""
74 }
75 return strings.Join(lines[:headLines], "\n"), strings.Join(lines[len(lines)-tailLines:], "\n")
76 }
77
77 lines GO