SonarQube搭建手记
前提
这篇文章记录的是SonarQube服务搭建的详细过程,应用于云迁移后的PipleLine的代码扫描环节。

笔者有软件版本升级强迫症,一般喜欢使用软件的最新版本,编写此文的时候(2020-05-17)SonarQube的最新版本为8.3.1。
SonarQube简介
SonarQube是一个代码质量管理开放平台,它集成了数千种自动的静态代码分析规则,旨在提高开发人员的代码质量和安全性,使得开发人员编写更加干净,更加安全的代码。主要提供了三个比较大的功能:
- 代码可靠性支持:提前捕获和提示代码中的错误,从而避免未定义的行为影响到终端用户。
- 应用安全支持:修复可能危害到应用程序的漏洞,并通过安全热点学习
AppSec(简单理解就是会学习和识别新的漏洞)。 - 技术债务支持:确保管理的代码库干净并且可维护,以便提高开发人员的开发效率。
目前SonarQube支持27种编程语言,基本上覆盖了当前主流的编程语言编写的项目:

上面谈到的功能可能比较泛,实际上,研发团队可以基于SonarQube做下面的事情:
CI/CD流程加入一个SonarQube扫描的环节。- 实施代码质量阈值,只有通过了这个质量阈值检测才能进入下一个流程。
- 代码质量低于阈值的项目要及时调整对应的代码。
质量阈值可以进行自定义,SonarQube中针对每个项目会有详细的面板信息,里面会给出项目当前的健康状态,不同级别漏洞的分类和明细,漏洞对应提交者等多维度的统计信息,方便进行问题的追踪和修复。举个例子,笔者在上一家公司项目上线需要跑一个流水线,而SonarQube设定了不同等级的阈值,对于老项目,会使用最低等级的阈值:阻断性的错误数量要求为0,对于一些新的项目,则严格要求质量如严重性的错误要求为0等,只要无法通过质量阈值检查,那么项目是无法上线的。
SonarQube安装
一般情况下,只需要安装社区版免费的SonarQube服务即可,可以基于二进制文件安装或者直接使用Docker下载镜像启动,二进制文件安装的过程比较复杂,因为SonarQube内部依赖内置的ElasticSearch做搜索,在Linux系统中需要添加一个非root用户,并且修改一些列的系统参数例如系统支持的最大可打开的文件数等等。此外,SonarQube是一个Java应用,需要本地安装JDK。自SonarQube的7.9版本开始放弃支持MySQL数据库,8.3.1版本下只支持内存模式、PostgreSQL、Microsoft SQL Server和Oracle四种存储引擎。笔者调研过,持久化模式下,三种数据库中PostgreSQL的安装相对简便。下面会详细记录基于二进制文件安装SonarQube服务的过程。
| 软件(系统) | 版本 |
|---|---|
CentOS |
7.x |
OpenJDK |
11.x |
PostgreSQL |
12.x |
SonarQube |
8.3.1 |
笔者在测试的虚拟机(局域网IP为192.168.56.200)上关闭了防火墙,如果防火墙开启需要开放对应的端口号。
安装JDK11
OpenJDK的安装比较简单:
mdkir /data/openjdk
cd /data/openjdk
wget https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz
## 默认会解压到/data/openjdk/jdk-11文件夹
tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz
如果系统中没有默认的JDK,可以添加到/etc/profile中:
vim /etc/profile
## /etc/profile文件中添加下面的内容
export JAVA_HOME=/data/openjdk/jdk-11
export PATH=$JAVA_HOME/bin:$PATH
## 刷新环境变量
source /etc/profile
测试一下:
[root@localhost jdk-11]# java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
安装PostgreSQL数据库
PostgreSQL的安装也相对简单,官方文档有十分详细的步骤:

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql12
yum install -y postgresql12-server
/usr/pgsql-12/bin/postgresql-12-setup initdb
systemctl enable postgresql-12
systemctl start postgresql-12
修改/var/lib/pgsql/12/data/pg_hba.conf配置,开放所有Host的访问:

接着重启PostgreSQL:
systemctl restart postgresql-12
切换用户进入PostgreSQL的命令行,并且添加一个新的数据库用户sonar和新的数据库sonar备用:
su postgres
psql -U postgres
CREATE USER sonar WITH PASSWORD 'sonar';
CREATE DATABASE sonar WITH OWNER sonar ENCODING 'UTF8'

