一、Sonar的作用

Sonar是一个用于代码质量检查的开源工具,采用B/S架构,帮助检查代码缺陷,改善代码质量,提高开发速度。可以从七个维度检查代码质量:

  • 复杂度分布(complexity):代码复杂度过高将难以理解;
  • 重复代码(duplications):程序汇总包含大量复制、粘贴的代码导致代码臃肿,sonar可以展示源码中重复严重的地方;
  • 单元测试统计(unit tests):统计并展示单元测试覆盖率,开发或者测试可以清楚测试代码的覆盖情况;
  • 代码规则检查(coding rules):通过Findbugs,PMD,CheckStyle等检查代码是否符合规范;
  • 注释率(comments):若代码注释过少,特别是人员变动后,其他人接收比较难;若注释过多,又不利于阅读;
  • 潜在的Bug(potential bugs):通过Findbugs,PMD,CheckStyle等检测潜在的bug;
  • 结构与设计(architecture & design):找出循环、展示包与包、类与类之间的依赖、检查程序之间的耦合度;

Sonar通过插件形式,可以支持Java、C/C++、JavaScripts等等二十几种语言的代码质量管理和检测。

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

二、SonarQube平台的组成

SonarQube平台由4个组件组成。

1、SonarQube Server,启动3个主要程序:

  • Web Server,供开发、管理人员浏览高质量的快照并配置SonarQube实例;
  • SearchServer based on Elasticsearch,执行来自页面的查询请求;
  • Compute EngineServer,处理代码分析报告并将其保存在SonarQube数据库中;

2、一个用来存储的SonarQube数据库:

  • SonarQube实例的配置(安全性,插件设置等);
  • 项目,视图等的质量快照;

3、SonarQube插件

  • 服务器上安装了多个SonarQube插接,可能包括language, SCM, integration, authentication, and governance 插件;

4、在构建/持续集成服务器上运行一个或多个SonarScanner,以分析项目;

三、环境

1、服务器列表
服务器IP系统安装组件
192.168.0.111CentOS7.6Jenkins-2.213,sonarqube-8.3.1.34397,sonar-scanner-cli-4.3.0.2102
192.168.0.123CentOS7.6Gitlab
192.168.0.125CentOS7.6PosterSQL

Jenkins和Gitlab这边不再赘述安装过程。

2、安装包
  • sonarqube安装包:https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.3.1.34397.zip
  • cli安装包:https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.3.0.2102-linux.zip

下载好安装包之后,上传至服务器中。

我这边也是将这两个安装包上传到了百度云上。

3、JDK和数据库版本要求

这里需要特别说明一下,每个版本sonarqube的官方介绍说明还是要好好看一下的。不同版本的sonarqube所支持的JDK和数据库也不同。

7.9版本开始的变化非常大:

  • 不再支持MySQL数据库
  • JDK的最低要求为11

官网查看一下,其实已经写的很清楚了:
在这里插入图片描述

所以这里选择用PosterSQL 12作为数据库,详细安装步骤在后续的步骤中。

由于之前安装Jenkins时用的JDK8,所以还需要安装一个JDK11,但是不用去修改环境变量,等等修改sonarqube的配置文件制定JDK的目录即可。

四、安装PostgreSQL

PostgreSQL的安装,其实已经在之前的PostgreSQL-12安装和简单操作中讲的很详细了,有需要的可以移步过去,但是为了方便,我还是把安装的这一部分给拷贝过来吧。

1、安装
# 添加yum源
$ yum -y install https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 安装PostgreSQL
$ yum -y install postgresql12 postgresql12-server postgresql12-contrib

# 检查版本信息
$ psql --version
psql (PostgreSQL) 12.3
2、初始化数据库

这里需要注意一下,初始化的时候可以指定postgresql的数据目录哦!

1)使用默认数据目录

yum安装的postgresql的默认数据目录为/var/lib/pgsql/12/data,直接初始化就行

/usr/pgsql-12/bin/postgresql-12-setup initdb

2)使用自己规划好的数据目录

如果已经规划好别的数据目录,可以在初始化的时候用-D参数指定数据目录。

# 新建数据目录
mkdir -p /data/postgresql/data

# 授权
chown -R postgres:postgres /data/postgresql/data

# 切换到postgres用户,初始化
$ su - postgres
-bash-4.2$ /usr/pgsql-12/bin/initdb -D /data/postgresql/data

# 修改postgresql的system.service文件
vim /usr/lib/systemd/system/postgresql-12.service
Environment=PGDATA=/data/postgresql/data/

# 重新加载系统服务
systemctl daemon-reload
3、修改访问权限

要允许远程登录,需要修改配置文件中的监听ip和认证方式。

vim postgresql.conf

# 修改监听的ip和端口
listen_addresses = '*' 


vim pg_hba.conf

#新增下面一行
host all all 0.0.0.0/0 password

4、启动 postgresql 服务
systemctl enable postgresql-12
systemctl start postgresql-12
systemctl status postgresql-12

postgresql会自动完成以下操作:

  • 自动生成一个linux系统用户postgres:管理数据库的系统用户

  • 数据库用户postgres:数据库超级管理员

  • 此用户的默认数据库为postgres

  • 可有修改下默认postgres数据库用户的密码:

    $ su - postgres    
    -bash-4.2$ psql 
    psql (12.3)
    Type "help" for help.
    
    postgres=# alter role postgres with password '123456';
    ALTER ROLE
    
5、创建sonarqube数据库并授权
$ su - postgres
-bash-4.2$ psql 

# 建立新的数据库用户sonar
create user sonar with password 'sonar';

# 为新用户建立数据库
create database sonarqube owner sonar;

# 把新建的数据库权限赋予新用户
grant all privileges on database sonarqube to sonar;

五、安装SonarQube

以下操作将在192.168.0.111上执行。

1、修改系统配置参数

在linux系统中,必须保证以下要求:

  • vm.max_map_count 大于或等于262144
  • fs.file-max 大于或等于65536
  • 运行SonarQube的用户可以打开至少65536个文件描述符
  • 运行SonarQube的用户可以打开至少4096个线程

按要求修改:

vim /etc/sysctl.conf

#修改下面两个参数
vm.max_map_count=262144
fs.file-max=65536


vim /etc/security/limits.conf

#增加下面两行
sonar   -   nofile   65536
sonar   -   nproc    4096

#使生效
$ sysctl -p
2、新建普通用户sonar

因为sonar里面包含了elasticsearch,所以安装的时候需要用普通用户,不然会报错can not run elasticsearch as root。所以这里新建一个普通用户sonar。

$ useradd sonar
$ passwd sonar

赋予sonar用户sudo权限

$ visudo
#增加下面这行
sonar   ALL=(ALL)       ALL
3、解压

以下操作在刚刚创建的普通用户sonar下进行。

$ cd /home/sonar
$ unzip sonarqube-8.3.1.34397.zip 
$ mv sonarqube-8.3.1.34397 sonarqube
4、修改sonarqube配置文件

以下操作在刚刚创建的普通用户sonar下进行。

1)修改数据库连接信息

vim /home/sonar/sonarqube/conf/sonar.properties

#修改sonarqube的数据库连接
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:postgresql://192.168.0.125/sonarqube


#修改持久数据文件(嵌入式数据库和搜索索引)和临时文件路径。可以是绝对路径,也可以是相对路径。默认是相对路径的data和temp。
#我这里用的是默认的目录,实际应用中,最好是在较大的分区中新建一个目录来存放这些数据。提醒一下,新建好目录之后,需要给sonar用户授权
sonar.path.data=data
sonar.path.temp=temp

2)修改使用的jdk

vim /home/sonar/sonarqube/conf/wrapper.conf

#修改wrappe.conf使用jdk11
wrapper.java.command=/usr/local/jdk-11.0.7/bin/java
5、新增sonar的systmed服务
cat > /etc/systemd/system/sonarqube.service << EOF
[Unit]
Description=SonarQube service
After=syslog.target network.target

[Service]
Type=forking
User=sonar
Group=sonar
PermissionsStartOnly=true
ExecStart=/home/sonar/sonarqube/bin/linux-x86-64/sonar.sh start
ExecStop=/home/sonar/sonarqube/bin/linux-x86-64/sonar.sh stop
StandardOutput=syslog
LimitNOFILE=65536
LimitNPROC=8192
TimeoutStartSec=5
Restart=always

