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