From ece6e0930fa57ecad17c047c3f66a582522dac01 Mon Sep 17 00:00:00 2001 From: bladehan1 Date: Fri, 24 Apr 2026 11:56:44 +0800 Subject: [PATCH] ci(coverage): harden diff-cover step and handle non-Java PRs - Drop the unreachable PR_XMLS empty-check; collect-xml already exits 1 when jacoco reports are missing, and the previous `exit 0` would have left changed_line_coverage unset and triggered a misleading "Failed to parse changed-line coverage" in the enforcement step. - Parse total_num_lines from diff-cover.json: when a PR has no changed Java source lines (workflow-only, docs-only, proto-only), emit the sentinel NA and treat it as SKIPPED in the enforcement step so the gate does not wrongly fail. - Display NA without a trailing %% in the step summary and logs. Addresses review comments from CodeRabbit and cubic on PR #23. --- .github/workflows/pr-build.yml | 48 ++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml index 1ba06a870d..5c71aba493 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/pr-build.yml @@ -296,11 +296,6 @@ jobs: git fetch --no-tags origin "+refs/heads/${BASE_REF}:refs/remotes/origin/${BASE_REF}" PR_XMLS=$(find coverage/pr -name "jacocoTestReport.xml" | sort) - if [ -z "$PR_XMLS" ]; then - echo "No PR jacoco XML reports found, skipping diff-cover." - exit 0 - fi - SRC_ROOTS=$(find . -type d -path '*/src/main/java' \ -not -path './coverage/*' -not -path './.git/*' | sort) @@ -314,12 +309,18 @@ jobs: DIFF_RC=$? set -e - CHANGED_LINE_COVERAGE=$(jq -r '.total_percent_covered // empty' diff-cover.json) - if [ -z "$CHANGED_LINE_COVERAGE" ]; then - echo "Unable to parse changed-line coverage from diff-cover.json." - exit 1 + TOTAL_NUM_LINES=$(jq -r '.total_num_lines // 0' diff-cover.json) + if [ "${TOTAL_NUM_LINES}" = "0" ]; then + echo "No changed Java source lines; skipping changed-line gate." + echo "changed_line_coverage=NA" >> "$GITHUB_OUTPUT" + else + CHANGED_LINE_COVERAGE=$(jq -r '.total_percent_covered // empty' diff-cover.json) + if [ -z "$CHANGED_LINE_COVERAGE" ]; then + echo "Unable to parse changed-line coverage from diff-cover.json." + exit 1 + fi + echo "changed_line_coverage=${CHANGED_LINE_COVERAGE}" >> "$GITHUB_OUTPUT" fi - echo "changed_line_coverage=${CHANGED_LINE_COVERAGE}" >> "$GITHUB_OUTPUT" { echo "### Changed-line Coverage (diff-cover)" @@ -396,16 +397,19 @@ jobs: DELTA=$(awk -v pr="$PR_OVERALL" -v base="$BASE_OVERALL" 'BEGIN { printf "%.4f", pr - base }') DELTA_OK=$(compare_float "${DELTA} >= ${MAX_DROP}") - if [ -z "$CHANGED_LINE" ] || [ "$CHANGED_LINE" = "NaN" ] || ! is_number "$CHANGED_LINE"; then + if [ "$CHANGED_LINE" = "NA" ]; then + CHANGED_LINE_OK=1 + CHANGED_LINE_STATUS="SKIPPED (no changed Java source lines)" + elif [ -z "$CHANGED_LINE" ] || [ "$CHANGED_LINE" = "NaN" ] || ! is_number "$CHANGED_LINE"; then echo "Failed to parse changed-line coverage: changed-line='${CHANGED_LINE}'." exit 1 - fi - - CHANGED_LINE_OK=$(compare_float "${CHANGED_LINE} > ${MIN_CHANGED}") - if [ "$CHANGED_LINE_OK" -eq 1 ]; then - CHANGED_LINE_STATUS="PASS (> ${MIN_CHANGED}%)" else - CHANGED_LINE_STATUS="FAIL (<= ${MIN_CHANGED}%)" + CHANGED_LINE_OK=$(compare_float "${CHANGED_LINE} > ${MIN_CHANGED}") + if [ "$CHANGED_LINE_OK" -eq 1 ]; then + CHANGED_LINE_STATUS="PASS (> ${MIN_CHANGED}%)" + else + CHANGED_LINE_STATUS="FAIL (<= ${MIN_CHANGED}%)" + fi fi # 3) Output base metrics (always visible in logs + step summary) @@ -414,8 +418,14 @@ jobs: OVERALL_STATUS="FAIL (< ${MAX_DROP}%)" fi + if [ "$CHANGED_LINE" = "NA" ]; then + CHANGED_LINE_DISPLAY="NA" + else + CHANGED_LINE_DISPLAY="${CHANGED_LINE}%" + fi + METRICS_TEXT=$(cat <