Skip to content

Commit c70613a

Browse files
committed
moved script out of yaml
1 parent f1eb3a4 commit c70613a

2 files changed

Lines changed: 154 additions & 121 deletions

File tree

.github/workflows/unittest.yml

Lines changed: 1 addition & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -177,124 +177,4 @@ jobs:
177177
DEFAULT_FAIL_UNDER: 99
178178
TEST_ALL_PACKAGES: ${{ needs.initialize.outputs.is_full_run }}
179179
run: |
180-
RESULTS_DIR="/dev/shm/.coverage-results"
181-
if [ -d "$RESULTS_DIR" ]; then
182-
# Unzip any zipped coverage results
183-
find "$RESULTS_DIR" -type f -name '*.zip' -print0 | xargs -0 -P $(nproc) -I {} unzip -q -o {} -d "$RESULTS_DIR"
184-
185-
# Find all modified packages
186-
if [[ "${TEST_ALL_PACKAGES}" == "true" ]]; then
187-
modified_packages=$(ls -d packages/*/ | cut -d/ -f1,2 | sort -u)
188-
else
189-
modified_packages=$(git diff --name-only HEAD~1 -- packages | cut -d/ -f1,2 | sort -u)
190-
fi
191-
192-
mkdir -p /dev/shm/coverage-logs
193-
MAX_JOBS=4
194-
195-
for pkg in ${modified_packages}; do
196-
if [ -d "${pkg}" ]; then
197-
# Limit the number of concurrent background jobs
198-
while [ $(jobs -r | wc -l) -ge ${MAX_JOBS} ]; do
199-
sleep 0.1
200-
done
201-
202-
(
203-
pkg_name_clean=$(echo "${pkg}" | sed 's|/$||' | sed 's|/|_|g')
204-
pkg_log="/dev/shm/coverage-logs/${pkg_name_clean}.log"
205-
pkg_status="/dev/shm/coverage-logs/${pkg_name_clean}.status"
206-
207-
set +e
208-
209-
# Find coverage databases belonging specifically to this package across all Python versions
210-
shopt -s nullglob
211-
pkg_files=("${RESULTS_DIR}/.coverage."*"."*"${pkg_name_clean}" "${RESULTS_DIR}"/*/".coverage."*"."*"${pkg_name_clean}")
212-
shopt -u nullglob
213-
214-
if [ -f "${pkg}/.coveragerc" ] && grep -Eq "fail_under\s*=\s*0" "${pkg}/.coveragerc"; then
215-
echo "Package has fail_under = 0, passing instantly with 100% success (even without coverage files)" > "${pkg_log}"
216-
echo 0 > "${pkg_status}"
217-
else
218-
if [ ${#pkg_files[@]} -gt 0 ]; then
219-
pushd "${pkg}" > /dev/null
220-
221-
# Use /dev/shm for the combined coverage file to reduce disk I/O
222-
pkg_coverage_db="/dev/shm/.coverage.${pkg_name_clean}"
223-
224-
# Combine only this package's databases directly using absolute paths
225-
COVERAGE_FILE="${pkg_coverage_db}" coverage combine "${pkg_files[@]}" >> "${pkg_log}" 2>&1
226-
227-
# Generate the coverage report using the package-specific local database
228-
if [ -f ".coveragerc" ]; then
229-
echo "Using package-specific configuration: ${pkg}/.coveragerc" > "${pkg_log}"
230-
if grep -q "fail_under" ".coveragerc"; then
231-
COVERAGE_FILE="${pkg_coverage_db}" coverage report --rcfile=".coveragerc" --include="$PWD/**" >> "${pkg_log}" 2>&1
232-
else
233-
echo "No fail_under specified in ${pkg}/.coveragerc, enforcing default" >> "${pkg_log}"
234-
COVERAGE_FILE="${pkg_coverage_db}" coverage report --rcfile=".coveragerc" --include="$PWD/**" --fail-under="${DEFAULT_FAIL_UNDER}" >> "${pkg_log}" 2>&1
235-
fi
236-
else
237-
echo "No .coveragerc found for ${pkg}, enforcing default" > "${pkg_log}"
238-
COVERAGE_FILE="${pkg_coverage_db}" coverage report --include="$PWD/**" --fail-under="${DEFAULT_FAIL_UNDER}" >> "${pkg_log}" 2>&1
239-
fi
240-
echo $? > "${pkg_status}"
241-
popd > /dev/null
242-
else
243-
echo "Warning: No coverage results found for ${pkg}" > "${pkg_log}"
244-
echo 1 > "${pkg_status}"
245-
fi
246-
fi
247-
set -e
248-
) &
249-
fi
250-
done
251-
252-
# Wait for all background checks to finish
253-
wait
254-
255-
failed_packages=()
256-
passed_packages=()
257-
258-
for pkg in ${modified_packages}; do
259-
if [ -d "${pkg}" ]; then
260-
pkg_name_clean=$(echo "${pkg}" | sed 's|/$||' | sed 's|/|_|g')
261-
pkg_log="/dev/shm/coverage-logs/${pkg_name_clean}.log"
262-
pkg_status="/dev/shm/coverage-logs/${pkg_name_clean}.status"
263-
264-
echo "============================================================"
265-
echo "Evaluating coverage for package: ${pkg}"
266-
echo "============================================================"
267-
if [ -f "${pkg_log}" ]; then
268-
cat "${pkg_log}"
269-
fi
270-
271-
status=$(cat "${pkg_status}")
272-
if [ "${status}" -ne 0 ]; then
273-
failed_packages+=("${pkg}")
274-
else
275-
passed_packages+=("${pkg}")
276-
fi
277-
fi
278-
done
279-
280-
echo "============================================================"
281-
echo "Coverage Evaluation Summary"
282-
echo "============================================================"
283-
if [ ${#passed_packages[@]} -gt 0 ]; then
284-
echo "Passed packages:"
285-
for pkg in "${passed_packages[@]}"; do
286-
echo " - ${pkg}"
287-
done
288-
fi
289-
if [ ${#failed_packages[@]} -gt 0 ]; then
290-
echo "Failed packages:"
291-
for pkg in "${failed_packages[@]}"; do
292-
echo " - ${pkg}"
293-
done
294-
exit 1
295-
fi
296-
else
297-
echo "Error: No coverage results were downloaded from the unit test jobs."
298-
echo "This usually means the unit tests did not run or failed to upload their coverage files."
299-
exit 1
300-
fi
180+
ci/report_coverage.sh

ci/report_coverage.sh

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
#!/bin/bash
2+
# Copyright 2026 Google LLC
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
16+
set -eo pipefail
17+
18+
# This script generates coverage reports for modified packages.
19+
# It assumes coverage databases have been downloaded to RESULTS_DIR.
20+
# It uses /dev/shm for high-performance processing.
21+
22+
RESULTS_DIR="${RESULTS_DIR:-/dev/shm/.coverage-results}"
23+
LOG_DIR="/dev/shm/coverage-logs"
24+
DEFAULT_FAIL_UNDER="${DEFAULT_FAIL_UNDER:-99}"
25+
MAX_JOBS=$(nproc)
26+
27+
mkdir -p "${LOG_DIR}"
28+
29+
if [ ! -d "${RESULTS_DIR}" ]; then
30+
echo "Error: No coverage results found in ${RESULTS_DIR}."
31+
exit 1
32+
fi
33+
34+
# Unzip any zipped coverage results
35+
find "$RESULTS_DIR" -type f -name '*.zip' -print0 | xargs -0 -P "${MAX_JOBS}" -I {} unzip -q -o {} -d "$RESULTS_DIR"
36+
37+
# Identify modified packages
38+
if [[ "${TEST_ALL_PACKAGES}" == "true" ]]; then
39+
modified_packages=$(ls -d packages/*/ | cut -d/ -f1,2 | sort -u)
40+
else
41+
# Default to comparing against previous commit
42+
modified_packages=$(git diff --name-only HEAD~1 -- packages | cut -d/ -f1,2 | sort -u)
43+
fi
44+
45+
# Function to report coverage for a single package
46+
report_package_coverage() {
47+
local pkg=$1
48+
local pkg_name_clean=$(echo "${pkg}" | sed 's|/$||' | sed 's|/|_|g')
49+
local pkg_log="${LOG_DIR}/${pkg_name_clean}.log"
50+
local pkg_status="${LOG_DIR}/${pkg_name_clean}.status"
51+
52+
# Use /dev/shm for the combined coverage file to reduce disk I/O
53+
local pkg_coverage_db="/dev/shm/.coverage.${pkg_name_clean}"
54+
55+
set +e
56+
(
57+
# Find coverage databases belonging specifically to this package
58+
shopt -s nullglob
59+
local pkg_files=("${RESULTS_DIR}/.coverage."*"."*"${pkg_name_clean}" "${RESULTS_DIR}"/*/".coverage."*"."*"${pkg_name_clean}")
60+
shopt -u nullglob
61+
62+
# Handle explicit skip via .coveragerc
63+
if [ -f "${pkg}/.coveragerc" ] && grep -Eq "fail_under\s*=\s*0" "${pkg}/.coveragerc"; then
64+
echo "Package has fail_under = 0, passing instantly with 100% success (even without coverage files)" > "${pkg_log}"
65+
echo 0 > "${pkg_status}"
66+
return
67+
fi
68+
69+
if [ ${#pkg_files[@]} -eq 0 ]; then
70+
echo "Warning: No coverage results found for ${pkg}" > "${pkg_log}"
71+
echo 1 > "${pkg_status}"
72+
return
73+
fi
74+
75+
pushd "${pkg}" > /dev/null
76+
77+
# Combine databases
78+
COVERAGE_FILE="${pkg_coverage_db}" coverage combine "${pkg_files[@]}" >> "${pkg_log}" 2>&1
79+
80+
# Generate report
81+
if [ -f ".coveragerc" ]; then
82+
echo "Using package-specific configuration: ${pkg}/.coveragerc" > "${pkg_log}"
83+
if grep -q "fail_under" ".coveragerc"; then
84+
COVERAGE_FILE="${pkg_coverage_db}" coverage report --rcfile=".coveragerc" --include="$PWD/**" >> "${pkg_log}" 2>&1
85+
else
86+
echo "No fail_under specified in ${pkg}/.coveragerc, enforcing default" >> "${pkg_log}"
87+
COVERAGE_FILE="${pkg_coverage_db}" coverage report --rcfile=".coveragerc" --include="$PWD/**" --fail-under="${DEFAULT_FAIL_UNDER}" >> "${pkg_log}" 2>&1
88+
fi
89+
else
90+
echo "No .coveragerc found for ${pkg}, enforcing default" > "${pkg_log}"
91+
COVERAGE_FILE="${pkg_coverage_db}" coverage report --include="$PWD/**" --fail-under="${DEFAULT_FAIL_UNDER}" >> "${pkg_log}" 2>&1
92+
fi
93+
94+
echo $? > "${pkg_status}"
95+
popd > /dev/null
96+
)
97+
set -e
98+
}
99+
100+
# Run coverage reporting in parallel
101+
for pkg in ${modified_packages}; do
102+
if [ -d "${pkg}" ]; then
103+
# Limit concurrent jobs
104+
while [ $(jobs -r | wc -l) -ge "${MAX_JOBS}" ]; do
105+
sleep 0.1
106+
done
107+
report_package_coverage "${pkg}" &
108+
fi
109+
done
110+
111+
wait
112+
113+
# Summary and exit
114+
failed_packages=()
115+
passed_packages=()
116+
117+
for pkg in ${modified_packages}; do
118+
if [ -d "${pkg}" ]; then
119+
pkg_name_clean=$(echo "${pkg}" | sed 's|/$||' | sed 's|/|_|g')
120+
pkg_log="${LOG_DIR}/${pkg_name_clean}.log"
121+
pkg_status="${LOG_DIR}/${pkg_name_clean}.status"
122+
123+
echo "============================================================"
124+
echo "Evaluating coverage for package: ${pkg}"
125+
echo "============================================================"
126+
[ -f "${pkg_log}" ] && cat "${pkg_log}"
127+
128+
status=$(cat "${pkg_status}" 2>/dev/null || echo 1)
129+
if [ "${status}" -ne 0 ]; then
130+
failed_packages+=("${pkg}")
131+
else
132+
passed_packages+=("${pkg}")
133+
fi
134+
fi
135+
done
136+
137+
echo "============================================================"
138+
echo "Coverage Evaluation Summary"
139+
echo "============================================================"
140+
if [ ${#passed_packages[@]} -gt 0 ]; then
141+
echo "Passed packages:"
142+
for pkg in "${passed_packages[@]}"; do
143+
echo " - ${pkg}"
144+
done
145+
fi
146+
147+
if [ ${#failed_packages[@]} -gt 0 ]; then
148+
echo "Failed packages:"
149+
for pkg in "${failed_packages[@]}"; do
150+
echo " - ${pkg}"
151+
done
152+
exit 1
153+
fi

0 commit comments

Comments
 (0)