Skip to content

Commit 2363d05

Browse files
committed
refactor(ci): use xargs for parallel execution and add reaping function
1 parent 4206da2 commit 2363d05

1 file changed

Lines changed: 54 additions & 85 deletions

File tree

.kokoro/system.sh

Lines changed: 54 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ echo "=========================="
5252
run_package_test() {
5353
local package_name=$1
5454
local package_path="packages/${package_name}"
55-
55+
5656
# Declare local overrides to prevent bleeding into the next loop iteration
5757
local PROJECT_ID
5858
local GOOGLE_APPLICATION_CREDENTIALS
@@ -111,11 +111,58 @@ run_package_test() {
111111
local res=$?
112112
set -e
113113
popd > /dev/null
114-
114+
115115
rm -rf "${gcloud_config_dir}"
116116
return $res
117117
}
118118

119+
reap_parallel_results() {
120+
local retval=0
121+
local failed_count=0
122+
local passed_count=0
123+
124+
if [ -z "$LOG_DIR" ]; then
125+
echo "Error: LOG_DIR is not set."
126+
return 1
127+
fi
128+
129+
for failed in "$LOG_DIR"/*.failed; do
130+
if [ -f "$failed" ]; then
131+
failed_count=$((failed_count + 1))
132+
fi
133+
done
134+
135+
local total_tested=${#PACKAGES_TO_TEST[@]}
136+
passed_count=$((total_tested - failed_count))
137+
138+
echo ""
139+
echo "=================================================="
140+
echo " TEST RUN SUMMARY "
141+
echo "=================================================="
142+
echo "Total tested: $total_tested"
143+
echo "Passed: $passed_count"
144+
echo "Failed: $failed_count"
145+
echo "=================================================="
146+
147+
if [ "$failed_count" -gt 0 ]; then
148+
echo ""
149+
echo "!!! DETAILED LOGS FOR FAILED PACKAGES !!!"
150+
for failed in "$LOG_DIR"/*.failed; do
151+
if [ -f "$failed" ]; then
152+
local pkg=$(basename "$failed" .failed)
153+
echo "--------------------------------------------------"
154+
echo "LOGS FOR: $pkg"
155+
echo "--------------------------------------------------"
156+
cat "$LOG_DIR/$pkg.log"
157+
echo ""
158+
fi
159+
done
160+
retval=1
161+
fi
162+
return $retval
163+
}
164+
165+
119166
# A file for running system tests
120167
system_test_script="${PROJECT_ROOT}/.kokoro/system-single.sh"
121168

@@ -181,11 +228,6 @@ done
181228

182229
# Parallel Execution Logic
183230
MAX_JOBS=${MAX_JOBS:-4}
184-
active_jobs=0
185-
declare -A job_pids
186-
declare -A job_pkgs
187-
failed_packages=()
188-
passed_packages=()
189231

190232
# Temporary directory for clean log segregation
191233
LOG_DIR=$(mktemp -d -t test-logs-XXXXXX)
@@ -202,83 +244,10 @@ echo "Starting parallel test execution for ${#PACKAGES_TO_TEST[@]} packages"
202244
echo "Concurrency limit: ${MAX_JOBS}"
203245
echo "=================================================="
204246

205-
for pkg in "${PACKAGES_TO_TEST[@]}"; do
206-
# Maintain concurrency limit
207-
while [ "$active_jobs" -ge "$MAX_JOBS" ]; do
208-
for pid in "${!job_pids[@]}"; do
209-
if ! kill -0 "$pid" 2>/dev/null; then
210-
wait "$pid" && status=0 || status=$?
211-
finished_pkg=${job_pkgs[$pid]}
212-
if [ "$status" -eq 0 ]; then
213-
echo "✔ [SUCCESS] ${finished_pkg}"
214-
passed_packages+=("$finished_pkg")
215-
else
216-
echo "✘ [FAILURE] ${finished_pkg} (Exit Code: ${status})"
217-
failed_packages+=("$finished_pkg")
218-
fi
219-
unset "job_pids[$pid]"
220-
unset "job_pkgs[$pid]"
221-
active_jobs=$((active_jobs - 1))
222-
fi
223-
done
224-
sleep 0.1
225-
done
226-
227-
safe_pkg_name=$(echo "$pkg" | tr '/' '_')
228-
log_file="${LOG_DIR}/${safe_pkg_name}.log"
229-
230-
echo "Spawning tests for ${pkg}..."
231-
run_package_test "$pkg" > "$log_file" 2>&1 &
232-
pid=$!
233-
job_pids["$pid"]=$pid
234-
job_pkgs["$pid"]=$pkg
235-
active_jobs=$((active_jobs + 1))
236-
done
237-
238-
# Reap remaining processes
239-
while [ "$active_jobs" -gt 0 ]; do
240-
for pid in "${!job_pids[@]}"; do
241-
if ! kill -0 "$pid" 2>/dev/null; then
242-
wait "$pid" && status=0 || status=$?
243-
finished_pkg=${job_pkgs[$pid]}
244-
if [ "$status" -eq 0 ]; then
245-
echo "✔ [SUCCESS] ${finished_pkg}"
246-
passed_packages+=("$finished_pkg")
247-
else
248-
echo "✘ [FAILURE] ${finished_pkg} (Exit Code: ${status})"
249-
failed_packages+=("$finished_pkg")
250-
fi
251-
unset "job_pids[$pid]"
252-
unset "job_pkgs[$pid]"
253-
active_jobs=$((active_jobs - 1))
254-
fi
255-
done
256-
sleep 0.1
257-
done
258-
259-
echo ""
260-
echo "=================================================="
261-
echo " TEST RUN SUMMARY "
262-
echo "=================================================="
263-
echo "Total tested: ${#PACKAGES_TO_TEST[@]}"
264-
echo "Passed: ${#passed_packages[@]}"
265-
echo "Failed: ${#failed_packages[@]}"
266-
echo "=================================================="
247+
export LOG_DIR
248+
export -f run_package_test
249+
export system_test_script PROJECT_ROOT KOKORO_GFILE_DIR
267250

268-
if [ ${#failed_packages[@]} -gt 0 ]; then
269-
echo ""
270-
echo "!!! DETAILED LOGS FOR FAILED PACKAGES !!!"
271-
for pkg in "${failed_packages[@]}"; do
272-
safe_pkg_name=$(echo "$pkg" | tr '/' '_')
273-
log_file="${LOG_DIR}/${safe_pkg_name}.log"
274-
echo "--------------------------------------------------"
275-
echo "LOGS FOR: ${pkg}"
276-
echo "--------------------------------------------------"
277-
[ -f "$log_file" ] && cat "$log_file"
278-
echo ""
279-
done
280-
exit 1
281-
fi
251+
printf '%s\n' "${PACKAGES_TO_TEST[@]}" | xargs -P "$MAX_JOBS" -I {} bash -c 'run_package_test "{}" > "$LOG_DIR/{}.log" 2>&1 || touch "$LOG_DIR/{}.failed"'
282252

283-
echo "All tests passed successfully!"
284-
exit 0
253+
reap_parallel_results || RETVAL=1

0 commit comments

Comments
 (0)