sonarqube简介+架构+搭建+不同语言详细用法

 

SonarQube

 

一,简介

 

Sonar 是一个很优秀的代码分析工具,可以帮助程序员们发现很多潜在的问题和BUG。

Sonar可以从以下七个维度检测代码质量

1. 不遵循代码标准

sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。

2. 潜在的缺陷

sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的缺陷。

3. 糟糕的复杂度分布

文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员 难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。

4. 重复

显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示 源码中重复严重的地方。

5. 注释不足或者过多

没有注释将使代码可读性变差,特别是当不可避免地出现人员变动 时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。

6. 缺乏单元测试

sonar可以很方便地统计并展示单元测试覆盖率。

7. 糟糕的设计

通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包

 

需要用到的软件有:SonarQube,Sonar-scanner。

SonarQube为代码检查的server,并提供可视化界面;

Sonar-scanner为client。用于收集检查数据并且发送到server中。也就是传统的C/S关系:

 

 

 

 

二,架构介绍

SonarQube平台主要由4个组件组成:

 


1). SonarQube服务器:
主要包括web服务器,基于ElasticSearch的搜索服务器,计算引擎服务器。
其中,web服务器,是供开发人员浏览查看代码分析结果,进行相应的配置等。

计算引擎服务器主要是处理代码分析报表并将其存储在数据库。
(2). SonarQube 数据库:
存储配置信息和代码分析报表。
(3). 多个Soanr插件:包括分析各种语言的插件。
(4). 多个Sonar Scanner,主要运行在开发人员的代码端,可以单独部署,也可以集成在Maven,Gradle等。

 

http://1.2.2.7:9009

用户:admin

密码:admin

 

三,安装

版本分析:

最新版本是8.3.1202004发布  已整合CI / CD

但是环境依赖比较高:要求 Java 11  且不支持mysql 管理配置元数据

综合考量,功能最大化,依赖Java 8,且支持mysql管理元数据的最后版本

故选择版本   7.8 20190619日发布

安装过程

  1. 安装Java jdk 1.8 (安装过程省略)
  2. 安装mysql 5.6.3 (安装过程省略)
  3. 安装maven 3.5.2 (安装过程省略)
  4. 安装sonarqube

<1>https://www.sonarqube.org/downloads/下载文件 解压安装文件

(1)unzip  sonarqube-7.8.zip

 

(2)在mysql中创建相关用户和密码

create  database     sonar_db ;

create user 'sonar_ntd'@'%' identified by 'ntd123';

grant all privileges  on sonar_db.*  to "sonar_ntd"@'%';

grant all privileges on sonar_db.* to 'sonar_ntd'@'localhost' identified by 'ntd123';

grant all privileges on sonar_db.* to 'sonar_ntd'@'master01' identified by 'ntd123';

 

<2>,修改配置文件  sonarqube-7.8/conf/sonar.properties

#web端口号 默认9000

sonar.web.port=9009

 

#元数据保存到mysql

sonar.jdbc.url=jdbc:mysql://1.2.2.7:3306/sonar_db?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

sonar.jdbc.username=sonar_ntd

sonar.jdbc.password=ntd123

sonar.sorceEncoding=UTF-8

sonar.login=admin

sonar.password=admin

 

#

sonar.search.javaAdditionalOpts=-Dbootstrap.system_call_filter=false  

 

<3>安装中文插件https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases下载 7.8 对应版本中文插件  sonar-l10n-zh-plugin-1.28.jar

放入 sonarqube-7.8/extensions/plugins 目录

<4>启动服务

/sonarqube-7.8/bin/linux-x86-64/sonar.sh  start

<5>安装扫描器(用于除Java,c++外的,比如 python php 等等其他语言)

https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/下载

解压 sonar-scanner-cli-4.2.0.1873-linux.zip

修改配置文件sonar-scanner-4.2.0.1873-linux/conf

sonar.host.url=http://1.2.2.7:9009

并加入环境变量

export SONAR_SCANNER_HOME=/home/software/sonar-scanner-4.2.0.1873-linux

export PATH=$PATH:$SONAR_SCANNER_HOME/bin

source  ~/.bashrc

四,整合maven的两种使用方式

1.直接命令行控制(以Java maven 项目为例)

创建一个项目

<1>,选择创建新项目,设置项目的创建标志以及显示信息点击完设置以后,会有页面创建令牌和配置当前项目的信息自动生成

窗体顶端

Analyze "sonarQubeTest": 323220150f0f09643e87ae705fa249c24f8db01f

 

窗体底端

此令牌用于执行分析时认证时使用,如果这个令牌存在问题,可以随时在你的用户账号下取消这个令牌。

<2>,分析你的项目(自动生成maven 命令)

选择语言: Java

选择构建框架:maven

会自动生成一下命令

mvn sonar:sonar \

  -Dsonar.projectKey=sonarQubeTest \

  -Dsonar.host.url=http://master01:9009 \

  -Dsonar.login=323220150f0f09643e87ae705fa249c24f8db01f

 

 

其中-Dsonar.projectKey表示的是项目的标识,-Dsonar.host.url表示的是sonar的 地址,-Dsonar.login=323220150f0f09643e87ae705fa249c24f8db01f设置的sonar的令牌信息

 

<3>,到项目目录执行maven 命令(上一步生成的)

Cd  项目目录,执行以下命令

mvn sonar:sonar \

  -Dsonar.projectKey=sonarQubeTest \

  -Dsonar.host.url=http://master01:9009 \

  -Dsonar.login=323220150f0f09643e87ae705fa249c24f8db01f \

  -Dsonar.java.binaries=target/sonar

 

 

注意:以上命令增加一行 -Dsonar.java.binaries=target/sonar 是指定sonar.java.binaries 项目的文件夹。否则会报错Please provide compiled classes of your project with sonar.java.binaries property

 

2.全局配置maven

<1>. 在Maven的全局配置文件: $MAVEN_PATH/conf/settings.xml (也可能是.m2/settings.xml )中添加如下内容:

<<settings>

    <pluginGroups>

        <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>

    </pluginGroups>

    <profiles>

        <profile>

            <id>sonar</id>

            <activation>

                <activeByDefault>true</activeByDefault>

            </activation>

            <properties>

                <sonar.host.url>

                  http://1.2.2.7:9009

                </sonar.host.url>

            </properties>

        </profile>

     </profiles>

</settings>

 

 

<2> .到Maven项目的根目录执行如下命令,即可使用SonarQube分析项目:

 

mvn sonar:sonar -Dsonar.java.binaries=target/sonar

 

五,其他语言scala ,python,php 或者一个项目使用多种语言时通过以下方式使用sonar-scanner

<1>在项目目录增加sonar-project.properties配置文件

sonar.projectKey=my:project

sonar.projectName=My project

sonar.projectVersion=1.0

sonar.projectDescription=test_project_description

sonar.sources=.

sonar.sourceEncoding=UTF-8

sonar.java.binaries=./target/sonar

sonar.projectKey在给定的SonarQube实例中必须是唯一的

sonar.projectName和sonar.projectVersion这是SonarQube用户界面中显示的名称和版本。在SonarQube 6.1之前是强制性的。

sonar.projectDescription   项目描述

sonar.sources 是源代码目录

sonar.sourceEncoding源代码的编码。默认为默认系统编码

sonar.java.binaries分析的classes文件路径

<2>在项目目录执行一下命令

sonar-scanner

 

sonar-project.properties 各项参数说明

制参数

服务器

描述

默认

sonar.host.url

服务器URL

http://本地主机:9000

项目配置

描述

默认

sonar.projectKey

项目的唯一密钥。允许的字符是:字母,数字-,_,.和:,与至少一个非数字字符。

对于Maven项目,默认为 <groupId>:<artifactId>

 

可选参数

项目身份

描述

默认

sonar.projectName

将在Web界面上显示的项目的名称。

<name>对于Maven项目,否则为项目密钥。如果未提供并且数据库中已经有名称,则不会覆盖该名称

sonar.projectVersion

项目版本。

<version> 用于Maven项目,否则“不提供”

认证方式

如果“任何人”伪组没有执行分析的权限,则需要向用户提供具有“执行分析”权限的凭据才能在其下运行分析。

描述

默认

sonar.login

具有对项目执行执行分析权限的SonarQube用户的登录或身份验证令牌。

 

sonar.password

sonar.login用户名附带的密码。如果正在使用身份验证令牌,则应将其留为空白。

 

网页服务

描述

默认

sonar.ws.timeout

