SonarQube静态代码分析实战

Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量,可以通过使用插件机制与 eclipse 和 JIRA 等其他外部工具集成,从而实现了对代码的质量的全面自动化分析和管理。支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等二十几种编程语言的代码质量管理与检测。
官网:https://www.sonarqube.org
sonarQube可以从如下几个方面分析代码中的问题:
1.复杂度分布
文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们
2.代码重复
sonar可以展示源码中重复严重的地方
3.单元测试覆盖率
sonar可以很方便地统计并展示单元测试覆盖率
4.代码标准
sonar可以通过PMD,CheckStyle,Findbugs等代码规则检测工具规范代码编写
5.代码注释
没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷
6.潜在的bug
sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的bug
7.糟糕的设计
通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系;可以检测自定义的架构规则;通过sonar可以管理第三方的jar包;可以利用LCOM4检测单个任务规则的应用情况;检测耦合度

1.配置数据

新建数据库和访问用户(最低MySQL版本5.6)

CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; 
CREATE USER 'sonar' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
FLUSH PRIVILEGES;

2.安装sonarqube

下载最新版本sonarqube,这里下载的是sonarqube-6.3(jdk要求1.8)
1.配置mysql数据库

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://10.1.199.168:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
# 连接池根据自己实际情况配置
sonar.jdbc.maxActive=30
sonar.jdbc.maxIdle=5
sonar.jdbc.minIdle=2
sonar.jdbc.maxWait=5000
sonar.jdbc.minEvictableIdleTimeMillis=600000
sonar.jdbc.timeBetweenEvictionRunsMillis=30000

2.web server配置

#jvm配置
sonar.web.javaOpts=-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError
#绑定主机ip配置
sonar.web.host=0.0.0.0
#访问端口配置
sonar.web.port=9000
#连接配置
sonar.web.http.maxThreads=50
sonar.web.http.minThreads=5
sonar.web.http.acceptCount=25
#session超时配置,单位分钟,不能多于3个月
sonar.web.sessionTimeoutInMinutes=4320
#也可以配置sso

3.计算引擎配置
任务处理

#jvm配置
sonar.ce.javaOpts=-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError
#worker个数,需要考虑资源的消耗
sonar.ce.workerCount=1

4.Elasticsearch配置
用于信息检索

#jvm
sonar.search.javaOpts=-Xmx1G -Xms256m -Xss256k -Djna.nosys=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly XX:+HeapDumpOnOutOfMemoryError
#http port and host
sonar.search.port=9001
sonar.search.host=127.0.0.1

还是有就是一些日志和数据目录配置,jvm需要根据自己的内存情况调整。
5.启动服务
sonarqube-6.3/bin/linux-x86-64/sonar.sh start
通过9000端口访问:http://192.168.145.134:9000,登录默认用户密码: admin/admin
注意:配置max file descriptors

vi  /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536

6.汉化
进入Administration模块,System->Update Center切换到Available,搜索Chinese Pack,安装(需要从下载汉化jar)即可汉化。如果直接无法安装,可以下载下来放在extensions/plugins目录下重启即可
web主页

3.代码分析

当使用 SonarQube对某一个项目进行代码质量管理时,通常可以采用三种不同的方法来发起代码分析,分别为 Analyzing with SonarQube Runner,Analyzing with SonarQube Ant Task 和 Analyzing with Maven 方法。这三种方法的主要区别是 , 它们分别适用于不同架构和组织形式的项目,并且其相应的配置文件的写法也不尽相同。下面主要说一下Analyzing with SonarQube Runner和Analyzing with Maven

1.Analyzing with SonarQube Runner

该方法适用于所有不同架构的项目,包括没有使用任何源代码管理工具的项目形式,以及使用各种不同代码管理工具(SVN、Git、ClearCase 等)和编译工具(ant,maven)的项目形式,它都能够适用。
下载工具并配置:https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
下载安装后,将bin配置到系统的环境变量里去。
1.配置sonar-scanner

#----- Default SonarQube server
sonar.host.url=http://192.168.145.134:9000
#----- Default source code encoding
sonar.sourceEncoding=UTF-8

2.在项目工程下新建sonar-project.properties配置文件

# must be unique in a given SonarQube instance
sonar.projectKey=demo:project
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=testDemo
sonar.projectVersion=1.0
# project description 
sonar.projectDescription=test demo
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# Since SonarQube 4.2, this property is optional if sonar.modules is set. 
# If not set, SonarQube starts looking for source code from the directory containing 
# the sonar-project.properties file. multiple comma separated
sonar.sources=.
sonar.language=java
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
#additional parameters
sonar.my.property=zhutw

切换到项目主目录下命令行运行:sonar-runner,即可完成代码扫描
如果项目包含多个模块,则该配置文件应如下图所示配置:
这里写图片描述

2.Analyzing with Maven

通过mvn sonar:sonar分析代码将结果提交到数据库中,SonarQube查询展示。
安装并配置 Maven,配置文件为 setting.xml,添加数据配置

<profiles>
    <profile>
        <id>sonar</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <sonar.jdbc.url><sonar.jdbc.url>jdbc:mysql://10.1.199.168:3306/sonar?useUnicode=true&amp;characterEncoding=utf8</sonar.jdbc.url></sonar.jdbc.url>   <sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver>
            <sonar.jdbc.username>sonar</sonar.jdbc.username>
            <sonar.jdbc.password>sonar</sonar.jdbc.password>
<sonar.host.url>http://192.168.145.134:9000</sonar.host.url> 
    <!-- Sonar服务器访问地址 -->
        </properties>
  </profiles>
  <activeProfiles>  
    <activeProfile>sonar</activeProfile>
  </activeProfiles>

在当前maven项目目录下运行mvn sonar:sonar,完成即可在SonarQube web页面查看结果:
这里写图片描述
注:
1.可以在项目pom.xml显式指定sonar插件的版本以及MySQL的驱动版本

<plugin>
     <groupId>org.codehaus.sonar</groupId>
    <artifactId>sonar-maven-plugin</artifactId>       
    <version>5.1</version>
</plugin>
----------
<build>
    <extensions>
        <extension>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-Java</artifactId>
            <version>5.1.24</version>
        </extension>
    </extensions>
</build>

2.也可以显式的将sonar绑定到Maven生命周期中,指定Maven的site声明周期时,则会自动调用sonar.sonar 命令

<plugin>
    <groupId>org.codehaus.sonar</groupId>
    <artifactId>sonar-maven-plugin</artifactId>
    <version>5.1</version>
    <executions>
        <execution>
            <id>sonar</id>
            <phase>site</phase>
            <goals>
                <goal>sonar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

注意sonar:sonar必须单独执行。如果把sonar:sonar和其他target混在一起,比如mvn clean install sonar:sonar,可能导致不可预期的问题。

4.集成Jenkins

1.安装Jenkins插件SonarQube Scanner for Jenkins
2.配置SonarQube
打开系统管理->系统设置
这里写图片描述
打开系统管理->Global Tool Configuration
配置好jdk,maven,配置SonarQube Scanner
这里写图片描述
3.新建工程配置
这里写图片描述
这里写图片描述
注:
也可以使用上面的maven分析的方式进行集成。除此之外Analyzing with SonarQube Scanner for MSBuild插件分析,用法和SonarQube Scanner类似。
参考文档:
1.SonarQube 3.6 代码质量管理实战
2.SonarQube中监测循环、包耦合度情况

猜你喜欢

转载自blog.csdn.net/tianwei7518/article/details/69055077
今日推荐