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 docker compose 部署 sonarqube idea_maven

 

 

二,架构介绍

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

sonarqube docker compose 部署 sonarqube idea_Java_02

 

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

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

 

http://1.2.2.7:9009

用户:admin

密码:admin

 

三,安装

版本分析:

最新版本是8.3.1(202004发布)  已整合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

 

 

 

 

 

六,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. 执行以下命令
  2. 在项目所在目录,执行以下命令,生成测试报告

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等代码全部当成项目代码参与扫描。