Last Updated on

前言

SonarQube是一种自动代码审查工具,用于检测代码中的错误,漏洞和代码异味。它可以与您现有的工作流程集成,以便在项目分支和拉取请求之间进行连续的代码检查,在很多企业中都会使用到,进行代码质量分析展示与管理,今天在这里记录介绍下sonar的安装与使用。

另外,sonarqube自动分析是常见的持续集成自动部署的常有环节,一般小公司对此并不是很重视,一般再稍大些的公司才会是有一点使用,虽然并不是持续集成,自动部署的核心,但是同样是重要的组成部分。

正文

安装使用整篇文章基于如下版本进行,不同版本或许有一些不同,具体以实际版本为准,本人介绍时通常以当前最新版(目前为7.9)进行,以避免版本过于老旧,但是由于一些原因(下面会说明),这里使用7.7版本进行。

另外,所有网络上的博客等质量参差不齐,版本也不经相同,看的越多可能反而会更混乱,不管什么,官方文档才是最准确,最新的,要学会查看官方文档,博客文档应以辅,好啦,话不多说,下面开始。

  • Sonarqube版本:7.7
  • 数据库:MySQL-5.6
  • 操作系统:Centos7
  • JDK:JDK1.8

1. 架构与整合

SonarQube的整个安装过程,依然以官方文档为准,教大家看懂官方文档,跟着官方文档,安装部署生产环境实例与使用SonarQube,查看最新官方文档,文档为英文,英文不好的使用chrome的翻译功能查看,以下内容配合官放文档一起使用。

首先查看第一栏:架构与整合:

SonarSQube整个架构由4个组件组成:

  1. SonarQube 服务端,包括web服务界面,elasticsearch搜索引擎,计算引擎三个主要部分。
  2. SonarQube 数据库存储端。
  3. SonarQube插件,可能包括语言,SCM,集成,身份验证和治理插件等。
  4. SonarScanner客户端,开发人员或持续集成服务器通过SonarScanner进行项目代码分析。

SonarSQube的常见使用流程为,开发人员开发完代码后,提交到git等代码版本管理工具,然后触发jenkins等持续集成工具进行代码分析检测,并将数据传到SonarSQube服务端储存在数据库中,相应的代码问题则展示在web页面上,通知开发人员进行解决,以此循环以保证代码质量。

2. 前提要求

要安装使用SonarQube服务端需要一些前提要求,由于SonarQube服务端需要安装elasticsearch作为搜索引擎,所以主要端要求的限制大多在elasticsearch。

PS:SonarQube的运行需要Java环境,从SonarQube7.8版本开始不再支持JRE8,且7.8版本为最后一个支持Mysql的版本,从7.9版本开始将不再支持Mysql。这些重要的更新信息在官方文档中都可以找到,如下图:


由于以上原因,为了能使用Mysql和JRE8,此为本人生产环境服务器的一些原有限制,这里将使用SonarQube7.7版本进行安装与使用,虽然不是最新版7.9,但是只要看懂学会了使用官方文档,不管版本怎么变化,都能灵活应对。


下面根据文档的安装前提条件,一一检查会准备条件:

JRE8

官方文档如下,7.7版本只支持JRE8,准备Java8的环境,详情请参考:《centos7 安装 JDK 1.8》


数据库

数据库支持PostgreSQL,Microsoft SQL Server,Oracle,Mysql,这里我们使用最常见的Mysql,版本和要求如官方文档所示,注意的是下面三点,必须使用UTF8字符集,且排序规则为大小写敏感的cs排序规则,只支持InnoDB引擎,仅支持捆绑的mysql-connector-java.jar。这三点需要注意。自行准备环境,Mysql服务器的安装与配置,详情可参考:Mysql Tag相关内容

PS:现在Mysql的版本很多都没有cs的排序规则了,所以使用utf8_bin的排序规则代替,也可以区分大小写,所以mysql中新建的库,字符集为utf8,排序规则为utf8_bin。


系统要求

Linux系统,我们这里是常见的Centos7,需要确保一些内核参数,主要是为了满足Elasticsearch的运行,如官方文档所示,需要设置几个内核参数,查看命令也列出,使用其中的命令,查看是否满足。

若不满足,文档也说明了修改方式,我这里详细说明一下:

