Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit7dd171f

Browse files
committed
Fix JSON generation and improve error handling in CI/CD scripts
- Fix malformed JSON generation in run_vader_tests_direct.sh: * Properly format arrays with commas between elements * Add JSON escaping for special characters * Add JSON validation after generation- Improve error handling in generate_pr_summary.sh: * Add nullglob to handle empty glob patterns * Initialize all variables with defaults * Add better error handling for JSON parsing * Add debug information when no artifacts are processed- Fixes exit code 5 error in CI/CD workflow
1 parent8f33e58 commit7dd171f

File tree

2 files changed

+109
-14
lines changed

2 files changed

+109
-14
lines changed

‎scripts/cicd/generate_pr_summary.sh‎

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ fi
4343

4444
# Process each Python version's test results
4545
# Handle both direct artifact structure and nested structure
46+
# Use nullglob to handle case where no directories match
47+
shopt -s nullglob
4648
forartifact_dirin"$ARTIFACTS_DIR"/*/;do
4749
if [!-d"$artifact_dir" ];then
4850
continue
@@ -62,30 +64,47 @@ for artifact_dir in "$ARTIFACTS_DIR"/*/; do
6264
continue
6365
fi
6466

67+
# Initialize variables with defaults
68+
total_tests=0
69+
passed_tests=0
70+
failed_tests=0
71+
total_assertions=0
72+
passed_assertions=0
73+
python_ver="unknown"
74+
vim_ver="unknown"
75+
failed_test_names=""
76+
6577
# Parse JSON (using jq if available, otherwise use basic parsing)
6678
ifcommand -v jq&> /dev/null;then
67-
total_tests=$(jq -r'.total_tests // 0'"$results_file")
68-
passed_tests=$(jq -r'.passed_tests // 0'"$results_file")
69-
failed_tests=$(jq -r'.failed_tests // 0'"$results_file")
70-
total_assertions=$(jq -r'.total_assertions // 0'"$results_file")
71-
passed_assertions=$(jq -r'.passed_assertions // 0'"$results_file")
72-
python_ver=$(jq -r'.python_version // "unknown"'"$results_file")
73-
vim_ver=$(jq -r'.vim_version // "unknown"'"$results_file")
79+
total_tests=$(jq -r'.total_tests // 0'"$results_file"2>/dev/null||echo"0")
80+
passed_tests=$(jq -r'.passed_tests // 0'"$results_file"2>/dev/null||echo"0")
81+
failed_tests=$(jq -r'.failed_tests // 0'"$results_file"2>/dev/null||echo"0")
82+
total_assertions=$(jq -r'.total_assertions // 0'"$results_file"2>/dev/null||echo"0")
83+
passed_assertions=$(jq -r'.passed_assertions // 0'"$results_file"2>/dev/null||echo"0")
84+
python_ver=$(jq -r'.python_version // "unknown"'"$results_file"2>/dev/null||echo"unknown")
85+
vim_ver=$(jq -r'.vim_version // "unknown"'"$results_file"2>/dev/null||echo"unknown")
7486

7587
# Get failed test names
7688
failed_test_names=$(jq -r'.results.failed[]?'"$results_file"2>/dev/null| tr'\n'','| sed's/,$//'||echo"")
7789
else
7890
# Fallback: basic parsing without jq
79-
total_tests=$(grep -o'"total_tests":[0-9]*'"$results_file"| grep -o'[0-9]*'||echo"0")
80-
passed_tests=$(grep -o'"passed_tests":[0-9]*'"$results_file"| grep -o'[0-9]*'||echo"0")
81-
failed_tests=$(grep -o'"failed_tests":[0-9]*'"$results_file"| grep -o'[0-9]*'||echo"0")
82-
total_assertions=$(grep -o'"total_assertions":[0-9]*'"$results_file"| grep -o'[0-9]*'||echo"0")
83-
passed_assertions=$(grep -o'"passed_assertions":[0-9]*'"$results_file"| grep -o'[0-9]*'||echo"0")
91+
total_tests=$(grep -o'"total_tests":[0-9]*'"$results_file"2>/dev/null| grep -o'[0-9]*'| head -1||echo"0")
92+
passed_tests=$(grep -o'"passed_tests":[0-9]*'"$results_file"2>/dev/null| grep -o'[0-9]*'| head -1||echo"0")
93+
failed_tests=$(grep -o'"failed_tests":[0-9]*'"$results_file"2>/dev/null| grep -o'[0-9]*'| head -1||echo"0")
94+
total_assertions=$(grep -o'"total_assertions":[0-9]*'"$results_file"2>/dev/null| grep -o'[0-9]*'| head -1||echo"0")
95+
passed_assertions=$(grep -o'"passed_assertions":[0-9]*'"$results_file"2>/dev/null| grep -o'[0-9]*'| head -1||echo"0")
8496
python_ver="Python$python_version"
8597
vim_ver="unknown"
8698
failed_test_names=""
8799
fi
88100

