11#! /bin/bash
22# ============================================================
33# spotbugs-incremental.sh - 增量 SpotBugs 扫描
4- # 功能:只分析本次变更的 src/main/java 文件对应的类
4+ # 功能:只分析本次变更的 src/main/java 或 src/test/java 文件对应的类
55# 报告:各模块 target/spotbugsXml.xml、target/spotbugs-reports/spotbugs*.html
66# ============================================================
77
88set -euo pipefail
99
1010echo " ========================================"
1111echo " SpotBugs 增量扫描"
12- echo " 扫描范围:本次变更的主源码 Java 类"
12+ echo " 扫描范围:本次变更的主源码和测试源码 Java 类"
1313echo " ========================================"
1414
1515# 1. 确定目标分支
@@ -47,6 +47,8 @@ echo "----------------------------------------"
4747
4848# 3. 按 Maven 模块提取待分析类
4949declare -A module_classes
50+ declare -A module_include_tests
51+ declare -A module_scopes
5052scan_count=0
5153
5254for file in $CHANGED_JAVA ; do
@@ -63,8 +65,14 @@ for file in $CHANGED_JAVA; do
6365 continue
6466 fi
6567
66- if [[ " $rel " != src/main/java/* ]]; then
67- echo " ℹ️ SpotBugs 默认分析主类,跳过非主源码文件: $file "
68+ source_scope=" "
69+ if [[ " $rel " == src/main/java/* ]]; then
70+ source_scope=" main"
71+ elif [[ " $rel " == src/test/java/* ]]; then
72+ source_scope=" test"
73+ module_include_tests[$module ]=" true"
74+ else
75+ echo " ℹ️ SpotBugs 分析编译后的 main/test class,跳过非源码目录文件: $file "
6876 continue
6977 fi
7078
@@ -82,17 +90,25 @@ for file in $CHANGED_JAVA; do
8290 else
8391 module_classes[$module ]=" ${module_classes[$module]} ,$fqcn "
8492 fi
93+
94+ if [ -z " ${module_scopes[$module]:- } " ]; then
95+ module_scopes[$module ]=" $source_scope "
96+ elif [[ " ,${module_scopes[$module]} ," != * " ,$source_scope ," * ]]; then
97+ module_scopes[$module ]=" ${module_scopes[$module]} ,$source_scope "
98+ fi
99+
85100 scan_count=$(( scan_count + 1 ))
86101done
87102
88103if [ ${# module_classes[@]} -eq 0 ]; then
89- echo " ✅ 没有需要 SpotBugs 分析的主源码类 。"
104+ echo " ✅ 没有需要 SpotBugs 分析的主源码或测试源码类 。"
90105 exit 0
91106fi
92107
93108echo " 📋 按模块分组后的类:"
94109for module in " ${! module_classes[@]} " ; do
95- echo " $module : ${module_classes[$module]} "
110+ include_tests=" ${module_include_tests[$module]:- false} "
111+ echo " $module (${module_scopes[$module]} , includeTests=$include_tests ): ${module_classes[$module]} "
96112done
97113echo " ----------------------------------------"
98114
@@ -104,17 +120,32 @@ html_failures=0
104120# 4. 对每个模块执行 SpotBugs
105121for module in " ${! module_classes[@]} " ; do
106122 class_list=" ${module_classes[$module]} "
123+ include_tests=" ${module_include_tests[$module]:- false} "
107124 echo " 🚀 扫描模块: $module "
108125 echo " 类列表: $class_list "
126+ echo " 扫描测试类: $include_tests "
109127
110128 rm -f " $module /target/spotbugsXml.xml"
111129 rm -rf " $module /target/spotbugs-reports"
112130
113131 set +e
114- output=$( cd " $module " && mvn spotbugs:check \
115- -Dspotbugs.onlyAnalyze=" $class_list " \
116- -Dspotbugs.xmlOutput=true \
117- -Dspotbugs.htmlOutput=true 2>&1 )
132+ if [ " $include_tests " == " true" ]; then
133+ output=$( cd " $module " && mvn test-compile spotbugs:check \
134+ -DskipTests \
135+ -Dcheckstyle.skip=true \
136+ -Dpmd.skip=true \
137+ -Dcpd.skip=true \
138+ -Dspotbugs.onlyAnalyze=" $class_list " \
139+ -Dspotbugs.includeTests=true \
140+ -Dspotbugs.xmlOutput=true \
141+ -Dspotbugs.htmlOutput=true 2>&1 )
142+ else
143+ output=$( cd " $module " && mvn spotbugs:check \
144+ -Dspotbugs.onlyAnalyze=" $class_list " \
145+ -Dspotbugs.includeTests=false \
146+ -Dspotbugs.xmlOutput=true \
147+ -Dspotbugs.htmlOutput=true 2>&1 )
148+ fi
118149 mvn_exit=$?
119150 set -e
120151 echo " $output "
@@ -128,10 +159,23 @@ for module in "${!module_classes[@]}"; do
128159 if [ " $html_count " -eq 0 ]; then
129160 echo " - 未找到 SpotBugs HTML 报告,单独生成可视化报告..."
130161 set +e
131- report_output=$( cd " $module " && mvn spotbugs:spotbugs \
132- -Dspotbugs.onlyAnalyze=" $class_list " \
133- -Dspotbugs.xmlOutput=true \
134- -Dspotbugs.htmlOutput=true 2>&1 )
162+ if [ " $include_tests " == " true" ]; then
163+ report_output=$( cd " $module " && mvn test-compile spotbugs:spotbugs \
164+ -DskipTests \
165+ -Dcheckstyle.skip=true \
166+ -Dpmd.skip=true \
167+ -Dcpd.skip=true \
168+ -Dspotbugs.onlyAnalyze=" $class_list " \
169+ -Dspotbugs.includeTests=true \
170+ -Dspotbugs.xmlOutput=true \
171+ -Dspotbugs.htmlOutput=true 2>&1 )
172+ else
173+ report_output=$( cd " $module " && mvn spotbugs:spotbugs \
174+ -Dspotbugs.onlyAnalyze=" $class_list " \
175+ -Dspotbugs.includeTests=false \
176+ -Dspotbugs.xmlOutput=true \
177+ -Dspotbugs.htmlOutput=true 2>&1 )
178+ fi
135179 report_exit=$?
136180 set -e
137181 echo " $report_output "
0 commit comments