[Install]
WantedBy=multi-user.target
EOF
6、启动sonarqube
systemctl daemon-reload
systemctl enable sonarqube
systemctl start sonarqube
systemctl status sonarqube

启动之后,用浏览器访问192.168.0.111:9000
在这里插入图片描述

点击右上角的login,默认用户名密码为admin/admin。
在这里插入图片描述

六、sonar-scanner安装

$ cd /home/sonar
$ unzip sonar-scanner-cli-4.3.0.2102-linux.zip
$ mv sonar-scanner-4.3.0.2102-linux sonar-scanner

修改sonar-scanner配置文件

vim /home/sonar/sonar-scanner/conf/sonar-scanner.properties

sonar.host.url=http://localhost:9000
sonar.sourceEncoding=UTF-8

七、配置环境变量

切回到root用户进行添加。

$vim /etc/profile

#set sonar-quebe and sonar_runner_home
export SONAR_HOME=/home/sonar/sonarqube
export SONAR_RUNNER_HOME=/home/sonar/sonar-scanner
export PATH=$PATH:$SONAR_HOME/bin/linux-x86-64:$SONAR_RUNNER_HOME/bin

#使配置生效
$ source /etc/profile

八、安装插件

这里主要安装一个中文插件,安装的方法也很简单,直接在页面上操作就行。

点击Administration–>Marketplace,然后在Plugins的搜索框中输入chinese进行搜索,然后点击Install进行安装。
在这里插入图片描述
安装完成之后,会提醒重启服务
在这里插入图片描述
点击Restart Server进行服务重启。重启完之后,刷新一下浏览器,发现已经变成中文了。
在这里插入图片描述

九、Jenkins构建

1、首先在Jenkins中安装对应的插件
在这里插入图片描述

2、添加用户

在配置之前,需要在sonar的web中添加一个连接用户。
在这里插入图片描述
这里创建了一个名为testuser的用户,把秘钥复制下来。然后来到Jenkins中的系统管理–>系统配置,在SonarQube servers这一栏中填入相关参数:
在这里插入图片描述

最后的token那里是点击右边的添加进行添加的,创建一个全局凭证,类型选择Secret text,并在Secret中填入刚才生成的令牌。如下:
在这里插入图片描述
注意,这里的Server URL,应该填写部署sonar的主机ip,不能写成localhost,因为在jenkins的web中点击soanr的时候会进行跳转。

3、添加工具

在Jenkins的系统管理–>全局工具配置中,添加sonar-scanner工具。
在这里插入图片描述
因为要检查java项目的质量,所以jdk和maven的配置也少不了

jdk:
在这里插入图片描述
maven:
在这里插入图片描述

4、创建一个测试项目

创建一个自由风格的项目,名称叫做sonar-test。

项目配置如下:
在这里插入图片描述
其中sonar部分:

Task to run:定义名称,自定义即可;

JDK:选择刚才添加的jdk;

Analysis properties的内容如下:

#项目key(随意输入,必填项)
sonar.projectKey=test-sonar

#项目名和版本(必填项)
sonar.projectName=test-sonar
sonar.projectVersion=1.0
sonar.language=java
sonar.sourceEncoding=UTF-8

#模块名称(必填项)
sonar.modules=company

#模块相关信息(必填项)
company.sonar.projectName=company
company.sonar.language=java
company.sonar.projectBaseDir=.
company.sonar.sources=src/main
company.sonar.tests=src/test
company.sonar.java.binaries=target/classes

保存信息之后,构建一次。

在构建页面中,可以看到sonar的相关信息。
在这里插入图片描述
点击左侧的SonarQube可以直接跳转到该项目的sonar结果页。

5、查看结果

来到sonar页面中,可以看到刚才的test-sonar的检测结果了。
在这里插入图片描述
OK,用sonar检测一个项目源码质量的工作就完成了。但是还有一些其他的配置需要更加深入的去研究,比如说自定义模板等等。等下次具体用到的时候,再回来更新下。

参考文章:
http://www.eryajf.net/1977.html
https://docs.sonarqube.org/latest/requirements/requirements/
https://blog.csdn.net/qq_42207325/article/details/100998453
https://stackoverflow.com/questions/34065727/error-could-not-complete-symbolic-execution-reached-limit-of-10000-steps

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