等待Web服务调用响应的最长时间(以秒为单位)。仅当您在等待服务器响应Web Service调用的分析过程中遇到超时时,从默认值修改此值才有用。

60

项目配置

描述

默认

sonar.projectDescription

项目说明。

<description> 用于Maven项目

sonar.links.homepage

项目主页。

<url> 用于Maven项目

sonar.links.ci

持续集成。

<ciManagement><url> 用于Maven项目

sonar.links.issue

问题追踪器。

<issueManagement><url> 用于Maven项目

sonar.links.scm

项目源存储库。

<scm><url> 用于Maven项目

sonar.sources

包含主源文件的目录的逗号分隔路径。

从Maven,Gradle,MSBuild项目的构建系统中读取。如果sonar.sources未sonar.tests提供,则默认为项目基本目录。

sonar.tests

包含测试源文件的目录的逗号分隔路径。

从Maven,Gradle,MSBuild项目的构建系统中读取。其他默认为空。

sonar.sourceEncoding

源文件的编码。例如:UTF-8,MacRoman,Shift_JIS。该属性可以用project.build.sourceEncodingMaven项目中的标准属性替换。可用编码的列表取决于您的JVM。

系统编码

sonar.externalIssuesReportPaths

通用问题报告路径的路径,以逗号分隔。

 

sonar.projectDate

为分析分配日期。仅当需要追溯创建未分析之前的项目的历史记录时,此参数才有用。格式为yyyy-MM-dd,例如:2010-12-01。由于您无法执行分析日期早于数据库中最新日期的分析,因此您必须按时间顺序(最早的顺序)进行分析以重新创建项目历史。注意:如果您想创建长期运行的历史记录,则可能需要调整客房清洁设置。

当前的日期

sonar.projectBaseDir

当您需要在不是从其启动目录的目录中进行分析时,请使用此属性。EG分析从开始,jenkins/jobs/myjob/workspace但是要分析的文件在中ftpdrop/cobol/project1。该路径可以是相对的或绝对的。不指定源目录,而是指定源目录的某些父目录。此处指定的值将成为新的“分析目录”,然后指定其他路径,就像分析是从指定的值开始的sonar.projectBaseDir。请注意,分析过程将需要在此目录中具有写权限。这是sonar.working.directory创建的地方。

 

sonar.working.directory

为使用SonarScanner或SonarScanner for Ant(版本大于2.0)触发的分析设置工作目录。此属性与SonarScanner for MSBuild不兼容。路径必须是相对的,并且对于每个项目都是唯一的。当心:每次分析之前,指定的文件夹都将被删除。

.scannerwork

sonar.scm.provider

此属性可用于明确告知SonarQube应该使用哪个SCM插件来获取项目上的SCM数据(以防自动检测无法正常工作)。此属性的值始终为小写,并且取决于插件(例如TFVC插件的“ tfvc”)。查看每个插件的文档页面以获取更多信息。

 

sonar.scm.forceReloadAll

默认情况下,仅针对更改的文件检索非常规信息。将此属性设置true为加载所有文件的责任信息。如果您认为某些SCM数据已过时,但SonarQube无法从SCM引擎获取最新信息,则此功能很有用。

 

sonar.scm.exclusions.disabled

对于受支持的引擎,SCM忽略的文件(即中列出的文件).gitignore也将被分析自动忽略。将此属性设置true为禁用该功能。

 

sonar.scm.revision

覆盖修订,例如分析结果中显示的Git sha1。默认情况下,此值由CI环境提供或由检出源猜测。

 

sonar.buildString

通过此属性传递的字符串将与分析一起存储,并在的结果中可用api/project_analyses/search,因此使您以后可以标识特定的分析并获取其ID以便与结合使用api/project_analyses/set_baseline。

 

sonar.analysis.[yourKey]

此属性存根允许您将自定义键/值对插入到分析上下文中,这还将传递给webhooks

 

重复项

描述

默认

sonar.cpd.${language}.minimumtokens

只要一行sonar.cpd.${language}.minimumTokens中至少有10个代码行(覆盖)中至少有100个重复的令牌(用覆盖),就认为该代码是重复的sonar.cpd.${language}.minimumLines。对于Java项目,如果一行中至少有10条语句,而不论标记和行的数量如何,则一段代码被视为重复。此阈值不能被覆盖。

100

sonar.cpd.${language}.minimumLines

(往上看)

10

分析记录

描述

默认

sonar.log.level

控制分析期间生成的日志的数量/级别。DEBUG:INFO在DEBUG级别上显示日志和更多详细信息。类似于sonar.verbose=true。TRACE:显示DEBUG日志以及SonarScanner执行的所有ElasticSearch查询和Web API调用的时间。

INFO

sonar.verbose

向客户端和服务器端分析日志添加更多详细信息。激活DEBUG扫描仪的模式,并将客户端环境变量和系统属性添加到分析报告处理的服务器端日志中。注意:如果此设置存储为服务器端环境变量,则此设置可能会公开敏感信息,例如密码。

sonar.scanner.dumpToFile

将传递给扫描仪API的属性的完整列表输出到指定文件,以调试分析。

 

sonar.scanner.metadataFilePath

设置扫描仪写入report-task.txt文件的位置,其中包含ceTaskId。

的价值 

sonar.working.directory

 

 

 

 

 

 

六,idea结合sonarLint进行的代码分析

idea结合sonar的话,可以下载sonarLint插件,操作步骤如下:

  1. 进入idea ,进入插件安装,在插件市场中搜索sonarLint,点击进行安装后重启idea;
  2. 配置sonarLint插件,设置settings中,查找到other settings,然后选择sonarLint General Setting ,在右侧的输入
  3. 接下来输入要连接的服务器的登录信息,如输入token或者是使用账号和密码的方式
  4. 配置当前的项目和sonar的关系,点击进入设置settings->other settings->SonarLint Project Settings
  5. Bind to Server 选择刚才配置的服务器信息。SonarQube project的选择可以点击Search in list查看sonar仓库中配置的项目信息,完成选择以后点击ok即可
  6. 代码分析,可以查看到当前的窗口中多了一个SonarLint的窗口(如无此窗口,可以点击view菜单进行查找),在其中选择report,点击文件夹图标,会弹窗提示,点击process之后即可进行项目分析。

 

 

 

 

  • 单元测试数,单元测试覆盖率指标生成使用方法。

总体思路:使用mvn生成测试报告,使用 sonar-scanner 将测试报告传到 SonarQube服务

 

<1> Java maven 项目

1,maven Java项目,pom文件增加以下依赖

            <plugin>

                <groupId>org.jacoco</groupId>

                <artifactId>jacoco-maven-plugin</artifactId>

                <version>0.7.8</version>

                <executions>

                    <execution>

                        <goals>

                            <goal>prepare-agent</goal>

                            <goal>report</goal>

                        </goals>

                    </execution>

                </executions>

            </plugin>

 

  1. 项目中增加对应方法的单元测试方法

   采用junit测试

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
</dependency>

 

举例

 

3,执行以下maven命令

mvn  test  org.jacoco:jacoco-maven-plugin:prepare-agent  sonar:sonar

 

<2> scala maven 项目

 

  1. maven 项目,pom文件增加以下依赖

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.8</version>
<configuration>
        <!--指定生成 .exec 文件的存放位置-->
    <destFile>target/coverage-reports/jacoco-unit.exec</destFile>
    <!--Jacoco 是根据 .exec 文件生成最终的报告,所以需指定 .exec 的存放路径-->
    <dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
</configuration>
    <executions>
        <execution>
            <id>jacoco-initialize</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>jacoco-site</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

 

 

  1. 项目中增加对应方法的单元测试方法

   采用junit测试

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
</dependency>

举例

 

  1. 执行以下命令
  1. 在项目所在目录,执行以下命令,生成测试报告

Mvn   test

 

  1. 在项目所在目录,增加以下配置文件sonar-project.properties

sonar.projectKey=scalatest:scalatest01

sonar.projectName=scalatest01

sonar.projectVersion=1.0

sonar.sources=.

sonar.sourceEncoding=UTF-8

sonar.projectDescription=123456789beizhu

sonar.links.homepage=www.baidu.com

sonar.scala.coverage.reportPaths=./target/site/jacoco/jacoco.xml

备注:主要增加配置项sonar.scala.coverage.reportPaths=./target/site/jacoco/jacoco.xml  

指定测试xml报告所在目录

  1. 在项目所在目录,执行以下命令

sonar-scanner

备注:本次扫描会把 mvn test命令在项目目录下target目录生成的 css,html,xml等代码全部当成项目代码参与扫描。

 

 

 

 

 

 

  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值