check-code.sh 3.1 KB
#!/bin/bash

# SMF Core 代码质量检查脚本
# 此脚本用于运行各种代码质量分析工具

# 错误时退出
set -e

echo "========================================"
echo "开始 SMF Core 代码质量检查"
echo "========================================"

# 项目根目录
PROJECT_ROOT=$(dirname "$(dirname "$0")")
cd "$PROJECT_ROOT"

# 检查 Maven 是否安装
if ! command -v mvn &> /dev/null; then
  echo "错误: Maven 未安装或不在 PATH 中"
  echo "请安装 Maven 3.6+ 并将其添加到 PATH 环境变量"
  exit 1
fi

# 创建报告目录
mkdir -p reports/code-quality

# 1. 运行 Checkstyle 检查
echo "\n1. 运行 Checkstyle 代码风格检查..."
mvn checkstyle:check

if [ -f "target/checkstyle-result.xml" ]; then
  cp target/checkstyle-result.xml reports/code-quality/
  echo "Checkstyle 报告已保存至: reports/code-quality/checkstyle-result.xml"
fi

# 2. 运行 SpotBugs 检查
echo "\n2. 运行 SpotBugs 静态代码分析..."
mvn com.github.spotbugs:spotbugs-maven-plugin:4.5.3.0:check

if [ -f "target/spotbugsXml.xml" ]; then
  cp target/spotbugsXml.xml reports/code-quality/
  echo "SpotBugs 报告已保存至: reports/code-quality/spotbugsXml.xml"
fi

# 3. 运行 PMD 检查(如果在 pom.xml 中配置了)
echo "\n3. 运行 PMD 代码复杂度分析..."
mvn pmd:check || echo "警告: PMD 检查失败,可能未在 pom.xml 中配置"

if [ -f "target/pmd.xml" ]; then
  cp target/pmd.xml reports/code-quality/
  echo "PMD 报告已保存至: reports/code-quality/pmd.xml"
fi

# 4. 生成测试覆盖率报告
echo "\n4. 生成测试覆盖率报告..."
mvn test jacoco:report

if [ -d "target/site/jacoco" ]; then
  cp -r target/site/jacoco reports/code-quality/
  echo "测试覆盖率报告已保存至: reports/code-quality/jacoco/index.html"
fi

# 5. 运行 SonarQube 分析(如果有配置)
echo "\n5. 检查是否有 SonarQube 配置..."
if [ -f "sonar-project.properties" ]; then
  echo "运行 SonarQube 分析..."
  if command -v sonar-scanner &> /dev/null; then
    sonar-scanner
  elif command -v mvn &> /dev/null; then
    mvn sonar:sonar || echo "警告: SonarQube 分析失败,请确保 SonarQube 服务可用"
  else
    echo "跳过 SonarQube 分析: 未找到 sonar-scanner 或 Maven"
  fi
else
  echo "跳过 SonarQube 分析: 未找到 sonar-project.properties 文件"
fi

echo "\n========================================"
echo "代码质量检查完成!"
echo "========================================"
echo "报告位置: $PROJECT_ROOT/reports/code-quality/"
echo "\n检查结果摘要:"

echo "- Checkstyle: $(grep -o "severity=\"error\"" reports/code-quality/checkstyle-result.xml 2>/dev/null | wc -l || echo "未找到报告") 个错误"
echo "- SpotBugs: $(grep -o "priority=\"1\"" reports/code-quality/spotbugsXml.xml 2>/dev/null | wc -l || echo "未找到报告") 个高优先级问题"

if [ -d "reports/code-quality/jacoco" ]; then
  COVERAGE=$(grep -A 1 "lineRate" reports/code-quality/jacoco/jacoco.xml | tail -1 | sed 's/.*\(\([0-9]\+\.[0-9]\+\)\).*/\1/')
  echo "- 测试覆盖率: ${COVERAGE}%"
else
  echo "- 测试覆盖率: 未生成报告"
fi