Python实现获取sonarqube数据
作者:Michaelwubo 发布时间:2023-02-26 04:38:30
标签:Python,sonarqube,数据
1.sonarqube是一款代码分析的工具,通过soanrScanner扫描后的数据传递给sonarqube进行分析
2.sonarqube社区版没有对c++类代码的分析,但是可以找到一个开源的包,安装即可,扫描的话可以使用cppcheck来进行扫描
安装python对于sonarqube的api包:python-sonarqube-api
建立sonarqube连接
from sonarqube import SonarQubeClient
sonar = SonarQubeClient(
sonarqube_url="http://192.168.xx.xx:9000",
username='admin',
password='admin'
)
使用:建议大家先参考sonarqube的python-api
Welcome to SonarQube Client with Python’s documentation! — SonarQube Client with Python 1.3.5 documentation
使用示例
# 通过项目名称获取id
# 传递参数:创建分析配置文件时候的项目名称
component = sonar.components.get_project_component_and_ancestors("python_test")
# 获取任务
# 参数1:上一步获取的component值
# 参数2:逗号分割的状态值
tasks1 = sonar.ce.search_tasks(
componentId="AX5v36mo0Npud3J2od3a",
status="FAILED,CANCELED,PENDING,IN_PROGRESS,SUCCESS"
)
# 获取所有项目
projects = list(sonar.projects.search_projects())
# 获取这个项目下最近一次分析任务的详情
"""
componentKeys:某一个项目名称
types:参数类型
CODE_SMELL==异常
BUG==bug
VULNERABILITY==漏洞
SECURITY_HOTSPOT==
"""
issues2 = list(sonar.issues.search_issues(componentKeys="python_s", types="CODE_SMELL"))
通过metricKeys参数获取这个项目中需要的值
# 参数1:component 项目名称
# 参数2:metricKeys 想要获取的某个值,逗号分割
component_data = sonar.measures.get_component_with_specified_measures(
component="python_test",
metricKeys="functions,classes"
)['component']['measures']
# 目前已收集的值和含义
'''
ncloc==总代码长度
ncloc_language_distribution==其中每种语言的行数
bugs==bug数
vulnerabilities==漏洞数
code_smells==异常数
duplicated_lines_density==重复度百分比
coverage==代码覆盖率百分比
files==文件数量
functions==方法数量
classes==类数量
'''
[root@localhost data]# cat wubo.py
#!/bin/python3
# encoding: utf-8
from sonarqube import SonarQubeClient
from operator import itemgetter
import json
import csv
import os
import time
import shutil
class SonarQube:
def __init__(self,url,username="admin",password="123456aA") -> None:
username = username
password = password
sonarqube_url = url
self.client = SonarQubeClient(username = username,password = password,sonarqube_url = sonarqube_url)
def getProjects(self):
"""获取项目列表"""
projects = self.client.projects.search_projects().get("components")
return projects
def getIssues(self,jettech_project_name,issues_type):
"""获取项目问题列表"""
#projects = self.client.issues.search_issues(componentKeys="jettoloader-pressurecommon",types="BUG",s="FILE_LINE",resolved="false",ps=1,organization="default-organization",facets="authors",additionalFields="_all")
projects = self.client.issues.search_issues(componentKeys=jettech_project_name,types=issues_type,s="FILE_LINE",resolved="false",ps=1,organization="default-organization",facets="authors",additionalFields="_all")
list_issues = projects["facets"][0]["values"]
#list_issues_name_count = []
#for list_issues_item in list_issues:
# list_issues_name_count.append(list_issues_item["val"])
# list_issues_name_count.append(list_issues_item["count"])
#print(list_issues)
#list_issues[0]["val"])
#list_issues[0]["count"])
return list_issues
def getMessages(self,component):
""" 获取项目各个参数数据"""
#metricKeys = "alert_status,bugs,,vulnerabilities,security_rating,code_smells,duplicated_lines_density,coverage,ncloc"
metricKeys = "bugs,,vulnerabilities"
messages = []
messages.append(self.client.measures.get_component_with_specified_measures(component, metricKeys))
return messages[0]
def getMeasures(self,component,message):
measures = []
measures.insert(0,component)
measures_all = message.get("component").get("measures")
for measure_item in measures_all:
measures_type = measure_item.get("metric")
if "bugs" == measures_type:
measures.insert(1,measure_item.get("value"))
if "vulnerabilities" == measures_type:
measures.insert(2,measure_item.get("value"))
return measures
class CSV:
def __init__(self,filepath,filename) -> None:
self.filepath = filepath
self.filename = filename
def csv_write(self,project_measure_all):
#header = ['1project_name','2bugs','3vulnerabilities']
with open(self.filepath+"/"+self.filename, 'a') as file_obj:
writer = csv.writer(file_obj)
#writer.writerow(header)
for p in project_measure_all:
writer.writerow(p)
def csv_sort(self):
datas=[]
with open(self.filepath+"/"+self.filename, 'r') as f:
table = []
for line in f:
line = line.replace("\n","").replace("\r","")
col = line.split(',')
col[0] = str(col[0])
col[1] = col[1].strip("\n")
table.append(col)
table_sorted = sorted(table, key=itemgetter(0), reverse=False) # 精确的按照第1列排序
for row in table_sorted:
datas.append(row)
f.close()
with open(self.filepath+"/"+self.filename,"w", newline='') as csvfile:
writer = csv.writer(csvfile)
for data in datas:
writer.writerow(data)
csvfile.close()
def csv_insert(self):
header = 'project_name,bugs,vulnerabilities'
with open(self.filepath+"/"+self.filename, 'r+', encoding='utf-8') as f:
content = f.read()
f.seek(0, 0)
f.write(header + '\n' + content)
f.close()
def csv_delete(self):
if (os.path.exists(self.filepath)):
shutil.rmtree(self.filepath,ignore_errors=True)
def csv_sum(self):
with open(self.filepath+"/"+self.filename) as fin:
readline_item=fin.readline()
total_bug_api = 0
total_bug_manager = 0
total_bug_loader = 0
total_bug_ui = 0
total_vulnerabilities_api = 0
total_vulnerabilities_manager = 0
total_vulnerabilities_loader = 0
total_vulnerabilities_ui = 0
for row in csv.reader(fin):
row_project_name=row[0].split("-")[0]
if "jettoapi" == row_project_name:
total_bug_api += int(row[1])
total_vulnerabilities_api += int(row[2])
if "jettoloader" == row_project_name:
total_bug_loader += int(row[1])
total_vulnerabilities_loader += int(row[2])
if "jettomanager" == row_project_name:
total_bug_manager += int(row[1])
total_vulnerabilities_manager += int(row[2])
if "jettoui" == row_project_name:
total_bug_ui += int(row[1])
total_vulnerabilities_ui += int(row[2])
fin.close()
header_kong = ['','','']
header_api = ['jettoapi','bug总数',str(total_bug_api),'vulnerabilities总数',str(total_vulnerabilities_api)]
header_loader = ['jettoloader','bug总数',str(total_bug_loader),'vulnerabilities总数',str(total_vulnerabilities_loader)]
header_manager = ['jettomanager','bug总数',str(total_bug_manager),'vulnerabilities总数',str(total_vulnerabilities_manager)]
header_ui = ['jettoui','bug总数',str(total_bug_ui),'vulnerabilities总数',str(total_vulnerabilities_ui)]
with open(self.filepath+"/"+self.filename, 'a') as file_obj:
writer = csv.writer(file_obj)
writer.writerow(header_kong)
writer.writerow(header_api)
writer.writerow(header_loader)
writer.writerow(header_manager)
writer.writerow(header_ui)
file_obj.close()
class SCP:
def __init__(self,localdir,remoteip,remotedir) -> None:
self.localdir = localdir
self.remoteip = remoteip
self.remotedir = remotedir
def scp_operate(self):
os.system('scp -r "%s" "%s:%s"' % (self.localdir, self.remoteip, self.remotedir))
def main():
sonarQube = SonarQube(url='http://172.16.10.1:9000/')
all_project_info = sonarQube.getProjects()
project_measure_all=[]
project_issues_all=[]
for project_info in all_project_info:
component = project_info.get("key")
message = sonarQube.getMessages(component)
measure = sonarQube.getMeasures(component,message)
project_issues=[]
list_issues_s = sonarQube.getIssues(component,"BUG")
project_issues.append(component)
for list_issues_s_item in list_issues_s:
project_issues.append(list_issues_s_item["val"])
project_issues.append(list_issues_s_item["count"])
project_measure_all.extend([tuple(measure)])
project_issues_all.extend([tuple(project_issues)])
print([tuple(measure)])
#print(project_issues_all)
filepath=time.strftime("%Y-%m-%d")
filename="jettech_sornar_"+filepath+"_projects.csv"
filename_isuess="jettech_sornar_"+filepath+"_projects_iseuss.csv"
if not os.path.exists(filepath):
os.makedirs(filepath)
if os.path.exists(filepath+"/"+filename):
os.remove(filepath+"/"+filename)
if os.path.exists(filepath+"/"+filename_isuess):
os.remove(filepath+"/"+filename_isuess)
csv_obj = CSV(filepath=filepath,filename=filename)
csv_obj_isuess = CSV(filepath=filepath,filename=filename_isuess)
csv_obj.csv_write(project_measure_all)
csv_obj_isuess.csv_write(project_issues_all)
csv_obj.csv_sort()
csv_obj.csv_insert()
csv_obj.csv_sum()
localdir=filepath
remoteip="192.168.1.99"
remotedir="/product/gohttpserver/data/sornar/"
scp_obj = SCP(localdir,remoteip,remotedir)
scp_obj.scp_operate()
csv_obj.csv_delete()
if __name__== "__main__" :
main()
来源:https://blog.csdn.net/Michaelwubo/article/details/130637317
0
投稿
猜你喜欢
- 对于一个设了自动增长标识的数据表来说,它的字段的值是由数据库自动设置的;这在导数据时很麻烦。 当我们导数据时,我们往往想想将标识字段的数据也
- 在实现贪吃蛇游戏时,首先需要使用python内置的turtle模块来实现创建游戏窗体与键盘按键的监听工作,然后使用freegames模块进行
- 由于javascript是一种无类型语言,所以一个数组的元素可以具有任意的数据类型,同一个数组的不同元素可以具有不同的类型,数组的元素设置可
- 概述gRPC 是谷歌开源的一个rpc(远程程序调用)框架,可以轻松实现跨语言,跨平台编程,其采用gRPC协议(基于HTTP2)。rpc:re
- 1.1.1 摘要 相信大家对于SQL Transcation再熟悉不过,它确保了数据库的数据一致性和安全性,尤其在对数据执行增删时,如果发生
- 我们的搜索示例仍然相当地简单,特别从数据验证方面来讲;我们仅仅只验证搜索关键值是否为空。 然后许多HTML表单包含着比检测值是否为空更为复杂
- <% String st = ""; for(int i = 1; i <= 9;
- 一、避免Firefox 背景图不显示的兼容问题,定义background 属性,先后顺序不能随意变动。background : backgr
- 解释机器学习模型是一个困难的过程,因为通常大多数模型都是一个黑匣子,我们不知道模型内部发生了什么。创建不同类型的可视化有助于理解模型是如何执
- 雪花算法是在一个项目体系中生成全局唯一ID标识的一种方式,偶然间看到了Python使用雪花算法不尽感叹真的是太便捷了。它生成的唯一ID的规则
- (function($) { (function($) { $.preload = function(data, cfg) { return
- 今天我们实现疲劳检测。 如果眼睛已经闭上了一段时间,我们会认为他们开始打瞌睡并发出警报来唤醒他们并引起他们的注意。我们测试一段视频来展示效果
- 昨天给公司服务器重做了一下系统,遇到Asp附件无法上传,之前服务器上使用好好的,怎么重做了就不正常了,于是一番google,baidu,下面
- Python获取时间范围内日期列表和周列表的函数 1、获取日期列表# -*- coding=utf-8 -*-import datetime
- 在进行网页抓取的时候,分析定位html节点是获取抓取信息的关键,目前我用的是lxml模块(用来分析XML文档结构的,当然也能分析html结构
- 一、简介Python 内置了 requests 模块,该模块主要用来发送 HTTP 请求,requests 模块比 urllib
- 多态问起面向对象的三大特性,几乎每个人都能对答如流:封装、继承、多态。今天我们就要来说一说 Python 中的多态。所谓多态:就是指一个类实
- 本文主要介绍了python opencv通过4坐标剪裁图片,分享给大家,具体如下:效果展示, 裁剪出的单词图像(如下)这里程序我是用在pad
- python使用函数改变list函数内改变外部的一个list如果这么写def rotate(nums, k): l
- 本文实例讲述了php实现的一段简单概率相关代码。分享给大家供大家参考,具体如下:<?phpfor($i=1;$i<100000;