你知道什么是SonarQube吗?

什么是快乐星球,什么是SonarQube?

一起来研究研究!

1.SonarQube简介

SonarQube是一款静态代码质量分析工具,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,而且可以集成在IDEA、Jenkins、GIt等服务中,方便随时查看代码质量分析报告。

SonarQube通过配置的代码分析规则,从可靠性、安全性、可维护性、覆盖率、重复率等方面分析项目,风险等级从A~E划分为5个等级,同时SonarQube可以集成pmd、findbugs、checkstyle等插件来扩展使用其他规则来检验代码质量;SonarQube还设置了质量阈,通过设置的质量阈评定此次提交分析的项目代码是否达到了规定要求。

2.为什么选择SonarQube

  • 更加优秀的图形化界面,基本上通过界面就可以对自己项目的代码状况一目了然
  • 可以查出其他软件难以定位到的问题:
    • 可能导致空指针异常的问题
    • 可能导致内存泄漏的问题,在try catch块中直接使用e.printStatckTrace()将堆栈信息打印到内存
    • 可能导致漏洞,成员变量使用public定义的
    • 流未关闭或是非常正常关闭都能够检测出来

3.代码质量问题

  • 没有代码标准,不遵循代码标准
    • SonarQube可以通过PMD,CheckStyle,FindBugs等代码规则检测工具规范代码编写。
  • 潜在的bug
    • SonarQube可以通过PMD,CheckStyle,FindBugs等代码规则检测工具检测出潜在的Bug
  • 糟糕的复杂度分布
    • 文件、类、方法等,如果复杂度过高将难以改变,这会使开发人员难以理解它们,且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。
  • 重复
    • 显然程序中包含大量复制粘贴的代码是质量低下的,SonarQube可以展示源码中重复严重的地方
  • 没有足够的或过多的注释
    • 没有注释的代码可读性差,特别是当不可避免的人员变动时,程序的可读性将大幅下降,而过多的注释又会使得开发人员将精力过多的花费在阅读注释上。
  • 缺乏单元测试
    • SonarQube可以很方便的统计并展示单元测试覆盖率
  • 糟糕的设计
    • 通过SonarQube可以找出循环,展示包与包。类与类之间的相互依赖关系
    • 可以检测自定义的架构规则
    • 通过SonarQube可以管理第三方的jar包
    • 可以利用LCOM4检测单个任务规则的应用情况
    • 检测耦合

注:PMD,CheckStyle,FindBug这些工具都叫静态代码分析工具。

静态代码分析:指无需运行被测代码,仅通过分析或检查源程序的语法,结构,接口等来检查程序的正确性,找出代码隐藏的错误或缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,空指针引用等。

4.SonarQube组成

SonarQube是一个代码质量检测工具,由一下4个部分组成:

  • 1个SonarQube服务器:包含三个子进程:
    • Web服务(管理界面):供开发人员,管理人员浏览高质量的快照并配置SonarQube实例
    • 搜索服务:基于ElasticSearch的Search Server从UI进行后退搜索
    • 计算引擎服务:负责处理代码分析报告并将其保存在SonarQube数据库中
  • 1个SonarQube数据库,配置SonarQube服务
    • SonarQube实例的配置(安全性,插件设置等)
    • 项目,视图等的质量快照
  • 多个SonarQube插件,可能包括语言,SCM,集成,身份验证和管理插件
  • 1个或多个SonarQube Scanners用于分析特定的项目,相当于客户端。

5.代码规则检测工具

  • PMD
    • 是一种静态代码分析工具,能够自动检测范围很广的潜在缺陷和不安全或费优化的代码。而其他工具(如:checkstyle)可以检查编码约定和标准,PMD更侧重于缺陷检测,它附带了丰富且高度可配置的规则集,可以轻松地配置给定项目应使用哪些确定规则。例如:
      • 捕捉异常而不做任何事情
      • 死循环代码
      • 太多复杂的方法
      • 直接使用实现而不是接口
      • 实现或重写了hashcode()没有实现或重写equals(Object object)方法
      • 返回对可变对象的引用可能会对外暴露内部实现
  • CheckStyle
    • 是一个开源工具,可以帮助实施编码标准和最佳实践,特别注重编码惯例
    • 虽然涵盖了一些静态代码分析功能(与PMD和FindBug的方式大致相同),但是我们将主要在CheckStyle检测和执行编码编写规范。
  • FindBug
    • 是Java的另一个静态分析工具,在某些方面类似与CheckStyle和PMD,但是具有不同的重点。
    • 它不关心格式化或编码标准,它的目标是检测潜在的错误和性能问题。它很擅长做这类检查,可以检测到许多常见但难以发现的错误。
    • 它能够以比较高的精度检测出与PMD或CheckStyle不同的问题,是一个有用的补充。

6.SonarQube工作流程

通过客户端插件分析源代码,SonarQube客户端可以采用IDEA插件、Sonar-Scanner插件、Ant插件和Maven插件方式,并通过各种不同的分析机制对项目源代码扫描和分析,并把扫描和分析后的结果上传到SonarQube的数据库,通过SonarQube web界面对分析结果进行管理。

7.SonarQube部署

1) 安装前准备:

