本指南详细介绍如何使用基于 python-sonarqube-api 库的SonarQube缺陷分析器。
- python-sonarqube-api: SonarQube官方推荐的Python API库
- ollama: 本地AI模型集成
- requests: HTTP请求处理
- markdown: 报告格式化
- ✅ 使用官方推荐的API库,稳定性更强
- ✅ 自动处理分页和错误重试
- ✅ 更好的类型安全和代码补全
- ✅ 完整的SonarQube API覆盖
# 方法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- 登录你的SonarQube实例
- 进入 My Account → Security
- 生成新的Token:
Generate Tokens - 复制生成的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"# 测试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 allfrom 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']}")# 获取所有高优先级问题
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']}")# 获取项目质量度量
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')}")# 获取待审查的安全热点
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分析
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"- 自动识别问题类型和严重程度
- 分析问题之间的关联性
- 识别重复或相似问题
- 基于问题数量和严重程度计算风险评分
- 考虑项目规模和复杂度
- 提供风险等级(CRITICAL/HIGH/MEDIUM/LOW/MINIMAL)
- 针对具体问题提供修复方案
- 优先级排序和时间规划
- 最佳实践和预防措施
| 模型 | 适用场景 | 特点 | 推荐度 |
|---|---|---|---|
qwen3:32b |
重要项目深度分析 | 中文支持好,分析质量高 | ⭐⭐⭐⭐⭐ |
llama3:8b |
日常快速分析 | 速度快,资源占用少 | ⭐⭐⭐⭐ |
gemma2:9b |
平衡性能需求 | Google开发,稳定性好 | ⭐⭐⭐⭐ |
codellama:7b |
代码专项分析 | 专门优化代码理解 | ⭐⭐⭐ |
# 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"# 发送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)"- 基本信息和分析时间
- 质量门状态
- 风险等级评估
- Bug、漏洞、代码异味统计
- 测试覆盖率和重复代码密度
- 可维护性、可靠性、安全性评级
- 按类型和严重程度分类
- 安全热点风险分析
- 趋势和对比数据
- 整体质量健康度评估
- 主要风险点识别
- 具体修复建议和优先级
# 批量分析多个项目
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)#!/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# .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!')
"# 测试网络连通性
curl -I $SONARQUBE_URL
# 测试API认证
curl -u "$SONARQUBE_TOKEN:" "$SONARQUBE_URL/api/authentication/validate"
# 使用调试模式
python3 shared/sonarqube_client.py --test connection --log-level DEBUG# 解决方案
pip install python-sonarqube-api==2.0.5# 检查Token是否正确
echo $SONARQUBE_TOKEN
# 重新生成Token
# 1. 登录SonarQube
# 2. My Account → Security → Tokens
# 3. Generate new token# 检查项目标识符
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\"]}')
"# 只分析高优先级问题
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# 建立基线
python3 data_analysis/sonarqube_defect_analyzer.py \
--project-key "project" \
--output-format json \
--output-file "baseline_$(date +%Y%m%d).json"
# 定期对比
# 每周运行,对比质量变化趋势# 发送团队报告
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 "每周代码质量报告"# 在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!
让代码质量管理更智能、更高效! 🎯