# vm.max_map_count为内核参数,直接在系统配置文件中添加如下内容
$ vim /etc/sysctl.conf
------------------------------------------------------
vm.max_map_count=262144 
------------------------------------------------------

# 重新加载配置生效
$ sysctl -p

# 下面三个参数为文件打开数,包括用户文件最大打开数,程序最大文件打开数和用户最大打开线程数等配置,也可以直接修改配置文件进行设置,添加如下内容:
$ vim /etc/security/limits.conf
------------------------------------------------------
# 一下参数设置最大文件打开数
* soft nofile 65536
* hard nofile 65536
------------------------------------------------------

# 除了文件打开数,最大打开进程数设置如下,修改文件内容如下:
$ vim /etc/security/limits.d/20-nproc.conf
------------------------------------------------------
*          soft    nproc     65536
root       soft    nproc     unlimited
------------------------------------------------------

# 但是此上配置在使用systemctl启动服务时是不生效的,可以根据文档说明在elasticsearch的service文件中定义,也可以直接修改systemctl服务的默认配置文件,
$ vim /etc/systemd/system.conf
------------------------------------------------------
# 配置如下两项,默认是注释掉的且没有值
DefaultLimitNOFILE=65536
DefaultLimitNPROC=65536
------------------------------------------------------

# 同上还有一个/etc/systemd/user.conf为用户的systemctl服务配置。
# 一般用不到,一般会将服务设置系统服务,不过需要的话可以一起修改了:
$ vim /etc/systemd/user.conf
------------------------------------------------------
# 配置如下两项,默认是注释掉的且没有值
DefaultLimitNOFILE=65536
DefaultLimitNPROC=65536
------------------------------------------------------

Seccomp过滤器


硬件要求

硬件要求和服务器配置要求,自行查看官方文档,根据自己公司的实际情况,选择使用配置,推荐内存不低于2G,不大于32G,cpu不低于2核,磁盘IO性能也比较重要,不要使用延迟过高的网络存储等。

我这里的配置是阿里云ECS,2核,16G服务器,SonarQube后端服务都将部署在一台服务器上。

3. 安装服务端

上面完成了系统的设置和准备后,下面进行安装服务端,还是一样,跟着官方文档,进行生产实例的安装:

准备数据库

首先,数据库准备好后,需要创建一个空的库sonarqube和一个sonarqube用户。授予此sonarqube用户对sonarqube库的createupdatedelete权限。且看官方文档中说明,需要设置两个参数:innodb_buffer_pool_size,query_cache_size。这两个参数的作用和配置可参考:《Mysql5.6 修改配置my.cnf,进行性能优化》


安装Web服务端

根据文档,进行如下操作。

# 下载7.7版本发行版
$ cd /opt
$ wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.7.zip

# 解压
$ unzip sonarqube-7.7.zip

# 进入解压后文件夹内,修改配置文件,修改如下的这些内容
$ vim /opt/sonarqube-7.7/conf/sonar.properties
------------------------------------------------------------------
# 设置数据库连接信息
sonar.jdbc.username=sonarqube
sonar.jdbc.password=mysql_password
sonar.jdbc.url=jdbc:mysql://mysql_host:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

# 配置elasticsearch存储路径,启动时会自动创建文件与文件夹
sonar.path.data=/var/sonarqube/data
sonar.path.temp=/var/sonarqube/temp

# 设置java启动参数调整,以获得更好的性能,
# web设置最小内存Xmx768m,根据自己实际情况调整
sonar.web.javaOpts=-server -Xmx768m -Xms768m -XX:+HeapDumpOnOutOfMemoryError
# 计算引擎java参数设置,根据自己实际情况调整
sonar.ce.javaOpts=-Xmx512m -Xms512m -XX:+HeapDumpOnOutOfMemoryError
# 搜索引擎java参数设置,根据自己实际情况调整
sonar.search.javaOpts=-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError

# 设置web的host和端口等基础参数,默认值如下,按默认的就行,需要的改动的根据事情情况修改即可
sonar.web.host=0.0.0.0
sonar.web.port=9000
# 上下文参数,可以理解为访问此服务的url前缀,默认为空,根目录,访问IP:9000即可访问此web,如何添加了,如sonar.web.context=sonar,则访问IP:9000/sonar才能访问此web。
sonar.web.context=
------------------------------------------------------------------

