Skip to content

Latest commit

 

History

History
462 lines (359 loc) · 10.9 KB

sonarqube_integration_guide.md

File metadata and controls

462 lines (359 loc) · 10.9 KB

📚 SonarQube集成指南

本指南详细介绍如何使用基于 python-sonarqube-api 库的SonarQube缺陷分析器。

🛠️ 技术栈

核心依赖

  • python-sonarqube-api: SonarQube官方推荐的Python API库
  • ollama: 本地AI模型集成
  • requests: HTTP请求处理
  • markdown: 报告格式化

架构优势

  • ✅ 使用官方推荐的API库,稳定性更强
  • ✅ 自动处理分页和错误重试
  • ✅ 更好的类型安全和代码补全
  • ✅ 完整的SonarQube API覆盖

🔧 安装配置

1. 安装依赖

# 方法1:使用requirements.txt(推荐)
pip install -r requirements.txt

# 方法2:手动安装核心依赖
pip install python-sonarqube-api==2.0.5
pip install ollama==0.1.7
pip install requests==2.31.0
pip install markdown==3.5.1
pip install pymysql==1.1.0

2. SonarQube配置

获取API Token

  1. 登录你的SonarQube实例
  2. 进入 My Account → Security
  3. 生成新的Token:Generate Tokens
  4. 复制生成的Token

环境变量设置

# 基本配置
export SONARQUBE_URL="http://your-sonarqube.com:9000"
export SONARQUBE_TOKEN="your_generated_token_here"

# 高级配置(可选)
export SONARQUBE_TIMEOUT="60"          # API超时时间(秒)
export SONARQUBE_VERIFY_SSL="true"     # 是否验证SSL证书

# AI分析配置(可选)
export OLLAMA_BASE_URL="http://localhost:11434"
export OLLAMA_DEFAULT_MODEL="llama3"

# 邮件通知配置(可选)
export EMAIL_ENABLED="true"
export SMTP_SERVER="smtp.qq.com"
export SMTP_PORT="587"
export EMAIL_USERNAME="your_email@qq.com"
export EMAIL_PASSWORD="your_app_password"

3. 验证安装

# 测试python-sonarqube-api库导入
python3 test_python_sonarqube_api.py

# 测试SonarQube连接
python3 shared/sonarqube_client.py --test connection

# 测试具体项目访问
python3 shared/sonarqube_client.py --test project --project-key "your-project-key"

# 运行完整测试
python3 test_sonarqube_analyzer.py --test all

📊 API功能详解

1. 项目信息获取

from shared.sonarqube_client import SonarQubeClient

client = SonarQubeClient()
project_info = client.get_project_info("your-project-key")
print(f"项目名称: {project_info['name']}")
print(f"最后分析时间: {project_info['lastAnalysisDate']}")

2. 问题列表获取

# 获取所有高优先级问题
issues = client.get_project_issues(
    project_key="your-project-key",
    severities=['CRITICAL', 'BLOCKER'],
    types=['BUG', 'VULNERABILITY'],
    statuses=['OPEN', 'CONFIRMED']
)

print(f"发现 {len(issues)} 个高优先级问题")
for issue in issues[:5]:  # 显示前5个
    print(f"- {issue['severity']}: {issue['message']}")

3. 度量数据获取

# 获取项目质量度量
measures = client.get_project_measures("your-project-key")
print(f"Bug数量: {measures.get('bugs', 0)}")
print(f"漏洞数量: {measures.get('vulnerabilities', 0)}")
print(f"测试覆盖率: {measures.get('coverage', 0)}%")
print(f"安全评级: {measures.get('security_rating', 'N/A')}")

4. 安全热点获取

# 获取待审查的安全热点
hotspots = client.get_project_hotspots(
    project_key="your-project-key",
    statuses=['TO_REVIEW', 'ACKNOWLEDGED']
)

print(f"发现 {len(hotspots)} 个安全热点")
for hotspot in hotspots:
    print(f"- {hotspot['securityCategory']}: {hotspot['message']}")

🤖 AI分析集成

1. 启用AI分析

# 基本AI分析
python3 data_analysis/sonarqube_defect_analyzer.py \
  --project-key "your-project-key" \
  --use-ai

# 指定AI模型
python3 data_analysis/sonarqube_defect_analyzer.py \
  --project-key "your-project-key" \
  --use-ai \
  --ai-model "qwen3:32b"

2. AI分析特性

智能问题分类

  • 自动识别问题类型和严重程度
  • 分析问题之间的关联性
  • 识别重复或相似问题

风险评估

  • 基于问题数量和严重程度计算风险评分
  • 考虑项目规模和复杂度
  • 提供风险等级(CRITICAL/HIGH/MEDIUM/LOW/MINIMAL)

修复建议

  • 针对具体问题提供修复方案
  • 优先级排序和时间规划
  • 最佳实践和预防措施

3. AI模型选择

模型 适用场景 特点 推荐度
qwen3:32b 重要项目深度分析 中文支持好,分析质量高 ⭐⭐⭐⭐⭐
llama3:8b 日常快速分析 速度快,资源占用少 ⭐⭐⭐⭐
gemma2:9b 平衡性能需求 Google开发,稳定性好 ⭐⭐⭐⭐
codellama:7b 代码专项分析 专门优化代码理解 ⭐⭐⭐

📄 报告生成

1. 多格式报告支持

# JSON格式(用于程序处理)
python3 data_analysis/sonarqube_defect_analyzer.py \
  --project-key "your-project-key" \
  --output-format json \
  --output-file "analysis_result.json"

# Markdown格式(用于文档)
python3 data_analysis/sonarqube_defect_analyzer.py \
  --project-key "your-project-key" \
  --output-format markdown \
  --output-file "analysis_report.md"

# HTML格式(用于邮件和展示)
python3 data_analysis/sonarqube_defect_analyzer.py \
  --project-key "your-project-key" \
  --output-format html \
  --output-file "analysis_report.html"

2. 自动邮件发送

# 发送HTML报告邮件
python3 data_analysis/sonarqube_defect_analyzer.py \
  --project-key "your-project-key" \
  --use-ai \
  --output-format html \
  --send-email \
  --email-recipients "dev-team@company.com" "manager@company.com" \
  --email-subject "项目质量分析报告 - $(date +%Y-%m-%d)"

3. 报告内容结构

项目概览

  • 基本信息和分析时间
  • 质量门状态
  • 风险等级评估

核心指标仪表盘

  • Bug、漏洞、代码异味统计
  • 测试覆盖率和重复代码密度
  • 可维护性、可靠性、安全性评级

问题分布分析

  • 按类型和严重程度分类
  • 安全热点风险分析
  • 趋势和对比数据

AI智能洞察

  • 整体质量健康度评估
  • 主要风险点识别
  • 具体修复建议和优先级

🔍 高级使用场景

1. 批量项目分析

# 批量分析多个项目
projects = ['project-1', 'project-2', 'project-3']
results = {}

for project_key in projects:
    analyzer = SonarQubeDefectAnalyzer(project_key)
    results[project_key] = analyzer.analyze_project_defects(use_ai=True)

# 生成对比报告
generate_comparison_report(results)

2. 定时监控脚本

#!/bin/bash
# daily_quality_check.sh

# 设置环境变量
source /path/to/sonarqube.env

# 分析关键项目
python3 data_analysis/sonarqube_defect_analyzer.py \
  --project-key "critical-project" \
  --severities CRITICAL BLOCKER \
  --use-ai \
  --ai-model "qwen3:32b" \
  --send-email \
  --email-recipients "ops-team@company.com"

# 记录到日志
echo "$(date): Daily quality check completed" >> /var/log/sonarqube-analysis.log

3. CI/CD集成

# .github/workflows/quality-gate.yml
name: Quality Gate Check

on:
  pull_request:
    branches: [ main ]