环境要求:Centos7,JDK11(新版要求JDK11起步),PostgreSQL13(2019年4月10号,SonarQube发文称在7.9之后,所有的SonarQube的版本(CE、DE、EE和DCE)中将停止对MySQL的支持。)

  • 安装JDK11 yum install -y java-11-openjdk.x86_64
  • 安装 PostgreSQL13 官网安装教程(需要选对应的系统版本)
shell 复制代码
# Install the repository RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# Install PostgreSQL:
sudo yum install -y postgresql13-server

# Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-13/bin/postgresql-13-setup initdb
sudo systemctl enable postgresql-13
sudo systemctl start postgresql-13

# 创建用户和数据库 
# 1.使用postgres用户登录(PostgresSQL安装后会自动创建postgres用户,无密码)
su - postgres

# 2.登录postgresql
psql

# 3.创建用户和数据库并授权
create user sonar with password '123456';            // 创建用户 sonar
create database sonardb owner sonar;                 // 创建数据库 sonardb
grant all privileges on database sonardb to sonar;   // 授权

# 4.退出
\q

# 5.开启远程访问 退出psql用户 ctrl+d
vim /var/lib/pgsql/13/data/postgresql.conf
# 取消 listen_addresses = 'localhost' 这一行的注释(删掉前面的#号)
# 修改为listen_addresses = '*'

vim /var/lib/pgsql/13/data/pg_hba.conf

# 在 IPv4 local connections:下面新增一行内容如下:
host    all             all             0.0.0.0/0               md5

# 6.重启postgresql
systemctl restart postgresql-13.service

# 7.使用数据库连接工具测试连接即可
2) 安装SonarQube

下载SonarQube并解压

shell 复制代码
# 下载
yum install -y wget
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.9.6.zip
# 解压
yum install -y unzip
unzip sonarqube-7.9.6.zip

目录说明:

  • bin:sonarqube运行命令文件夹
  • conf:sonarqube配置文件夹
  • data:嵌入式数据库的数据(H2数据库引擎),建议只用于测试和演示
  • elasticsearch:搜索引擎
  • extensions:sonarqube的插件等存放文件夹
  • lib:sonarqube存放的运行库文件夹(jar)
  • logs:sonarqube日志文件夹
  • temp:sonarqube临时文件夹
  • web:sonarqube系统UI界面文件夹

修改配置

shell 复制代码
vim conf/sonar.properties

# 配置数据库用户名
sonar.jdbc.username=sonar
sonar.jdbc.password=123456

# 配置数据库地址
sonar.jdbc.url=jdbc:postgresql://localhost/sonardb?currentSchema=public

# 设置SonarQube服务
sonar.web.host=0.0.0.0
sonar.web.context=
sonar.web.port=9000

创建用户(因SonarQube中有ElasticSearch由于安全问题不能使用root用户启动)

shell 复制代码
# 创建用户
adduser sonar

# 将sonarqube-7.9.6用户所属变更为sonar用户
chown sonar:sonar -R sonarqube-7.9.6

# 将sonarqube-7.9.6移动到/usr/local目录下
mv sonarqube-7.9.6 /usr/local/

#切换用户
su - sonar

启动服务:

shell 复制代码
sh /usr/local/sonarqube-7.9.6/bin/linux-x86-64/sonar.sh start

启动报错:

[1] ElasticSearch的错误信息(ES因为需要大量的创建索引文件,需要大量的打开系统的文件,所以我们需要解除 linux系统当中打开文件最大数目的限制,不然ES启动就会报错)

解决办法:

shell 复制代码
vim /etc/security/limits.conf
# 增加如下内容:
*      soft             nofile          65536
*      hard             nofile          131072
*      soft             nproc           2048
*      hard             nproc           4096

[2] 最大虚拟内存太小,需要手动修改,每次手动都需要执行一下

shell 复制代码
vim /etc/sysctl.conf
# 追加以下内容
vm.max_map_count=262144

sysctl -p

退出,重新登录后启动服务

第一次启动服务会在数据库生成相关数据表

用浏览器访问:服务器IP:9000

账号密码默认都是admin

手动安装汉化插件

shell 复制代码
cd /usr/local/sonarqube-7.9.6/extensions/plugins
wget https://github.com/xuhuisheng/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-1.26/sonar-l10n-zh-plugin-1.26.jar

# 使用sonar用户重启SonarQube服务
sh /usr/local/sonarqube-7.9.6/bin/linux-x86-64/sonar.sh restart

汉化之后舒服多了

至此基本部署已完成。

SonarQube使用

登录web页面创建项目

创建令牌 创建之后记得保存令牌

执行maven 进行代码扫描与分析

查看分析扫描结果

IDEA安装插件 SonarLint

SonarLint是一个代码质量检测插件,可以帮助开发者检测代码中的一些问题

按图填写对应信息即可

点击执行按钮 会看到刺激的画面 全是错误

P3C代码检查工具安装:

P3C代码检查工具GitHub安装教程
https://github.com/alibaba/p3c/blob/master/idea-plugin/README_cn.md

完!

相关推荐
转码的小石8 分钟前
12/21java基础
java
李小白6616 分钟前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp29 分钟前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶1 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
n北斗1 小时前
常用类晨考day15
java
骇客野人1 小时前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言
yuanbenshidiaos2 小时前
c++---------数据类型
java·jvm·c++
向宇it2 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
cominglately2 小时前
centos单机部署seata
linux·运维·centos
魏 无羡2 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos