Sonarqube系列01:Sonarqube 简介及安装

1. Sonarqube 简介

Sonarqube 是一个开源的自动代码审查工具,可以系统化地帮助用户交付干净的代码。用户可以将 Sonarqube 集成到 CI 流水线和 DevOps 平台,实现对项目代码进行持续的代码检查。

Sonarqube 官网: http://www.sonar.org.cn/

1.1. Sonarqube 初步认识

Sonarqube 主要特点如下:

  • 支持 java、C#、Go、Python、Ruby、JavaScript、Kotlin 等二十多种语言(现在可能更多,部分语言是收费版本才支持);
  • 能够发现代码中可能隐含的 bug、安全隐患 (vulnerability)、不规范代码 (Code Smells)问题,并分析代码覆盖率、复杂度等指标;
  • 可以对开发代码进行持续分析,能够查看各种数值的历史走向;
  • 具有极高的可定制性,可以通过插件扩展分析能力,可以定制更严格或宽松的质量阀门 (Quality Gate) 及 Quality Profile;
  • 支持基于团队、角色的权限管理;
  • 与主流代码仓库(Github、Gitlab)集成。

1.2. Sonarqube 分析范围

Sonarqube 的主要功能是进行代码质量审查,分析维度主要包括如下几点:

  • 不遵循规范的代码:通过代码规则检测检查代码编写规范。
  • 潜在Bug:审查代码中的潜在Bug。
  • 安全隐患:审查代码中的安全隐患。
  • 复杂度分布:审查文件、类、方法的复杂度,防止复杂度过高导致维护困难。
  • 重复代码:审查代码中复制粘贴的重复代码。
  • 注释过多或不足:分析代码注释,提示注释过多和缺少注释的代码。
  • 单元测试覆盖率:统计并展示单元测试的覆盖率。
  • 检测耦合:能够找出循环,展示包与包、类与类之间的依赖关系。

2. Sonarqube 安装

Sonar 提供了一个基于 B/S 架构的服务端,以及支持多种语言的客户端。服务端称为 Sonarqube Server,官方提供了四个版本,分别是社区版、开发者版、企业版、数据中心版,其中社区版可免费使用。本指南使用的是 8.9LTS 社区版。

2.1. 前置条件

Sonarqube 需要提前预装 Java 和数据库,8.9LTS 支持 JDK 最低版本 11,数据库支持 PostgreSQL、Microsoft SQL Server、Oracle,详细要求见这里
本次安装选用 OpenJDK 11、ostgreSQL 12 以及 CentOS 7。

2.1.1. 硬件要求

2.1.1.1. 内存

至少 3GB( 2GB For Sonarqubye,1GB For 操作系统)

2.1.1.2. 硬盘

取决于分析的代码量,由于依赖 ES,建议选用 IO 性能好的硬盘进行安装

2.1.2. JDK 11

首先搜索可安装的 jdk

1
sudo yum search java-11

从结果中可以找到两个条目

1
2
java-11-openjdk.x86_64 : OpenJDK Runtime Environment 11
java-11-openjdk-devel.x86_64 : OpenJDK Development Environment 11

分别是 JRE 和 JDK,根据你的需求安装即可,比如这里安装的是 JRE

1
sudo yum install java-11-openjdk.x86_64

安装目录为

1
/usr/lib/jvm/jre-11-openjdk-11.0.13.0.8-1.el7_9.x86_64

查看版本信息

1
2
3
4
5
$ java -version

openjdk version "11.0.1" 2018-10-16 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.1+13-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode, sharing)

2.1.3. PostgreSQL

2.1.3.1. 安装

官方支持通过 yum 方式安装,安装前需根据系统和安装版本添加 yum 源进行安装。打开官网下载地址,选择安装版本、操作系统、架构等信息,自动生成安装脚本如下图所示:
b1d4ba72bb38079e651e5db9d52352d8.png
依次执行脚本完成安装,通过下面命令查看版本信息。

1
2
$  psql --version
psql (PostgreSQL) 12.7

2.1.3.2. 建库

1
2
3
4
5
6
7
8
9
10
11
12
#切换用户
su postgres
#进入命令行模式,需输入密码
psql
#创建数据库及账号
create database sonar;
create user sonar;
alter user sonar with password 'postgres#345';
alter role sonar createdb;
alter role sonar superuser;
alter role sonar createrole;
alter database sonar owner to sonar;

2.1.3.3. 添加其他设备访问

PostgreSQL 安装完成后,默认是只接受来在本机 localhost 的连接请求。需修改配置允许数据库服务器监听来自任何主机的连接请求。配置文件默认在安装目录下的 data 文件夹。

postgresql. Conf
定位到 #listen_addresses='localhost',将行开头的#去掉,将行内容修改为 listen_addresses='*'

Listen_addresses=’*’

pg_hba. Conf
配置用户的访问权限,添加服务端允许的认证方式。

Host all all 0.0.0.0/0 md5

重启服务

1
systemctl restart postgresql

2.1.4. CentOS 系统配置

在 Linux 平台运行,需要确保:

  • vm.max_map_count >=524288
  • fs.file-max >=131072
  • 运行用户至少可以打开 131072 文件描述符
  • 运行用户至少可以打开 8192 线程

可以通过如下命令确认系统设置的值:

1
2
3
4
sysctl vm.max_map_count
sysctl fs.file-max
ulimit -n
ulimit -u

临时生效可以用 root 运行:

1
2
3
4
sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192

为保证重启依然生效,修改 /etc/sysctl.conf,添加如下内容:

Vm. Max_map_count=524288
Fs. File-max = 131072

修改 /etc/security/limits.conf,添加如下内容:

* soft nofile 131072
* hard nofile 131072
* soft nproc 8192
* soft nproc 8192

2.2. 安装

Sonarqube 下载地址:https://www.Sonarqube.org/downloads/

Sonarqube 提供 docker 和 zip 安装包两种方式,这里使用安装包方式进行安装。

1
2
wget https://binaries.sonarsource.com/Distribution/Sonarqube/Sonarqube-8.9.3.48735.zip
unzip Sonarqube-8.9.3.48735.zip

2.3. 配置

2.3.1. 切换独立数据库

Sonarqube 默认启动使用内嵌 H2 数据库,进去后会提示内嵌数据库只用于测试环境,无法支持升级到版本,因此需要替换为 postgreSQL
切换到 Sonarqube 根目录,编辑配置文件 conf/sonar.properties,依次修改如下配置

Sonar. Jdbc. Username=sonar
Sonar. Jdbc. Password=postgres#345
Sonar. Jdbc. Url=jdbc :postgresql: //localhost/sonar

2.3.2. 添加启动账号

Sonarqube 需要非 root 账号启动,添加专用用户,并修改文件权限。

1
2
adduser sonar
chown sonar:sonar -R Sonarqube-8.9.3.48735

为方便管理,可将 sonar 启动管理脚本添加快捷方式,编辑 /home/sonar/.bashrc,添加如下内容:

Alias sonar=’%{SONAR_QUBE_HOME}/bin/linux-x86-64/sonar. Sh’

2.3.3. 启动管理

使用启动账号,通过命令启动服务。

1
2
3
4
5
6
7
su sonar
# 3 启动
sonar start
# 4 停止
sonar stop
# 5 重启
sonar restart

启动后,使用浏览器访问 http://yourip:9000,刚启动时需要等待 Sonarqube 进行初始化,随后进入登录界面,使用默认账号 admin 密码 admin 登录,修改密码后,开始使用 Sonarqube。

2.3.4. 基础插件

Sonarqube 有丰富的生态环境,支持通过各种插件来增强社区版的能力,实现用户的业务场景需求。
通常情况下,可以通过以下两种方式安装插件:

  1. 插件市场——社区版可通过 Marketplace 进行自动安装,安装完成后需要重启 Sonarqube。(选择 Administration 菜单,再点击 Marketplace 子菜单)
  2. 手动安装——如果安装服务器无法上网或者插件无法在市场中找到,可通过手动进行安装。(下载插件,拷贝至 $Sonarqube_HOME/extensions/plugins 目录重启即可,需要注意同一个插件保留最新版本即可)

常用的插件及安装方法如下:
中文界面

Sonarqube 默认界面为英文,可安装中文包,方便使用。
在插件市场搜索栏中搜索 Chinese Pack ,点击安装

Community Branch Plugin
社区版不支持多分支扫描,可通过 Sonarqube-community-branch-plugin,实现多分支代码扫描,扫描时指定分支参数即可,例如:-Dsonar.branch.name=dev插件地址

  1. 官网下载对应版本插件,拷贝 jar 文件到 Sonarqube 实例下的 extensions/plugins/ 目录
  2. 编辑配置文件 config/sonar.properties,添加如下内容,注意版本信息
    sonar. Web. JavaAdditionalOpts=-javaagent:./extensions/plugins/Sonarqube-community-branch-plugin-1.8.1. Jar=web
    sonar. Ce. JavaAdditionalOpts=-javaagent:./extensions/plugins/Sonarqube-community-branch-plugin-1.8.1. Jar=ce

Findbugs
Findbugs java 代码质量检查 官网

在插件市场搜索栏中搜索 Findbugs ,点击安装

PMD-P3C
PMD 代码质量检查,支持 Java, JavaScript, Salesforce. Com Apex and Visualforce, PLSQL, Apache Velocity, XML, XSL
P3C 是阿里巴巴出品的 Java 编程规范
官方没提供实现,社区整合插件地址见这里

C++
社区版默认没有 C++插件,通过安装开源插件 sonar-cxx 实现支持,插件地址

2.3.5. 自启动配置

创建文件 /etc/systemd/system/Sonarqube.service,写入服务脚本内容,注意替换 Java 路径、Sonarqube 路径以及执行用户和用户组

[Unit]
Description=Sonarqube service
After=syslog. Target network. Target

[Service]
Type=simple
User=sonar
Group=sonar
PermissionsStartOnly=true
ExecStart=/usr/bin/java -Xms32m -Xmx32m -Djava. Net. PreferIPv4Stack=true -jar /home/local/Sonarqube-8.9.3.48735/lib/sonar-application-8.9.3.48735. Jar
StandardOutput=syslog
LimitNOFILE=131072
LimitNPROC=8192
TimeoutStartSec=5
Restart=always
SuccessExitStatus=143

[Install]
WantedBy=multi-user. Target

添加并启动服务

1
2
sudo systemctl enable Sonarqube.service
sudo systemctl start Sonarqube.service

3. 后记

常规情况下按照以上指南可以顺利完成 Sonarqube 搭建,实际操作过程中有些特殊情况需要注意。

1. 提示启动成功,服务无法访问

操作过程中遇到 2 种情况:

  1. 检查启动账号是否为专用账号,因为 Sonarqube 依赖 es,而 es 需要非 root 用户启动
  2. 操作系统参数限制导致,详细参考1.3 CentOS

其他情况,可到 logs/sonar. Log 检查日志信息,排查启动出错原因。

2. 插件市场安装失败

大概率是网络问题,如果有科学上网,可设置代理后再尝试,或者也可以通过插件市场的插件主页查找离线下载方式手动安装。