jobs:
  quality-analysis:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Setup Python
      uses: actions/setup-python@v2
      with:
        python-version: '3.9'
    
    - name: Install dependencies
      run: |
        pip install -r requirements.txt
    
    - name: Run SonarQube Analysis
      env:
        SONARQUBE_URL: ${{ secrets.SONARQUBE_URL }}
        SONARQUBE_TOKEN: ${{ secrets.SONARQUBE_TOKEN }}
      run: |
        python3 data_analysis/sonarqube_defect_analyzer.py \
          --project-key "${{ github.repository }}" \
          --severities CRITICAL BLOCKER \
          --output-format json \
          --output-file quality-report.json
    
    - name: Check Quality Gate
      run: |
        python3 -c "
import json
with open('quality-report.json') as f:
    data = json.load(f)
    if data['summary']['quality_gate_status'] != 'OK':
        print('Quality gate failed!')
        exit(1)
    print('Quality gate passed!')
"

🔧 故障排查

1. 连接问题

# 测试网络连通性
curl -I $SONARQUBE_URL

# 测试API认证
curl -u "$SONARQUBE_TOKEN:" "$SONARQUBE_URL/api/authentication/validate"

# 使用调试模式
python3 shared/sonarqube_client.py --test connection --log-level DEBUG

2. 常见错误解决

ImportError: No module named 'sonarqube'

# 解决方案
pip install python-sonarqube-api==2.0.5

401 Unauthorized

# 检查Token是否正确
echo $SONARQUBE_TOKEN

# 重新生成Token
# 1. 登录SonarQube
# 2. My Account → Security → Tokens
# 3. Generate new token

404 Project not found

# 检查项目标识符
python3 shared/sonarqube_client.py --test project --project-key "your-project-key"

# 列出所有可访问的项目
python3 -c "
from shared.sonarqube_client import SonarQubeClient
client = SonarQubeClient()
projects = client.sonar.projects.search_projects()
for p in projects['components']:
    print(f'{p[\"key\"]}: {p[\"name\"]}')
"

3. 性能优化

大项目优化

# 只分析高优先级问题
python3 data_analysis/sonarqube_defect_analyzer.py \
  --project-key "large-project" \
  --severities CRITICAL BLOCKER \
  --issue-types BUG VULNERABILITY

# 禁用AI分析提高速度
python3 data_analysis/sonarqube_defect_analyzer.py \
  --project-key "large-project" \
  --output-format json

网络超时处理

# 增加超时时间
export SONARQUBE_TIMEOUT="120"

# 使用自定义配置
python3 data_analysis/sonarqube_defect_analyzer.py \
  --project-key "your-project" \
  --sonarqube-timeout 120

📈 最佳实践

1. 项目质量监控

# 建立基线
python3 data_analysis/sonarqube_defect_analyzer.py \
  --project-key "project" \
  --output-format json \
  --output-file "baseline_$(date +%Y%m%d).json"

# 定期对比
# 每周运行,对比质量变化趋势

2. 团队协作

# 发送团队报告
python3 data_analysis/sonarqube_defect_analyzer.py \
  --project-key "team-project" \
  --use-ai \
  --ai-model "qwen3:32b" \
  --send-email \
  --email-recipients "team@company.com" \
  --email-subject "每周代码质量报告"

3. 质量门集成

# 在CI/CD中检查质量门状态
def check_quality_gate(project_key):
    from shared.sonarqube_client import SonarQubeClient
    
    client = SonarQubeClient()
    status = client.get_quality_gate_status(project_key)
    
    if status.get('status') != 'OK':
        failed_conditions = [c for c in status.get('conditions', []) if c.get('status') == 'ERROR']
        print(f"质量门检查失败,{len(failed_conditions)} 个条件未通过")
        return False
    
    print("质量门检查通过")
    return True

🚀 未来规划

计划中的功能

  • 📊 历史趋势分析和对比
  • 🔔 Webhook通知支持
  • 📱 移动端友好的报告界面
  • 🔗 JIRA问题自动创建
  • 📈 自定义度量指标

贡献指南

欢迎提交Issue和Pull Request!


让代码质量管理更智能、更高效! 🎯