这样就建立了一个名称为sonar,用户名为sonar并且密码也是sonar的数据库。
安装SonarQube服务
在安装SonarQube服务之前,可以参考Prerequisites and Overview调整系统参数,这些参数其实大部分和ElasticSearch有关,查看参数:
## 一个进程可以拥有的VMA(虚拟内存区域)的数量上限
sysctl vm.max_map_count
## 同时打开的文件数目上限
sysctl fs.file-max
## 可以打开的文件描述符的上限
ulimit -n
## 可以启动线程的数量上限
ulimit -u
如果当前的会话是root用户,可以直接通过下面的命令去修改这四个参数:
sysctl -w vm.max_map_count=262144
sysctl -w fs.file-max=65536
ulimit -n 65536
ulimit -u 4096
否则需要手动修改/etc/security/limits.conf文件,在文件尾部添加:
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
修改/etc/sysctl.conf文件,在文件尾部添加:
vm.max_map_count=262144
fs.file-max=65536
/etc/security/limits.conf和/etc/sysctl.conf更新完毕后必须重启服务器。
接着新增一个用户sonarqube(根本原因是ElasticSearch不能用root用户启动):
adduser sonarqube
# 这一步需要输入密码,这里密码也暂定sonarqube
passwd sonarqube
# 分配权限
chown -R sonarqube:sonarqube /data/sonarqube
接着下载和安装SonarQube:

mdkir /data/sonarqube
cd /data/sonarqube
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.3.1.34397.zip
uzip sonarqube-8.3.1.34397.zip
修改配置/data/sonarqube/sonarqube-8.3.1.34397/conf/sonar.properties添加下面的属性:
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonar
完成所有配置之后,可以尝试控制台启动SonarQube服务:
cd /data/sonarqube/sonarqube-8.3.1.34397/bin/linux-x86-64
./sonar.sh console
如果启动正常,日志如下:

然后Ctrl C退出控制台,使用./sonar.sh start后台启动SonarQube服务即可。
这里归类一下可能会遇到的问题:
- 提示
root用户不能启动的问题,是因为ElasticSearch不允许使用root用户启动,新建一个普通用户即可。 - 提示部分文件夹无访问权限,一般是因为新建的普通用户没有分配
SonarQube所在目录的写权限。 - 提示文件描述符或者线程数量限制,一般是因为没有修改
vm.max_map_count、fs.file-max、ulimit -n和ulimit -u参数导致。
SonarQube使用
SonarQube管理员的初始化账号密码都为admin,如果需要修改密码或者分配不同权限的用户,可以在管理员的菜单栏中完成。
访问http://192.168.56.200:9000进入SonarQube的WebUI,可以先到插件市场安装一个汉化插件Chinese Pack,安装插件完成后重启服务即可实现汉化。

SonarQube提供不同类型的SonarScanner用于代码扫描和结果提交,这里以Maven为例。Maven的settings.xml需要引入下面的配置(注意父标签已经存在,重复添加父标签会导致异常):
<settings>
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>
<!-- 这个位置需要替换成SonarQube服务地址,例如http://192.168.56.200:9000 -->
http://myserver:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>
需要被扫描的项目中,需要引入Maven插件sonar-maven-plugin,当前最新版本为:
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.7.0.1746</version>
</plugin>
完成配置后,只需要在项目中执行命令进行扫描即可,首次执行会比较缓慢,因为需要下载大量的规则库和插件:
# 不指定插件版本执行
mvn clean install
mvn sonar:sonar
# 或者指定插件版本执行
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:${插件的版本号}:sonar
此外,可以通过pom文件中的<properties>指定SonarQube的参数,如:
<properties>
<sonar.host.url>[...]</sonar.host.url>
<ssonar.projectKey>[...]</sonar.projectKey>
<sonar.projectName>[...]</sonar.projectName>
<sonar.projectVersion>[...]</sonar.projectVersion>
<sonar.login>[...]</sonar.login>
<sonar.password>[...]</sonar.password>
<sonar.sourceEncoding>[...]</sonar.sourceEncoding>
......
</properties>
项目扫描结果提交后,可以在http://192.168.56.200:9000/projects看到项目列表:

点击进去就可以看到项目扫描后的详细报告和统计:

小结
质量管理是DevOps中的一个重要环节,SonarQube是一个十分优秀的代码质量管理开放平台,笔者之前迁移服务到某云,云上的流水线配置可以通过插件形式引入SonarQube服务,这一点起到了低成本高收益的效果。
参考资料:
个人博客
(本文完 c-1-d e-a-20200517)
SonarQube搭建手记的更多相关文章
- mongo分布式集群搭建手记
一.架构简介 目标 单机搭建mongodb分布式集群(副本集 + 分片集群),演示mongodb分布式集群的安装部署.简单操作. 说明 在同一个vm启动由两个分片组成的分布式集群,每个分片都是一个PS ...
- Kafka相关内容总结(Kafka集群搭建手记)
简介 Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是 ...
- mongodb分布式集群搭建手记
一.架构简介 目标单机搭建mongodb分布式集群(副本集 + 分片集群),演示mongodb分布式集群的安装部署.简单操作. 说明在同一个vm启动由两个分片组成的分布式集群,每个分片都是一个PSS( ...
- n2n搭建手记-2-V2
n2n-V2搭建 [1.]在V1中遇到的问题 在完成V1搭建后,边缘节点1台机器由centos 6.5 重装为Centos 7 ,再次重加入V1时遇到 与节点其他机器 可 ping通.能通过机器的公网 ...
- n2n搭建手记-1-V1
搭建环境 supernode :阿里云主机一台 aly1(Centos 6.5) edg2node:美团云机器两台 mty1,mty2(Centos 7.0) Step-1 各机器安装subviers ...
- SonarQube搭建和使用教程
我想使用 SonarQube 查阅代码 请问怎么做,现在只有一个要审查代码的项目
- win7搭建本地SonarQube环境进行c#代码分析
1.SonarQube需要正常运行,首先需要安装Java环境,我这里安装的是jdk-8u181版本,可以在下面网站找适的版本去下载安装 https://www.oracle.com/technetwo ...
- 手把手教你用SonarQube+Jenkins搭建--前端项目--代码质量管理平台 (Window系统)
前言 网上教程大多介绍的是Linux系统下SonarQube+Jenkins如何使用,这是因为这两款软件一般都是部署在服务器上,而大多数服务器,采用的都是Linux系统.大多数服务器用Linux的原因 ...
- SonarQube install on Kubernetes
Sonarqube搭建代码 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: postgres labels: app: ...
随机推荐
- Python flask 构建可扩展的restful ap
Flask-RESTful是flask的扩展,增加了对快速构建REST API的支持. Flask-RESTful通过最少的设置鼓励最佳的实践. pip install flask-restfulFl ...
- hdu_1052 Tian Ji -- The Horse Racing 贪心
Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- Mybatis自动生成插件对数据库类型为text的处理
2019独角兽企业重金招聘Python工程师标准>>> 如果数据库中的字段为text或者blob这种大文本类型,在使用MybatisGenerator工具自动生成代码的时候会将其进行 ...
- 《OSPF和IS-IS详解》一1.5 ARPANET内的路由选择
本节书摘来异步社区<OSPF和IS-IS详解>一书中的第1章,第1.5节,作者: [美]Jeff Doyle 译者: 孙余强 责编: 傅道坤,更多章节内容可以访问云栖社区"异步社 ...
- RHCS图形界面建立GFS共享下
我们上面通过图形界面实现了GFS,我们这里使用字符界面实现 1.1. 系统基础配置 5台节点均采用相同配置. 配置/etc/hosts文件 # vi /etc/hosts 127.0.0. ...
- mysql建立ssl安全连接的配置
mysql建立ssl安全连接的配置 1.环境.IP.安装包: centOS 5.4 虚拟机了两台服务器 mysql-5.1.48.tar.gz openssl-0.9.8b.tar.gz server ...
- log4net进阶手札(二):基本用法
本节将主要在WebSite中,对保存日志在文本文件的基本用法来进行介绍,并结合WebForm的初始化方式区别进行说明,解决方案如下图所示: 一.WebSite应用第1步:配置Web.Config文件, ...
- iOS9.2.1 App从AppStore上下载闪退问题
首先这是小编的第一篇文章,我是一名做iOS开发的小白,出于爱好会更新发表些相关的技术文章,偶尔也会发些视频.恳请大家不要去嘲笑一个努力的人,要是做的不好请多多评论,反正我也不改. 好了!敲黑板!!说正 ...
- Android多线程下载远程图片
修改后的代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...
- Muduo网络库实战(二):实现服务器与客户端的连接
1. 方案的确定 1)基本需求 用户1000+, IO压力不大: 多个客户端打开网站,输入查询字符串strclient,发送给服务器=>服务器接收客户端发过来的数据并处理,将结果返回给客户端: ...