本文介绍如何在 CentOS 环境下搭建代码质量管理平台 SonarQube 社区版,并使用 PostgreSQL 数据库作为其后端数据库;同时,详细说明了如何配置 SonarQube 并使用 sonar-cxx 开源插件进行 C 语言系列项目的静态代码分析。

01 SonarQube 实例介绍


SonarQube 是一个开源的代码质量管理平台,用于检测和管理代码的质量,一个 SonarQube 实例如下图所示包含三个组件:服务器(Sever)、数据库(Database)和扫描器(Scanner)

  1. SonarQube Server(服务器)提供 Web 交互、计算引擎和搜索服务
    a. Web Sever:提供 Web 界面,用户通过 Web 界面与 SonarQube 进行交互,将用户请求传递给 Compute Engine 计算引擎,并返回相应的结果。
    b. Compute Engine:SonarQube 的核心组件,负责处理静态代码分析的请求,存储分析结果,并将结果报错到数据库中。
    c. Search Sever:基于 Elasticsearch 实现的搜索服务。
  2. Database Sever(数据库)使用数据库存储分析结果、配置信息、用户信息等数据;支持的数据库包括 PostgreSQL、SQL Sever 和 Oracle
  3. 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.gzcd postgresql-12.16

4. 配置和编译:

./configure --prefix=$PG_HOMEmake

其中,PG_HOME 为指定的安装路径,如果没有报错,继续下一步。

5. 安装 PostgreSQL:

make install

完成安装后,按需要配置如下环境变量 vim ~/.bashrc

export PG_HOME=[your-postgresql-install-path]export LD_LIBRARY_PATH=$PG_HOME/lib:$LD_LIBRARY_PATHexport PATH=$PG_HOME/bin:$PATH

修改完成之后,source ~/.bashrc 使配置修改生效。

6. 初始化数据库:

使用 initdb 创建数据库,并创建用户 postgres,其中 PG_DATA 为指定的数据存储路径,可以直接在安装目录 PG_HOME 下添加一个 data 目录并指定该路径为数据目录。

# 示例:initdb -D /usr/local/pgsql/data -U postgres -Winitdb -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 '';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_adminCREATE SCHEMA sonar_schema AUTHORIZATION sonar_admin;GRANT ALL PRIVILEGES ON SCHEMA sonar_schema TO sonar_admin;-- 设置 sonar_admin 用户的默认搜索路径为 sonar_schemaALTER 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.gztar -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.10export ES_JAVA_HOME=[your-java-install-path]/jdk-17.0.10export JRE_HOME=$JAVA_HOME/jreexport CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATHexport 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_countsysctl fs.file-maxulimit -nulimit -u

如果不满足可以通过修改 /etc/security/limits.conf 文件设置进程可开启的最大文件句柄和线程数量,修改 /etc/sysctl.conf 文件设置 vm.max_map_countfs.file-max 参数

vim /etc/security/limits.confsonarqube - nofile 131072sonarqube - nproc8192vim /etc/sysctl.confvm.max_map_count=524288fs.file-max=131072

也可以通过如下命令仅在当前会话级别让上述修改生效,如无法正确修改仍需通过修改文件的方式修改上限

sysctl -w vm.max_map_count=524288sysctl -w fs.file-max=131072ulimit -n 131072ulimit -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# 将解压后的文件夹重命名为 sonarqubemv 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 数据库访问 URLsonar.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 startStarting SonarQube...Removed stale pid file: ./SonarQube.pidStarted SonarQube.

启动成功之后,使用浏览器访问 CentOS 上运行的 SonarQube 服务 http://: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.zipunzip sonar-scanner-cli-5.0.1.3006-linux.zip# 将安装目录改名为 sonar-scannermv 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.gitcd 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