sorna python3 调用,python 获取sonarqube数据

这篇具有很好参考价值的文章主要介绍了sorna python3 调用,python 获取sonarqube数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.sonarqube是一款代码分析的工具,通过soanrScanner扫描后的数据传递给sonarqube进行分析
2.sonarqube社区版没有对c++类代码的分析,但是可以找到一个开源的包,安装即可,扫描的话可以使用cppcheck来进行扫描

  1. 安装python对于sonarqube的api包:python-sonarqube-api
  2. 建立sonarqube连接

from sonarqube import SonarQubeClient

sonar = SonarQubeClient(
    sonarqube_url="http://192.168.xx.xx:9000",
    username='admin',
    password='admin'
)
 

 文章来源地址https://www.toymoban.com/news/detail-440466.html

  1. 使用:建议大家先参考sonarqube的python-api
  2. Welcome to SonarQube Client with Python’s documentation! — SonarQube Client with Python 1.3.5 documentation
  1. 使用示例
    # 通过项目名称获取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"))
    
  1. 通过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()

到了这里,关于sorna python3 调用,python 获取sonarqube数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用 Python3 获取网页源代码

            爬虫的数据爬取量非常大,显然不可能对每个页面都手动复制源代码,因此就有必要使用自动化的方式来获取网页源代码。requests是Python的一个第三方HTTP(Hypertext Transfer Protocol,超文本传输协议)库,它比Python自带的网络库urllib更加简单、方便和人性化。使用re

    2023年04月16日
    浏览(52)
  • Python3: 扫描库文件并获取版本号信息

    在 C/C++ 开发中使用了第三方库,具体说是 .a , .lib , .dll 等文件,想通过 Python 查询出这些文件中的版本号信息。 有人可能好奇,这里简单消除可能得疑虑: 为什么不用源代码,而用库? 因为库文件提供了良好的 隔离性 ,避免了繁杂的编译选项指定, 避免了潜在的不小心改

    2024年02月05日
    浏览(82)
  • Python3 获取当前服务器公网 IP 地址

    有同学问我如何使用 Python 获取服务器公网的 IP 地址呢?我测试几个发现,方法有很多,好用的就发现一种,即直接使用 Python 自带的 socket 包。 代码示例: 这样就能实现 Python 获取当前服务器公网的 IP 地址了。

    2024年02月06日
    浏览(57)
  • python3写一个http接口服务(get, post),给别人调用6

    近年来异步web服务器比较火热,例如falcon/bottle/sanic/aiohttp,今天也来玩玩sanic。 Sanic是一个支持Python 3.7+的web服务器和web框架,速度很快。它允许使用Python 3.5中添加的async/await语法,无阻塞且快。 Sanic也符合ASGI,目标是提供一种简单的方法来建立和运行一个高性能的HTTP服务器

    2024年02月15日
    浏览(45)
  • 可测含多进程的app-- python调用adb命令获取Android App应用的性能数据:CPU、GPU、内存、电池、耗电量(含python源码)

    python脚本通过os.popen()方法运行adb命令,获取性能数据,将性能数据保存在csv文件并算出均值、最大值、最小值。 本脚本可测试一个app包含多个进程的场景,可以获取 每个进程的性能数据 。 2.1 软件环境 具备python环境,Android环境 需要python库:os, csv, time, datetime, sys,time,panda

    2024年02月13日
    浏览(42)
  • python中使用websocket调用、获取、保存大模型API

    笔者最近在测试星火大模型的时候,他们是使用websocket 来建立对话,而且星火大模型开放的测试代码,质量上不咋地(20231030记录),还需要对websocket有一定的了解,才适合自己微调。 安装: 参考【python: websocket获取实时数据的几种常见链接方式】常见的两种。 需要pip ins

    2024年02月02日
    浏览(37)
  • 【笔记】Python3|爬虫请求 CSRF-Token 时如何获取Token、Token过期、处理 CSRF-Token 需要注意的问题及示例

      CSRF-Token 机制是 Web 应用程序中常用的安全机制,它可以防止跨站请求伪造攻击,但会给爬虫造成一定的困扰。本文将介绍在使用 Python3 爬虫时, 处理 CSRF-Token 机制需要注意的问题及示例 。   在 Web 开发中,每次发送请求时,服务器都会生成一个 CSRF-Token。当用户访问

    2024年02月04日
    浏览(102)
  • 【Python】Python系列教程-- Python3 数据类型转换(六)

    往期回顾: Python系列教程–Python3介绍(一) Python系列教程–Python3 环境搭建(二) Python系列教程–Python3 VScode(三) Python系列教程–Python3 基础语法(四) Python系列教程–Python3 基本数据类型(五) 有时候,我们需要对数据内置的类型进行转换,数据类型的转换,一般情况

    2024年02月08日
    浏览(58)
  • Android网络编程,调用API获取网络数据

    实现步骤: 阅读API接口使用文档 使用okhttp 获取网络数据 使用 gson将json数据转为数据实体类 安装GsonFormatPlus插件 使用glide加载网络图片 build.gradle下导入相关依赖 AndroidManifest.xml 加入网络权限和 application节点下设置 注意事项:在手机高版本中,需要在application节点下设置 and

    2024年02月05日
    浏览(39)
  • Python3数据科学包系列(三):数据分析实战

    Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 国庆中秋宅家自省: Python在Excel中绘图

    2024年02月07日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包