101+
# Ensure variables are numeric
102+
total_tests=$((total_tests+0))
103+
passed_tests=$((passed_tests+0))
104+
failed_tests=$((failed_tests+0))
105+
total_assertions=$((total_assertions+0))
106+
passed_assertions=$((passed_assertions+0))
107+
89108
TOTAL_PYTHON_VERSIONS=$((TOTAL_PYTHON_VERSIONS+1))
90109
TOTAL_TESTS=$((TOTAL_TESTS+ total_tests))
91110
TOTAL_PASSED=$((TOTAL_PASSED+ passed_tests))
@@ -106,6 +125,17 @@ for artifact_dir in "$ARTIFACTS_DIR"/*/; do
106125
fi
107126

108127
# Add version summary to markdown
128+
# Ensure all variables are set before using them in heredoc
129+
python_version="${python_version:-unknown}"
130+
status_icon="${status_icon:-❓}"
131+
status_text="${status_text:-UNKNOWN}"
132+
python_ver="${python_ver:-unknown}"
133+
vim_ver="${vim_ver:-unknown}"
134+
passed_tests="${passed_tests:-0}"
135+
total_tests="${total_tests:-0}"
136+
passed_assertions="${passed_assertions:-0}"
137+
total_assertions="${total_assertions:-0}"
138+
109139
cat>>"$OUTPUT_FILE"<<EOF
110140
111141
### Python$python_version$status_icon
@@ -133,7 +163,31 @@ EOF
133163
fi
134164
done
135165

166+
# Check if we processed any artifacts
167+
if ["$TOTAL_PYTHON_VERSIONS"-eq 0 ];then
168+
echo"">>"$OUTPUT_FILE"
169+
echo"⚠️ **Warning**: No test artifacts were processed.">>"$OUTPUT_FILE"
170+
echo"This may indicate that test jobs haven't completed yet or artifacts failed to upload.">>"$OUTPUT_FILE"
171+
echo"">>"$OUTPUT_FILE"
172+
echo"Debug information:">>"$OUTPUT_FILE"
173+
echo"- Artifacts directory:\`$ARTIFACTS_DIR\`">>"$OUTPUT_FILE"
174+
echo"- Directory exists:$([-d"$ARTIFACTS_DIR" ]&&echo"yes"||echo"no")">>"$OUTPUT_FILE"
175+
if [-d"$ARTIFACTS_DIR" ];then
176+
echo"- Contents:">>"$OUTPUT_FILE"
177+
ls -la"$ARTIFACTS_DIR">>"$OUTPUT_FILE"2>&1||true
178+
fi
179+
fi
180+
136181
# Add overall summary
182+
# Ensure all summary variables are set
183+
TOTAL_PYTHON_VERSIONS="${TOTAL_PYTHON_VERSIONS:-0}"
184+
TOTAL_TESTS="${TOTAL_TESTS:-0}"
185+
TOTAL_PASSED="${TOTAL_PASSED:-0}"
186+
TOTAL_FAILED="${TOTAL_FAILED:-0}"
187+
TOTAL_ASSERTIONS="${TOTAL_ASSERTIONS:-0}"
188+
PASSED_ASSERTIONS="${PASSED_ASSERTIONS:-0}"
189+
ALL_PASSED="${ALL_PASSED:-true}"
190+
137191
cat>>"$OUTPUT_FILE"<<EOF
138192
139193
---

‎scripts/cicd/run_vader_tests_direct.sh‎

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,33 @@ RESULTS_DIR="${PROJECT_ROOT}/results"
258258
LOGS_DIR="${PROJECT_ROOT}/test-logs"
259259
mkdir -p"${RESULTS_DIR}""${LOGS_DIR}"
260260

261+
# Function to format array as JSON array with proper escaping
262+
format_json_array() {
263+
local arr=("$@")
264+
if [${#arr[@]}-eq 0 ];then
265+
echo"[]"
266+
return
267+
fi
268+
local result="["
269+
local first=true
270+
foritemin"${arr[@]}";do
271+
if ["$first"=true ];then
272+
first=false
273+
else
274+
result+=","
275+
fi
276+
# Escape JSON special characters: ", \, and control characters
277+
local escaped=$(echo"$item"| sed's/\\/\\\\/g'| sed's/"/\\"/g'| sed's/\x00//g')
278+
result+="\"${escaped}\""
279+
done
280+
result+="]"
281+
echo"$result"
282+
}
283+
261284
TEST_RESULTS_JSON="${PROJECT_ROOT}/test-results.json"
285+
PASSED_ARRAY_JSON=$(format_json_array"${PASSED_TESTS[@]}")
286+
FAILED_ARRAY_JSON=$(format_json_array"${FAILED_TESTS[@]}")
287+
262288
cat>"${TEST_RESULTS_JSON}"<<EOF
263289
{
264290
"timestamp":$(date +%s),
@@ -270,12 +296,27 @@ cat > "${TEST_RESULTS_JSON}" << EOF
270296
"total_assertions":${TOTAL_ASSERTIONS},
271297
"passed_assertions":${PASSED_ASSERTIONS},
272298
"results": {
273-
"passed":$(IFS=',';echo"[$(printf'"%s"'"${PASSED_TESTS[@]}")]"),
274-
"failed":$(IFS=',';echo"[$(printf'"%s"'"${FAILED_TESTS[@]}")]")
299+
"passed":${PASSED_ARRAY_JSON},
300+
"failed":${FAILED_ARRAY_JSON}
275301
}
276302
}
277303
EOF
278304

305+
# Validate JSON syntax if jq or python is available
306+
ifcommand -v jq&> /dev/null;then
307+
if! jq empty"${TEST_RESULTS_JSON}"2>/dev/null;then
308+
log_error"Generated JSON is invalid!"
309+
cat"${TEST_RESULTS_JSON}"
310+
exit 1
311+
fi
312+
elifcommand -v python3&> /dev/null;then
313+
if! python3 -m json.tool"${TEST_RESULTS_JSON}"> /dev/null2>&1;then
314+
log_error"Generated JSON is invalid!"
315+
cat"${TEST_RESULTS_JSON}"
316+
exit 1
317+
fi
318+
fi
319+
279320
# Create summary log
280321
SUMMARY_LOG="${LOGS_DIR}/test-summary.log"
281322
cat>"${SUMMARY_LOG}"<<EOF

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp