Jenkins+sonar实现代码扫描
一、Sonar的作用Sonar是一个用于代码质量检查的开源工具,采用B/S架构,帮助检查代码缺陷,改善代码质量,提高开发速度。可以从七个维度检查代码质量:复杂度分布(complexity):代码复杂度过高将难以理解;重复代码(duplications):程序汇总包含大量复制、粘贴的代码导致代码臃肿,sonar可以展示源码中重复严重的地方;单元测试统计(unit tests):统计并展示单元测试覆盖
一、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.111 | CentOS7.6 | Jenkins-2.213,sonarqube-8.3.1.34397,sonar-scanner-cli-4.3.0.2102 |
192.168.0.123 | CentOS7.6 | Gitlab |
192.168.0.125 | CentOS7.6 | PosterSQL |
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
大于或等于262144fs.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
更多推荐
所有评论(0)