
影刀RPA 代码质量扫描SonarQube自动检查与报告作者林焱 | 分类影刀RPA新手教程 | 难度★★★什么情况用开发团队使用SonarQube做代码质量扫描但扫描结果需要人工去看哪个项目有新增Bug、哪些代码行覆盖率下降、技术债是否增长。项目多了根本看不过来。用影刀RPA定时调用SonarQube API自动获取所有项目的质量指标生成质量周报并推送异常项目到企微群。质量工程师从手动查数据变成收到报告直接开会。怎么做第一步获取SonarQube访问Token店群矩阵自动化突破运营极限登录SonarQube → 右上角头像 → My Account → Security → Generate Token取名rpa-bot复制Token保存到影刀凭证管理。第二步获取所有项目列表# 影刀Python节点获取SonarQube项目列表importrequestsimportjson SONAR_URLhttps://sonarqube.yourcompany.comSONAR_TOKENsqu_xxx...# 从影刀凭证管理读取headers{Authorization:fBearer{SONAR_TOKEN}}defget_projects():获取所有项目urlf{SONAR_URL}/api/components/searchparams{qualifiers:TRK,ps:500}# TRK项目ps每页数量resprequests.get(url,headersheaders,paramsparams)dataresp.json()projects[]forcomponentindata.get(components,[]):projects.append({key:component[key],name:component[name],organization:component.get(organization,),})returnprojects projectsget_projects()print(f共发现{len(projects)}个项目)第三步获取项目质量指标# 影刀Python节点获取质量门禁状态和指标defget_project_metrics(project_key):获取项目的核心质量指标urlf{SONAR_URL}/api/measures/componentparams{component:project_key,metricKeys:bugs,vulnerabilities,code_smells,coverage,duplicated_lines_density,sqale_rating,reliability_rating,security_rating,alert_status,ncloc,}resprequests.get(url,headersheaders,paramsparams)dataresp.json()metrics{}formeasureindata.get(component,{}).get(measures,[]):metric_keymeasure[metric]valuemeasure.get(value,0)# 百分比指标转floatifmetric_keyin[coverage,duplicated_lines_density]:valuefloat(value)metrics[metric_key]valuereturn{项目:project_key,代码行数:metrics.get(ncloc,0),Bug数:int(metrics.get(bugs,0)),漏洞数:int(metrics.get(vulnerabilities,0)),异味数:int(metrics.get(code_smells,0)),测试覆盖率(%):metrics.get(coverage,0),重复率(%):metrics.get(duplicated_lines_density,0),技术债评级:int(metrics.get(sqale_rating,5)),# 1A, 5E质量门禁:metrics.get(alert_status,UNKNOWN),}# 遍历所有项目quality_data[]forprojinprojects[:10]:# 先限制数量测试metricsget_project_metrics(proj[key])quality_data.append(metrics)status✅ifmetrics[质量门禁]OKelse❌print(f{status}{proj[name]}| Bug:{metrics[Bug数]}| 覆盖率:{metrics[测试覆盖率(%)]}%)第四步生成质量趋势报告# 影刀Python节点对比上次扫描发现恶化项目defcompare_with_previous(current_data,previous_data):对比两次扫描结果标注恶化项prev_map{p[项目]:pforpinprevious_data}alerts[]foritemincurrent_data:prevprev_map.get(item[项目])ifnotprev:continuechanges[]ifitem[Bug数]prev[Bug数]:changes.append(fBug {item[Bug数]-prev[Bug数]})ifitem[漏洞数]prev[漏洞数]:changes.append(f漏洞 {item[漏洞数]-prev[漏洞数]})ifitem[测试覆盖率(%)]prev[测试覆盖率(%)]-1:changes.append(f覆盖率 ↓{prev[测试覆盖率(%)]-item[测试覆盖率(%)]:.1f}%)ifitem[质量门禁]ERRORandprev[质量门禁]OK:changes.append(质量门禁从通过→失败)ifchanges:alerts.append({项目:item[项目],恶化项:, .join(changes),})returnalerts alertscompare_with_previous(quality_data,last_week_data)ifalerts:forainalerts:print(f⚠️{a[项目]}:{a[恶化项]})第五步推送到企微在影刀中将alerts结果【企微推送】给研发群格式为Markdown消息卡片# 构造企微Markdown消息msg## SonarQube质量周报\nmsgf 扫描项目{len(projects)}个 | 通过门禁{passed}个 | 失败{failed}个\n\nifalerts:msg### ⚠️ 质量恶化项目\nforainalerts:msgf- **{a[项目]}**{a[恶化项]}\nelse:msg### ✅ 所有项目质量稳定\nmsg\n[查看完整报告](sonarqube链接)有什么坑坑1SonarQube API限流SonarQube社区版没有限流但企业版可能有请求频率限制。如果你有200项目一次性全部查询可能触发限流。建议分批查询每批20个间隔2秒。temu店群自动化报活动案例坑2新项目可能没有指标数据刚创建的项目还没跑过扫描API返回的measure数组为空。代码里要对空值做好兼容处理别因为一个新项目就让整个流程报错。坑3覆盖率指标可能不存在不是所有项目都配置了测试覆盖率。如果项目没有覆盖率数据coverage字段为空把默认值设成未配置而非0否则看起来像覆盖率为0%容易误导。坑4Token过期SonarQube的Token默认有过期时间。如果RPA突然全部报401未授权大概率是Token过期了。建议在流程开头调用api/authentication/validate检查Token有效性。坑5SonarQube版本差异不同SonarQube版本API返回字段可能有变化特别是8.x→9.x升级。建议先用Postman或curl手动调一次API确认返回格式再写Python代码。总结SonarQube自动化的价值不在拉取数据本身而在于趋势分析——单一时间点的Bug数没意义但从100降到50再涨到80说明最近质量在退化。RPA帮你把趋势监控从偶尔想起来看一眼变成自动追踪。