本文介绍如何在 CentOS 环境下搭建代码质量管理平台 SonarQube 社区版,并使用 PostgreSQL 数据库作为其后端数据库;同时,详细说明了如何配置 SonarQube 并使用 sonar-cxx 开源插件进行 C 语言系列项目的静态代码分析。
01 SonarQube 实例介绍
SonarQube 是一个开源的代码质量管理平台,用于检测和管理代码的质量,一个 SonarQube 实例如下图所示包含三个组件:服务器(Sever)、数据库(Database)和扫描器(Scanner)
- SonarQube Server(服务器)提供 Web 交互、计算引擎和搜索服务
a. Web Sever:提供 Web 界面,用户通过 Web 界面与 SonarQube 进行交互,将用户请求传递给 Compute Engine 计算引擎,并返回相应的结果。
b. Compute Engine:SonarQube 的核心组件,负责处理静态代码分析的请求,存储分析结果,并将结果报错到数据库中。
c. Search Sever:基于 Elasticsearch 实现的搜索服务。 - Database Sever(数据库)使用数据库存储分析结果、配置信息、用户信息等数据;支持的数据库包括 PostgreSQL、SQL Sever 和 Oracle
- Scanner(扫描器)用于执行代码分析的工具,它可以集成到构建工具中,如 Maven、Gradle 或 Ant,也可以作为独立的命令行工具使用;扫描器将代码提交给 SonarQube 服务器进行分析,并将结果返回供用户查看。
02 数据库安装配置
本文以 PostgreSQL 数据库为例进行 SonarQube 所需数据库的安装配置过程,SonarQube 支持 PostgreSQL 11+ 的数据库版本,其他数据库版本依赖可参考官网文档
2.1 PostgreSQL 源码编译安装
本节介绍在 CentOS 环境中使用 PostgreSQL 源码进行安装的过程,如已满足 SonarQube 的数据库版本要求,可跳过本节
在 CentOS 环境中安装 PostgreSQL 数据库的源码安装流程可以分为以下步骤:
1. 安装编译工具和依赖库:
sudo yum install readline readline-devel zlib zlib-devel
2. 下载 PostgreSQL 源码:
在 PostgreSQL 官方网站 上下载相应版本的 PostgreSQL 源码压缩包。
wget https://ftp.postgresql.org/pub/source/v12.16/postgresql-12.16.tar.gz
3. 解压源码:
tar -zxvf postgresql-12.16.tar.gz
cd postgresql-12.16
4. 配置和编译:
./configure --prefix=$PG_HOME
make
其中,PG_HOME
为指定的安装路径,如果没有报错,继续下一步。
5. 安装 PostgreSQL:
make install
完成安装后,按需要配置如下环境变量 vim ~/.bashrc
export PG_HOME=[your-postgresql-install-path]
export LD_LIBRARY_PATH=$PG_HOME/lib:$LD_LIBRARY_PATH
export PATH=$PG_HOME/bin:$PATH
修改完成之后,source ~/.bashrc
使配置修改生效。
6. 初始化数据库:
使用 initdb
创建数据库,并创建用户 postgres,其中 PG_DATA
为指定的数据存储路径,可以直接在安装目录 PG_HOME
下添加一个 data 目录并指定该路径为数据目录。
# 示例:initdb -D /usr/local/pgsql/data -U postgres -W
initdb -D $PG_DATA -U postgres -W
7. 启动 PostgreSQL 服务:
使用 pg_ctl
工具启动 PostgreSQL 服务
pg_ctl -D $PG_DATA -l logfile start
使用 psql
命令测试连接到 PostgreSQL 数据库。
psql -U postgres
这会进入 PostgreSQL 的命令行界面,表示连接成功
2.2 创建 SonarQube 数据库
SonarQube 的运行依赖数据库服务,安装 PostgreSQL 之后为 SonarQube 创建专属数据库和用户,该数据库用户需要具备对数据库对象进行增删改查的权限,下面我们创建一个数据库用户 sonar_admin
和一个名为 sonarqube
数据库,并将该数据库的所有权限都授权给该用户。
1. 创建数据库用户 sonar_admin:
使用 initdb
时创建的超级管理员用户 postgres 登录数据库,并创建数据库用户 sonar_admin
$ psql -U postgres
Password for user postgres:
psql (12.16)
Type "help" for help.
postgres=# CREATE USER sonar_admin WITH PASSWORD '<CUSTOM PASSWORD>';
CREATE ROLE
2. 创建数据库 sonarqube:
继续创建数据库 sonarqube 并将其属主设定为数据库用户 sonar_admin
CREATE DATABASE sonarqube OWNER sonar_admin;
3. 将数据库所有权限授权给 sonar_admin:
使用 GRANT
命令将数据库 sonarqube 都授权给数据库用户 sonar_admin
GRANT ALL PRIVILEGES ON DATABASE sonarqube TO sonar_admin;
4. 按需创建专属 schema(可跳过):
如果对数据库表进行时操作是默认都是 public 模式,如果不想使用默认的 schema,那么就自行创建 schema,并指定 sonar_admin 用户的默认模式为该创建的 schema
-- 切换数据库到 sonarqube
\c sonarqube
-- 创建模式 sonar_schema,并授权给用户 sonar_admin
CREATE SCHEMA sonar_schema AUTHORIZATION sonar_admin;
GRANT ALL PRIVILEGES ON SCHEMA sonar_schema TO sonar_admin;
-- 设置 sonar_admin 用户的默认搜索路径为 sonar_schema
ALTER USER sonar_admin SET search_path TO sonar_schema;
03 服务器安装配置
3.1 依赖环境安装
SonarQube 服务的安装依赖 JAVA 环境和 ElasticSearch,其中 ElasticSearch 安装包包含在 SonarQube 的安装包中无需单独安装,但是 ElasticSearch 对操作系统的文件描述符个数有要求,需要进行配置,具体依赖项可参考官方文档
1. 安装 JAVA 依赖环境:
SonarQube 服务器和扫描器所依赖的 JAVA 版本如下图所示,这里直接安装 JDK_17 并配置环境变量
首先从 ORACLE 官网(需注册用户并登录)下载对应的 JDK 安装包:https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html
本文以 CentOS 系统为例所以直接下载 Linux x64 Compressed Archive 版本的安装包,并解压
wget https://download.oracle.com/java/17/archive/jdk-17.0.10_linux-x64_bin.tar.gz
tar -zxvf jdk-17.0.10_linux-x64_bin.tar.gz
解压完成之后,vim ~/.bashrc
配置 JAVA 环境变量,另外 ElasticSearch 需要配置环境变量 ES_JAVA_HOME
,与 JAVA_HOME
配置一致即可
export JAVA_HOME=[your-java-install-path]/jdk-17.0.10
export ES_JAVA_HOME=[your-java-install-path]/jdk-17.0.10
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
2. 修改系统默认进程配置:
SonarQube 在 Linux 系统中运行时,对系统有如下要求:
vm.max_map_count
进程允许最大虚拟内存区域的数量要不小于524288
fs.file-max
系统范围内能够同时打开的文件句柄(file descriptors)数量不小于131072
- SonarQube 运行时最少可以打开
131072
个文件句柄 - SonarQube 运行时最少可以开启
8192
个线程
可以通过如下命令查看当前 Linux 系统是否满足 SonarQube 运行要求
sysctl vm.max_map_count
sysctl fs.file-max
ulimit -n
ulimit -u
如果不满足可以通过修改 /etc/security/limits.conf
文件设置进程可开启的最大文件句柄和线程数量,修改 /etc/sysctl.conf
文件设置 vm.max_map_count
和 fs.file-max
参数
vim /etc/security/limits.conf
sonarqube - nofile 131072
sonarqube - nproc 8192
vim /etc/sysctl.conf
vm.max_map_count=524288
fs.file-max=131072
也可以通过如下命令仅在当前会话级别让上述修改生效,如无法正确修改仍需通过修改文件的方式修改上限
sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192
3.2 SonarQube 安装配置
完成依赖环境准备之后,在 SonarQube 官方网站 上下载最新版本的 SonarQube,本文以 9.9.3 社区版为例进行安装和配置
1. 下载 SonarQube 安装包:
下载 SonarQube 安装包 SonarQube 9.9.3 LTS 并解压
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.9.3.79811.zip?_gl=1*6fd02j*_gcl_aw*R0NMLjE3MDU2NTY1NTYuQ2owS0NRaUF0YU90QmhDd0FSSXNBTl94LTNKMUtiRTNVZjM2a3A2MmlIbzE2Zm5FOTkxa25TSTlMal9UQ0xvWEhPWWdTT1ZDR0tEM3hLNGFBa2dmRUFMd193Y0I.*_gcl_au*NjY0ODk2Nzk0LjE3MDU2MzQxNDY.*_ga*MTAwODc3MDg4OC4xNzA1NjM0MTQ2*_ga_9JZ0GZ5TC6*MTcwNTk5NzMxMi4yLjEuMTcwNTk5NzQwMC4zMi4wLjA.
unzip sonarqube-9.9.3.79811.zip
# 将解压后的文件夹重命名为 sonarqube
mv sonarqube-9.9.3.79811 sonarqube
2. 配置 SonarQube:
进入 SonarQube 配置目录 cd sonarqube/conf
并将 2.2 节中创建的数据库信息添加到 SonarQube 的配置文件 vim sonar.properties
中
sonar.jdbc.username=sonar_admin # 数据库用户名称
sonar.jdbc.password=your-pwd # 数据库用户密码
sonar.jdbc.url=jdbc:postgresql://127.0.0.1:5432/sonarqube # postgresql jdbc 数据库访问 URL
sonar.web.port=10001 # sonarqube Web 服务访问端口,默认为 9000 可自定义
3. 启动 SonarQube:
进入 SonarQube 二进制文件 bin 目录 cd sonarqube/bin/linux-x86-64
并然后使用 sh sonar.sh start
命令启动 SonarQube 服务器,该脚本还提供了其他命令可以使用 sh sonar.sh --help
查看命令使用方法
$ sh sonar.sh start
Starting SonarQube...
Removed stale pid file: ./SonarQube.pid
Started SonarQube.
启动成功之后,使用浏览器访问 CentOS 上运行的 SonarQube 服务 http://<服务器 IP 地址>:10001/
,访问成功之后就会进入登陆页面,默认管理员用户名称和密码都是 admin admin/admin
SonarQube 首页如下:
04 扫描器安装配置
SonarQube 中扫描器是用于执行代码分析的工具,它可以集成到构建工具中,如 Maven、Gradle 或 Ant,也可以作为独立的命令行工具使用;扫描器将代码提交给 SonarQube 服务器进行分析,并将结果返回供用户查看。
SonarQube 提供了官方的扫描器 sonar-scanner,如果构建系统没有指定特定的扫描器,则默认 sonar-scanner 对项目进行扫描,需要注意的是该扫描器不支持ARM架构。
sonar-scanner 的下载地址可以从官方文档获取:https://docs.sonarsource.com/sonarqube/9.9/analyzing-source-code/scanners/sonarscanner/
Linux 版本 sonar-scanner 安装过程如下
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-5.0.1.3006-linux.zip
unzip sonar-scanner-cli-5.0.1.3006-linux.zip
# 将安装目录改名为 sonar-scanner
mv sonar-scanner-5.0.1.3006-linux sonar-scanner
vim ~/.bashrc
将 sonar-scanner 的 bin 目录添加到 CentOS 环境变量中方便后续使用
export PATH=$PATH:[your-scanner-install-path]/sonar-scanner/bin
使用 sonar-scanner --help
命令检验是否安装成功
05 C 语言系列插件安装
SonarQube 的社区版(Community)不支持对 C 项目进行质量分析,付费版本才支持相关能力,但是可以使用一些开源的社区插件来实现该能力
本文以 sonar-cxx 插件为例,sonar-cxx 插件是专门用于对 C 系列编程语言代码进行静态代码分析和代码质量检查的插件:
https://github.com/SonarOpenCommunity/sonar-cxx
sonar-cxx 插件使用 java 开发,直接下载插件对于 jar 包 sonar-cxx-plugin-2.1.1.488.jar,并将该 jar 包放到 SonarQube 安装目录中的 extensions/plugins
目录下即可
安装完之后进入 bin 目录 cd sonarqube/bin/linux-x86-64
并然后使用 sh sonar.sh restart
命令重启 SonarQube 服务器;重启完成之后,登陆 SonarQube Web 页面在 Quality Profiles
中就可以看到新增 CXX 插件的质量配置选项
06 使用 SonarQube 分析 C 项目
PostgreSQL 是经典的 C 语言项目,接下来,以 PostgreSQL 源码为例演示如何使用 SonarQube 分析 C 语言项目(本节参考文章如有侵权请告知:https://www.jianshu.com/p/39614530df28)
6.1 添加 C 语言质量配置
1. 创建 CXX 质量配置:
在 Quality Profiles
中点击 Create
按钮新建名称为 C-Profile 的质量配置,并选择编程语言为 CXX
2. 添加检查规则:
创建完成之后,新建的 C-Profile 质量配置在 CXX 选项下,可以看到其 Rules
栏是 0
条规则,需要为其添加代码检查规则,点击齿轮样式的设置按钮选择 Activate More Rules
激活规则选项开始添加规则
点击Activate More Rules
跳转到如下页面,选择 Bulk Change
批量操作按钮,选择 Activate in
选择要添加规则的质量配置名称即 C-Profile 完成全部规则激活
3. 设置默认质量配置:
添加规则之后,C-Profile 质量配置下的 Rules
栏显示了被激活的规则数量,现在将其设置为 CXX 插件默认的质量配置,点击齿轮样式的设置按钮选择Set as Default
完成默认设置
6.2 创建 SonarQube 项目
1. 创建项目:
在 Projects
栏中点击 Create Project
按钮并选择人工添加选项(Manually)新建名称为 postgresql 的代码质量分析项目
填写项目名称和分析的目标项目代码分支
2. 代码仓库代码质量分析:
创建项目之后,跳转到项目概况(Overview)目录下,选择直接使用扫描器的本地分析方式(Locally)对代码仓库进行分析
选择 Locally 分析方式之后跳转到如下页面,第一步:生成扫描器登陆 SonarQube 服务器的 token,填写任意 Token name 之后点击 Generate
按钮生成登陆 token
第二步:选择项目类型和运行的系统环境生成扫描器 Scanner 运行命令,项目类型根据需要进行选择,本文中以 C 项目为分析对象,所以这里选择 Other;本文在 CentOS 环境中进行相关实验,所以系统类型选择 Linuxs
完成上面两个选项选择之后,SonarQube 在 Execute the Scanner
栏自动生成扫描器 sonar-scanner 的运行命令,点击 Copy
一键复制该命令
3. 分析项目设置:
分析 C 代码项目还需要进一步配置分析项目,点击如图 Project Settings
在下拉框中选中 General Settings
选项条状到项目设置页面
分析项目设置页面中可以根据需要对相关选项进行设置,但是分析 C 项目需要在如下图的 CXX
选项中填写 File suffixes
栏,确保扫描器对以.c
和.h
为后缀的 C 语言源码文件进行扫描
6.3 扫描 C 项目源码文件
1. 使用 sonar-scanner 扫描项目代码:
上文中已经介绍过扫描器 sonar-scanner 的安装过程,下面使用这个扫描器在 postgres 项目中执行 6.2 节中获取的到 postgresql 分析项目的扫描器登陆命令
首先,拉取 PostgreSQL 源码并进入到源码目录
git clone https://github.com/postgres/postgres.git
cd postgres
然后,在源码目录下执行 sonar-scanner 扫描命令
2. 查看代码分析结果:
扫描器 sonar-scanner 完成扫描之后,将代码提交给 SonarQube 服务器进行分析,等待分析完成在 SonarQube Web 页面的Projects
栏内就可以看到已完成的的分析项目
点击分析项目名称进入到该项目的代码质量分析报告中,在 Overview
栏下展示的项目的整体代码分析情况,通过如下图所示中的每个子栏查看具体分析项目的报告详情
如果文章对你有帮助,欢迎一键三连 👍 ⭐️ 💬 。如果还能够点击关注,那真的是对我最大的鼓励 🔥 🔥 🔥 。
参考资料
https://docs.sonarsource.com/sonarqube/9.9/setup-and-upgrade/install-the-server/
https://docs.sonarsource.com/sonarqube/9.9/requirements/prerequisites-and-overview/
https://www.jianshu.com/p/39614530df28
https://www.cnblogs.com/mascot1/p/11179767.html