11#! /bin/bash
22# ============================================================
3- # checkstyle-pr.sh - Checkstyle 增量扫描(多模块,包含测试 )
4- # 功能:只扫描本次提交中变更的 Java 文件(所有模块,src/main 和 src/test)
5- # 生成报告,根据违规数决定退出码
3+ # checkstyle-pr.sh - 增量检查(扫描整个变更文件,不过滤行号 )
4+ # 功能:对本次提交中变更的 Java 文件执行完整的 Checkstyle 检查
5+ # 不阻断构建,生成完整报告
66# ============================================================
77
88set -e
99
1010echo " ========================================"
11- echo " Checkstyle 增量扫描(多模块) "
12- echo " 扫描范围:所有模块的变更 Java 文件(包含测试 )"
11+ echo " Checkstyle 增量检查 "
12+ echo " 扫描范围:本次变更的 Java 文件(完整文件 )"
1313echo " ========================================"
1414
1515# 1. 确定目标分支
2929 echo " 🔍 本地运行模式,对比分支: $BASE_BRANCH "
3030fi
3131
32- # 2. 获取变更的 Java 文件(所有模块)
32+ # 2. 获取变更的 Java 文件
3333CHANGED_FILES=$( git diff --name-only " $BASE_BRANCH " HEAD 2> /dev/null | grep ' \.java$' || true)
3434
3535if [ -z " $CHANGED_FILES " ]; then
@@ -41,117 +41,79 @@ echo "📝 变更的 Java 文件:"
4141echo " $CHANGED_FILES "
4242echo " ----------------------------------------"
4343
44- # 3. 按模块分组,提取模块内相对路径
45- declare -A module_files
46- for file in $CHANGED_FILES ; do
47- # 提取第一级目录作为模块名(例如 base, app, core 等)
48- module=" ${file%%/* } "
49- # 如果模块名为空或文件在根目录,跳过
50- if [ -z " $module " ] || [ " $module " == " $file " ]; then
51- echo " ⚠️ 忽略根目录文件: $file "
52- continue
53- fi
54- # 去掉模块前缀,得到相对路径
55- rel=" ${file# $module / } "
56- # 追加到对应模块的列表中(逗号分隔)
57- if [ -z " ${module_files[$module]} " ]; then
58- module_files[$module ]=" $rel "
59- else
60- module_files[$module ]=" ${module_files[$module]} ,$rel "
61- fi
62- done
44+ # 3. 将文件列表转为逗号分隔
45+ FILES_LIST=$( echo " $CHANGED_FILES " | tr ' \n' ' ,' | sed ' s/,$//' )
46+
47+ # 4. 执行 Checkstyle 扫描(生成完整报告)
48+ echo " 🚀 执行 Checkstyle 扫描(完整文件)..."
49+ echo " FILES_LIST: $FILES_LIST "
50+ set +e
51+ mvn -pl base checkstyle:check \
52+ -Dcheckstyle.config.location=checkstyle/huawei-checkstyle.xml \
53+ -Dcheckstyle.violationSeverity=warning
54+ MVN_EXIT=$?
55+ set -e
6356
64- if [ ${# module_files[@]} -eq 0 ]; then
65- echo " ⚠️ 没有识别到任何模块,跳过检查。"
57+ # 额外生成 HTML 报告(不受违规影响,始终执行)
58+ echo " 📄 生成 HTML 报告..."
59+ mvn -pl base checkstyle:checkstyle \
60+ -Dcheckstyle.config.location=checkstyle/huawei-checkstyle.xml \
61+ -Dcheckstyle.outputFormat=html \
62+ -Dcheckstyle.violationSeverity=warning
63+
64+ # 5. 确定报告路径(根据项目结构调整)
65+ REPORT_FILE=" base/target/checkstyle-result.xml"
66+ if [ ! -f " $REPORT_FILE " ]; then
67+ echo " ❌ 未生成 Checkstyle 报告,请检查 Maven 配置。"
6668 exit 0
6769fi
6870
69- echo " 📝 按模块分组后的相对路径:"
70- for module in " ${! module_files[@]} " ; do
71- echo " $module : ${module_files[$module]} "
72- done
73- echo " ----------------------------------------"
71+ # 6. 统计违规数
72+ VIOLATIONS=$( grep -c ' <error' " $REPORT_FILE " || true)
7473
75- # 4. 对每个模块执行 Checkstyle 检查
76- total_violations=0
77- for module in " ${! module_files[@]} " ; do
78- file_list=" ${module_files[$module]} "
79- echo " 🚀 扫描模块: $module "
80- echo " 文件列表: $file_list "
81-
82- if [ ! -d " $module " ] || [ ! -f " $module /pom.xml" ]; then
83- echo " ⚠️ 模块目录 $module 不存在或没有 pom.xml,跳过。"
84- continue
85- fi
86-
87- # 执行 Checkstyle(生成 XML 报告)
88- echo " - 生成 XML 报告..."
89- set +e
90- (cd " $module " && mvn checkstyle:check \
91- -Dcheckstyle.config.location=../checkstyle/huawei-checkstyle.xml \
92- -Dcheckstyle.includes=" $file_list " \
93- -Dcheckstyle.violationSeverity=warning)
94- if [ $? -ne 0 ]; then
95- echo " ⚠️ 模块 $module 的 Checkstyle 检查失败(但继续)"
96- fi
97- set -e
98-
99- # 生成 HTML 报告
100- echo " - 生成 HTML 报告..."
101- set +e
102- (cd " $module " && mvn checkstyle:checkstyle \
103- -Dcheckstyle.config.location=../checkstyle/huawei-checkstyle.xml \
104- -Dcheckstyle.includes=" $file_list " \
105- -Dcheckstyle.outputFormat=html \
106- -Dcheckstyle.violationSeverity=warning)
107- if [ $? -ne 0 ]; then
108- echo " ⚠️ 模块 $module 的 HTML 报告生成失败(但继续)"
109- fi
110- set -e
111-
112- # 统计该模块的违规数
113- report_file=" $module /target/checkstyle-result.xml"
114- if [ -f " $report_file " ]; then
115- count=$( grep -c ' <error' " $report_file " || true)
116- total_violations=$(( total_violations + count))
117- echo " 模块 $module 违规数: $count "
118- else
119- echo " ⚠️ 模块 $module 未生成报告"
120- fi
121- echo " "
122- done
123-
124- # 5. 输出汇总信息
12574echo " ----------------------------------------"
126- if [ $total_violations -eq 0 ]; then
75+ if [ $VIOLATIONS -eq 0 ]; then
12776 echo " ✅ 所有变更文件未发现违规!"
12877else
129- echo " ⚠️ 总计发现 $total_violations 个违规。"
78+ echo " ⚠️ 发现 $VIOLATIONS 个违规项(完整文件扫描)"
79+ echo " "
80+ echo " 📋 违规摘要(前 30 条):"
81+ grep ' <error' " $REPORT_FILE " | head -30 | sed ' s/<error //; s/\/>//' | \
82+ sed ' s/line="/行号: /; s/column="/列: /; s/severity="/严重性: /; s=message="=信息: =; s=source="//' | \
83+ while read -r line; do
84+ echo " $line "
85+ done
13086fi
13187
132- # 6 . 输出到 Step Summary(可选)
88+ # 7 . 输出到 GitHub Step Summary
13389if [ -n " $GITHUB_STEP_SUMMARY " ]; then
13490 {
135- echo " ## 📋 Checkstyle 汇总报告 "
91+ echo " ## 📋 Checkstyle 报告 "
13692 echo " "
13793 echo " | 指标 | 结果 |"
13894 echo " |------|------|"
139- if [ $total_violations -eq 0 ]; then
140- echo " | 总违规数 | ✅ **0** |"
95+ if [ $VIOLATIONS -eq 0 ]; then
96+ echo " | 违规数 | ✅ **0** |"
14197 else
142- echo " | 总违规数 | ⚠️ **$total_violations ** |"
98+ echo " | 违规数 | ⚠️ **$VIOLATIONS ** |"
14399 fi
144- echo " | 涉及模块 | ${! module_files[*]} |"
100+ echo " | 扫描文件 | **$( echo " $CHANGED_FILES " | wc -l) ** 个变更 Java 文件 |"
101+ echo " | 检查方式 | 对变更文件进行完整扫描 |"
145102 echo " "
146- echo " 📥 完整报告已作为 Artifact 上传。"
103+ echo " 📥 完整报告已作为 Artifact 上传,请在工作流运行页面下载 。"
147104 } >> " $GITHUB_STEP_SUMMARY "
105+ echo " ✅ Step Summary 已更新"
148106fi
149107
150- # 7. 根据违规数决定构建状态
151- if [ $total_violations -eq 0 ]; then
108+ # 8. 始终以成功状态退出
109+ # ================================================
110+ # 7. 根据违规数决定构建状态(拦截 PR)
111+ # ================================================
112+ if [ $VIOLATIONS -eq 0 ]; then
152113 echo " ✅ 检查通过,构建成功。"
153114 exit 0
154115else
155- echo " ❌ 发现 $total_violations 个违规,构建失败。"
116+ echo " ❌ 发现 $VIOLATIONS 个违规,构建失败。"
117+ # 为了让 GitHub Actions 标记为失败,退出码设为 1
156118 exit 1
157119fi
0 commit comments