Skip to content

Commit 0f01dd7

Browse files
committed
fix(tasks): summary scanner
1 parent 8f453af commit 0f01dd7

File tree

2 files changed

+48
-13
lines changed

2 files changed

+48
-13
lines changed

services/tasks/stage_parsers/ansible_play.go

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package stage_parsers
33
import (
44
"github.com/semaphoreui/semaphore/db"
55
"github.com/semaphoreui/semaphore/util"
6+
"regexp"
67
"strings"
78
)
89

@@ -48,6 +49,9 @@ func (p AnsibleRunningStageParser) IsEnd(currentStage *db.TaskStage, output db.T
4849
const ansibleTaskMaker = "TASK ["
4950
const failedTaskMaker = "fatal: ["
5051

52+
var newTaskMakerRE = regexp.MustCompile(`^\w+: \[`)
53+
var fatalTaskRE = regexp.MustCompile(`^fatal: \[([^]]+)]: FAILED! => (.*)$`)
54+
5155
func (p AnsibleRunningStageParser) Parse(currentStage *db.TaskStage, output db.TaskOutput, store db.Store, projectID int) (ok bool, err error) {
5256

5357
if currentStage == nil {
@@ -64,6 +68,7 @@ func (p AnsibleRunningStageParser) Parse(currentStage *db.TaskStage, output db.T
6468

6569
if strings.HasPrefix(line, ansibleTaskMaker) {
6670
p.state.Tasks++
71+
6772
if p.state.CurrentFailedHost != "" {
6873
err = store.CreateAnsibleTaskError(db.AnsibleTaskError{
6974
TaskID: currentStage.TaskID,
@@ -82,13 +87,40 @@ func (p AnsibleRunningStageParser) Parse(currentStage *db.TaskStage, output db.T
8287
p.state.CurrentTask = line[len(ansibleTaskMaker):end]
8388
p.state.CurrentFailedHost = ""
8489
p.state.CurrentHostAnswer = ""
90+
8591
} else if strings.HasPrefix(line, failedTaskMaker) {
86-
end := strings.Index(line, "]")
87-
start := len(failedTaskMaker)
88-
p.state.CurrentFailedHost = line[start:end]
89-
p.state.CurrentHostAnswer = ""
92+
93+
if p.state.CurrentFailedHost != "" {
94+
err = store.CreateAnsibleTaskError(db.AnsibleTaskError{
95+
TaskID: currentStage.TaskID,
96+
ProjectID: projectID,
97+
Host: p.state.CurrentFailedHost,
98+
Task: p.state.CurrentTask,
99+
Error: p.state.CurrentHostAnswer,
100+
})
101+
102+
if err != nil {
103+
return
104+
}
105+
}
106+
107+
m := fatalTaskRE.FindStringSubmatch(line)
108+
if len(m) > 0 {
109+
host := strings.TrimSpace(m[1])
110+
msg := strings.TrimSpace(m[2])
111+
p.state.CurrentFailedHost = host
112+
p.state.CurrentHostAnswer = msg
113+
} else {
114+
end := strings.Index(line, "]")
115+
start := len(failedTaskMaker)
116+
p.state.CurrentFailedHost = line[start:end]
117+
p.state.CurrentHostAnswer = ""
118+
}
119+
90120
} else if p.state.CurrentFailedHost != "" {
91-
if line == "" {
121+
m := newTaskMakerRE.FindStringSubmatch(line)
122+
if line == "" || len(m) > 0 {
123+
92124
if p.state.CurrentFailedHost != "" {
93125
err = store.CreateAnsibleTaskError(db.AnsibleTaskError{
94126
TaskID: currentStage.TaskID,
@@ -104,6 +136,7 @@ func (p AnsibleRunningStageParser) Parse(currentStage *db.TaskStage, output db.T
104136
}
105137
p.state.CurrentFailedHost = ""
106138
p.state.CurrentHostAnswer = ""
139+
107140
} else {
108141
p.state.CurrentHostAnswer += "\n" + line
109142
}

web/src/components/AnsibleStageView.vue

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
:headers="notOkServersHeaders"
5151
:items="failedTasks"
5252
:items-per-page="Number.MAX_VALUE"
53+
class="w-100"
5354
>
5455
<template v-slot:item.error="{ item }">
5556
<div
@@ -61,15 +62,16 @@
6162
<td
6263
:colspan="headers.length"
6364
>
64-
<pre style="overflow: auto;
65-
background: gray;
66-
font-size: 14px;
67-
color: white;
68-
border-radius: 10px;
69-
margin-top: 5px; margin-bottom: 5px;"
65+
<pre style="overflow: auto;
66+
background: gray;
67+
font-size: 14px;
68+
color: white;
69+
border-radius: 10px;
70+
white-space: wrap;
71+
margin-top: 5px; margin-bottom: 5px;"
7072

71-
class="pa-2"
72-
>{{ item.error.trim() }}</pre>
73+
class="pa-2"
74+
>{{ item.error.trim() }}</pre>
7375
</td>
7476
</template>
7577
</v-data-table>

0 commit comments

Comments
 (0)