3030fi
3131
3232# 2. 获取变更的 Java 文件
33- CHANGED_FILES=$( git diff --name-only " $BASE_BRANCH " HEAD 2> /dev/null | grep ' \.java$' || true)
33+ if [ " $BASE_BRANCH " == " HEAD^" ]; then
34+ CHANGED_FILES=$( git diff --name-only --diff-filter=ACMRT " $BASE_BRANCH " HEAD -- ' *.java' 2> /dev/null || true)
35+ else
36+ CHANGED_FILES=$( git diff --name-only --diff-filter=ACMRT " $BASE_BRANCH " ...HEAD -- ' *.java' 2> /dev/null || true)
37+ fi
3438
3539if [ -z " $CHANGED_FILES " ]; then
3640 echo " ✅ 没有 Java 文件变更,跳过检查。"
@@ -41,7 +45,7 @@ echo "📝 变更的 Java 文件:"
4145echo " $CHANGED_FILES "
4246echo " ----------------------------------------"
4347
44- # 按模块分组
48+ # 按模块分组,并把路径转换为 Checkstyle includes 使用的源码相对路径
4549declare -A module_files
4650for file in $CHANGED_FILES ; do
4751 module=" ${file%%/* } "
@@ -50,10 +54,22 @@ for file in $CHANGED_FILES; do
5054 continue
5155 fi
5256 rel=" ${file# $module / } "
57+ case " $rel " in
58+ src/main/java/* )
59+ include=" ${rel# src/ main/ java/ } "
60+ ;;
61+ src/test/java/* )
62+ include=" ${rel# src/ test/ java/ } "
63+ ;;
64+ * )
65+ echo " ⚠️ 跳过非源码目录 Java 文件: $file "
66+ continue
67+ ;;
68+ esac
5369 if [ -z " ${module_files[$module]} " ]; then
54- module_files[$module ]=" $rel "
70+ module_files[$module ]=" $include "
5571 else
56- module_files[$module ]=" ${module_files[$module]} ,$rel "
72+ module_files[$module ]=" ${module_files[$module]} ,$include "
5773 fi
5874done
5975
6985echo " ----------------------------------------"
7086
7187total_violations=0
88+ execution_failures=0
7289
7390# 对每个模块执行 Checkstyle
7491for module in " ${! module_files[@]} " ; do
7592 file_list=" ${module_files[$module]} "
93+ report_file=" $module /target/checkstyle-result.xml"
7694 echo " 🚀 扫描模块: $module "
7795 echo " 文件列表: $file_list "
7896
@@ -85,11 +103,21 @@ for module in "${!module_files[@]}"; do
85103 echo " $file_list "
86104 set +e
87105 PROJECT_ROOT=$( pwd)
106+ rm -f " $report_file "
88107 output=$( cd " $module " && \
89108 echo " Current directory: $( pwd) " && \
90109 echo " Checking file existence:" && \
91- ls -l " ${module_files[$module]} " 2> /dev/null || echo " ⚠️ not found" && \
92- mvn checkstyle:check -X \
110+ IFS=' ,' read -ra includes <<< " $file_list" && \
111+ for include in " ${includes[@]} " ; do \
112+ if [ -f " src/main/java/$include " ]; then \
113+ ls -l " src/main/java/$include " ; \
114+ elif [ -f " src/test/java/$include " ]; then \
115+ ls -l " src/test/java/$include " ; \
116+ else \
117+ echo " ⚠️ not found: $include " ; \
118+ fi ; \
119+ done && \
120+ mvn checkstyle:check \
93121 -Dcheckstyle.config.location=" $PROJECT_ROOT /checkstyle/huawei-checkstyle.xml" \
94122 -Dcheckstyle.violationSeverity=warning \
95123 -Dcheckstyle.outputFormat=xml \
@@ -99,15 +127,22 @@ for module in "${!module_files[@]}"; do
99127 echo " ⚠️ 模块 $module 的 Checkstyle 检查失败(但继续)"
100128 fi
101129 set -e
130+ echo " $output "
102131
103- # 从输出中提取违规数
104- count=$( echo " $output " | grep -oE ' You have [0-9]+ Checkstyle violations' | grep -oE ' [0-9]+' | tail -1)
105- if [ -z " $count " ]; then
132+ # 从 XML 报告中统计违规数,比解析 Maven 日志更稳定
133+ if [ -f " $report_file " ]; then
134+ count=$( grep -c -- ' <error ' " $report_file " 2> /dev/null || true)
135+ else
106136 count=0
107137 fi
108138 total_violations=$(( total_violations + count))
109139 echo " 模块 $module 违规数: $count "
110140
141+ if [ $mvn_exit -ne 0 ] && [ " $count " -eq 0 ]; then
142+ echo " ❌ 模块 $module 的 Checkstyle 执行失败,且未生成可解析的违规报告。"
143+ execution_failures=$(( execution_failures + 1 ))
144+ fi
145+
111146 # (可选)生成 HTML 报告供人工查看
112147 echo " - 生成 HTML 报告(可选)..."
113148 set +e
@@ -152,17 +187,21 @@ if [ -n "$GITHUB_STEP_SUMMARY" ]; then
152187 else
153188 echo " | 总违规数 | ⚠️ **$total_violations ** |"
154189 fi
190+ echo " | 执行失败模块数 | $execution_failures |"
155191 echo " | 涉及模块 | ${! module_files[*]} |"
156192 echo " "
157193 echo " 📥 完整报告已作为 Artifact 上传。"
158194 } >> " $GITHUB_STEP_SUMMARY "
159195fi
160196
161197# 根据违规数决定退出码
162- if [ $total_violations -eq 0 ]; then
198+ if [ $total_violations -eq 0 ] && [ $execution_failures -eq 0 ] ; then
163199 echo " ✅ 检查通过,构建成功。"
164200 exit 0
201+ elif [ $execution_failures -ne 0 ]; then
202+ echo " ❌ 有 $execution_failures 个模块 Checkstyle 执行失败,构建失败。"
203+ exit 1
165204else
166205 echo " ❌ 发现 $total_violations 个违规,构建失败。"
167206 exit 1
168- fi
207+ fi
0 commit comments