# 启动sonarqube
# 因为elasticsearch无法使用root用户启动,所以需要创建单独的用户用于启动sonarqube。
# 先创建非登录用户sonarqube用于启动sonarqube
$ useradd -M -s /sbin/nologin sonarqube

# 将所有sonarqube相关文件授权sonarqube
$ chown -R sonarqube. /opt/sonarqube-7.7
# 指定的存储目录需要先创建文件夹,并授权,已避免程序用户无权限创建文件
$ mkdir -p /var/sonarqube && chown -R sonarqube. /var/sonarqube

# 配置启动用户在启动文件中
$ vim /opt/sonarqube-7.7/bin/linux-x86-64/sonar.sh
------------------------------------------------------------------
RUN_AS_USER=sonarqube
------------------------------------------------------------------

# 启动sonarqube
$ /opt/sonarqube-7.7/bin/linux-x86-64/sonar.sh start
# 查看状态
$ /opt/sonarqube-7.7/bin/linux-x86-64/sonar.sh status

# 查看日志,elasticsearch和sonar还有web日志都在此目录下可以查看,如:
$ tail -f /opt/sonarqube-7.7/sonar.log

OK,到此服务端安装完成,查看端口监听,开放防火墙就可以访问了。

# 防火墙开放9000端口
$ firewall-cmd --add-port=9000/tcp --permanent
$ firewall-cmd --reload

访问服务器的9000端口,或者通过设置域名和nginx反向代理等,就能当问到web界面,如下,默认管理员账号为:admin/admin,登录用户自行修改密码即可。


设为系统服务

PS: 此步骤可有可无,只是一个优化操作,根据个人习惯,做不做都行,不影响使用。

经过上面的步骤,sonarqube已经启动完成后,但是启动是使用命令行进行的,通过启动脚本sonar.sh运行的,在centos7中不是那么方便进行管理,可以将服务设为系统服务,通过systemctl命令进行管理。这在官放文档中也有说明:

根据文档,执行如下命令将服务设置为系统服务

# 新增编辑系统服务配置文件
$ vim /etc/systemd/system/sonarqube.service
------------------------------------------------------------------
[Unit]
Description=SonarQube service
After=syslog.target network.target

[Service]
Type=simple
# 运行程序的用户和用户组
User=sonarqube
Group=sonarqube
PermissionsStartOnly=true
# 运行服务的命令,指定本地java的绝对路径和sonarqube文件的路径和启动jar包
# 启动文件sonar-application-7.7.jar会根据版本变化,sonarqube升级后需要相应修改此文件
ExecStart=/bin/nohup /home/jdk1.8.0_151/bin/java -Xms32m -Xmx32m -Djava.net.preferIPv4Stack=true -jar /opt/sonarqube-7.7/lib/sonar-application-7.7.jar
StandardOutput=syslog
LimitNOFILE=65536
LimitNPROC=8192
TimeoutStartSec=5
Restart=always

[Install]
WantedBy=multi-user.target
------------------------------------------------------------------

# 重载系统服务
$ systemctl daemon-reload
# 启动服务
$ systemctl start sonarqube
# 设为开机启动
$ systemctl enable sonarqube

4. 安装插件

安装完服务端后,根据自己实际需求安装相应的插件,根据官方文档说明,可以直接从web页面进行安装,也可以手动安装,非常简单,我就不演示了,见文档:

结束

到此就安装完了sonarqube服务端,接下来就是如果使用了,sonarqube要分析代码还需要一个代码分析器工具:SonarScanner。此工具可以分析代码然后将分析结果传到sonarqube服务端中,就可以在web界面上看到分析的结果和统计展示。

除了安装,还有如下三个部分的使用需要详细说明:

  1. Sonar作为代码分器检测工具,在持续集成中,利用jenkins+Git/Svn 在开发人员上传代码或项目构建等时候触发运行SonarScanner分析检测代码并传递数据到sonarqube服务端中。
  2. 开发人员则使用SonarLint在编辑器如idea中运行本地分析,方便开发人员在开发时提高代码质量,规避Bug。
  3. SonarQube Web端的使用和各参数说明

这三部分,将会在后面再一一详细说明。完整SonarQube的使用解析。

有任何问题,欢迎留言。