找了很多Sonar的Python封裝,發現都不好用,是以自己做了小封裝。具體如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@File : sonar_snapshot.py
@Time : 2021/12/14 14:27:42
@Author : CrissChan
@Version : 1.0
@Site : https://blog.csdn.net/crisschan
@Desc : for the sonarqube's Measures
'''
# here put the import lib
import requests
from requests.models import HTTPBasicAuth
import json
class SonarSnapshot(object):
def __init__(self,usrname,pwd,sonar_uri) -> None:
super().__init__()
# self.usrname = usrname
# self.pwd = pwd
self.auth = HTTPBasicAuth(usrname,pwd)
self.sonar_uri = sonar_uri
# self.sonar_authon = self.sonar_uri+'/api/authentication/login'
def get_issues(self,componentskey,types='BUG,VULNERABILITY'):
'''
des 查詢指定項目的 issues
params:
componentskey:查詢的項目
types:CODE_SMELL,BUG,VULNERABILITY 一個或者多個,多個用英文都号分割。
'''
issue_url = self.sonar_uri+'/api/issues/search?componentKeys='+componentskey+'&types='+types
res = requests.get(issue_url,auth = self.auth)
res_json = json.loads(res.text)
page_size= res_json['paging']['pageSize']
total= res_json['paging']['total']
page_count = total/page_size+1
page_number = 0
issue_list=[]
while page_number<page_count:
purl = issue_url+'&p='+str(page_number+1)
res_issue = requests.get(purl,auth = self.auth)
# print(res_issue.text)
issue_list=issue_list+json.loads(res_issue.text)['issues']
page_number=page_number+1
return (issue_list)
# return res_json
def get_measures(self,componentskey,metirc_keys='alert_status,bugs,reliability_rating,vulnerabilities,security_rating,code_smells,sqale_rating,duplicated_lines_density,coverage,ncloc,ncloc_language_distribution,complexity'):
'''
des 查詢指定項目的metrics
params:
componentskey:查詢的項目
metirc_keys:度量結果
return:
項目目前的度量metrics,json格式
'''
measure_url = self.sonar_uri+'/api/measures/component?component='+componentskey+'&metricKeys='+metirc_keys
res = requests.get(measure_url,auth = self.auth)
res_json = json.loads(res.text)
return res_json
def get_projects(self):
'''
按照一頁100條的預設參數分頁
return 如下結構的list
{
"key": componentskey也是projectkey,
"name":項目名稱,
"qualifier":TRK - for projects;APP - for applications
"isFavorite": 是否收藏,
"analysisDate": 最近一次分析時間
"tags": [],
"visibility": "public",
"needIssueSync": false
'''
projects_url = self.sonar_uri+'/api/components/search_projects'
res = requests.get(projects_url,auth = self.auth)
res_json = json.loads(res.text)
page_size= res_json['paging']['pageSize']
total= res_json['paging']['total']
page_count = total/page_size+1
page_number = 0
project_list=[]
while page_number<page_count:
purl = projects_url+'?p='+str(page_number+1)
res_projects = requests.get(purl,auth = self.auth)
project_list=project_list+json.loads(res_projects.text)['components']
page_number=page_number+1
return (project_list)