Skip to content

Commit 1a85d90

Browse files
author
Triona Doyle
committed
Rerun failed e2e tests from pipeline log
Signed-off-by: Triona Doyle <bot@example.com>
1 parent 7f420e9 commit 1a85d90

1 file changed

Lines changed: 168 additions & 0 deletions

File tree

rerun-operator-e2e-failures.sh

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
#!/bin/bash
2+
3+
if [ -z "$1" ]; then
4+
echo "Usage: $0 <log_file>"
5+
exit 1
6+
fi
7+
8+
LOG_FILE=$1
9+
if [ ! -f "$LOG_FILE" ]; then
10+
echo "File not found: $LOG_FILE"
11+
exit 1
12+
fi
13+
14+
CLEAN_LOG=$(mktemp)
15+
RERUN_LOG=$(mktemp)
16+
CLEAN_RERUN=$(mktemp)
17+
trap 'rm -f "$CLEAN_LOG" "$RERUN_LOG" "$CLEAN_RERUN"' EXIT
18+
19+
if ! command -v go &> /dev/null; then
20+
echo "Go is required."
21+
exit 1
22+
fi
23+
24+
go mod tidy >/dev/null 2>&1
25+
go mod download >/dev/null 2>&1
26+
go mod vendor >/dev/null 2>&1
27+
28+
# Strip colors for processing
29+
sed 's/\x1b\[[0-9;]*m//g' "$LOG_FILE" > "$CLEAN_LOG"
30+
31+
PARSE_AWK='
32+
/\[FAIL\]/ {
33+
s="[Unknown]"
34+
if ($0 ~ /Sequential/) s="[Sequential]"
35+
if ($0 ~ /Parallel/) s="[Parallel]"
36+
match($0, /[0-9]-[0-9]{3}[-_][a-zA-Z0-9_-]+/);
37+
if (RLENGTH > 0) {
38+
val = substr($0, RSTART, RLENGTH);
39+
sub(/_test$/, "", val);
40+
print s " " val;
41+
}
42+
}'
43+
44+
FAILURES=$(awk "$PARSE_AWK" "$CLEAN_LOG" | sort | uniq)
45+
SUITE_FAILED=$(grep -c "A BeforeSuite node failed" "$CLEAN_LOG" || true)
46+
47+
if [ -z "$FAILURES" ] && [ "$SUITE_FAILED" -eq 0 ]; then
48+
echo "No test failures found."
49+
exit 0
50+
fi
51+
52+
echo "Tests to rerun:"
53+
[ -n "$FAILURES" ] && echo "$FAILURES" | sed 's/^/ /'
54+
echo ""
55+
56+
GINKGO="./bin/ginkgo"
57+
[ ! -x "$GINKGO" ] && GINKGO="ginkgo"
58+
59+
export OPERATOR_NAMESPACE="${OPERATOR_NAMESPACE:-openshift-gitops-operator}"
60+
SEQ_DIR="./test/openshift/e2e/ginkgo/sequential"
61+
PAR_DIR="./test/openshift/e2e/ginkgo/parallel"
62+
63+
echo "⏳ Executing reruns in strict isolation..."
64+
echo "----------------------------------------------------------------"
65+
66+
> "$RERUN_LOG"
67+
68+
if [ -n "$FAILURES" ]; then
69+
echo "$FAILURES" | while read -r line; do
70+
SUITE_TYPE=$(echo "$line" | awk '{print $1}')
71+
TEST_ID=$(echo "$line" | awk '{print $2}')
72+
73+
if [ "$SUITE_TYPE" = "[Sequential]" ]; then
74+
SUITE_DIR="$SEQ_DIR"
75+
else
76+
SUITE_DIR="$PAR_DIR"
77+
fi
78+
79+
echo -n "🏃 Running $TEST_ID... "
80+
81+
TEST_OUTPUT=$(mktemp)
82+
"$GINKGO" -v -focus="$TEST_ID" -r "$SUITE_DIR" > "$TEST_OUTPUT" 2>&1
83+
84+
sed 's/\x1b\[[0-9;]*m//g' "$TEST_OUTPUT" > "${TEST_OUTPUT}_clean"
85+
cat "${TEST_OUTPUT}_clean" >> "$CLEAN_RERUN"
86+
87+
if grep -q "^FAIL!" "${TEST_OUTPUT}_clean"; then
88+
echo "❌ FAILED"
89+
elif grep -q "^SUCCESS!" "${TEST_OUTPUT}_clean" || grep -q "0 Failed" "${TEST_OUTPUT}_clean"; then
90+
TIME_TAKEN=$(grep -o "Ran [0-9]* of [0-9]* Specs in .*" "${TEST_OUTPUT}_clean" | sed 's/.* in //')
91+
if [ -z "$TIME_TAKEN" ]; then
92+
echo "⚠️ SKIPPED (Test did not execute)"
93+
else
94+
echo "✅ PASSED (Took: $TIME_TAKEN)"
95+
fi
96+
else
97+
echo "⚠️ UNKNOWN STATE (Check logs)"
98+
fi
99+
100+
rm -f "$TEST_OUTPUT" "${TEST_OUTPUT}_clean"
101+
done
102+
fi
103+
104+
STILL_FAILING=$(awk "$PARSE_AWK" "$CLEAN_RERUN" | sort | uniq)
105+
106+
echo "----------------------------------------------------------------"
107+
echo "Rerun Detailed Error Logs:"
108+
echo "----------------------------------------------------------------"
109+
110+
if [ -z "$STILL_FAILING" ]; then
111+
echo "All tests passed on rerun."
112+
else
113+
echo "$STILL_FAILING" | while read -r line; do
114+
TEST_ID=$(echo "$line" | awk '{print $2}')
115+
echo "FAILED: $line"
116+
117+
awk -v tid="$TEST_ID" '
118+
BEGIN { in_err=0; buf="" }
119+
/^[ \t]*•?[ \t]*\[(FAILED|PANICKED|FAIL)\]/ {
120+
in_err=1
121+
buf=$0
122+
next
123+
}
124+
in_err {
125+
buf = buf "\n" $0
126+
if ($0 ~ /^------------------------------/ || $0 ~ /^SSS/) {
127+
if (buf ~ tid) {
128+
n = split(buf, lines, "\n")
129+
valid_count = 0
130+
131+
# First, collect all valid lines
132+
for (i=1; i<=n; i++) {
133+
line = lines[i]
134+
sub(/^[ \t]+/, "", line)
135+
if (line != "" && line !~ /^------------------------------/ && line !~ /^SSS/) {
136+
valid_count++
137+
cleaned[valid_count] = line
138+
}
139+
}
140+
141+
# Print logic with truncation
142+
if (valid_count <= 25) {
143+
for (i=1; i<=valid_count; i++) print " > " cleaned[i]
144+
} else {
145+
for (i=1; i<=15; i++) print " > " cleaned[i]
146+
print " >"
147+
print " > ... [TRUNCATED: " (valid_count - 20) " lines omitted for readability] ..."
148+
print " >"
149+
for (i=valid_count-4; i<=valid_count; i++) print " > " cleaned[i]
150+
}
151+
exit
152+
}
153+
in_err=0
154+
buf=""
155+
}
156+
}
157+
' "$CLEAN_RERUN"
158+
echo ""
159+
done
160+
fi
161+
162+
echo "----------------------------------------------------------------"
163+
echo "Summary of tests still failing:"
164+
if [ -z "$STILL_FAILING" ]; then
165+
echo "None."
166+
else
167+
echo "$STILL_FAILING" | sed 's/^/- /'
168+
fi

0 commit comments

Comments
 (0)