Ubuntu docker搭建sonarqube社区版

本文最后更新于:2024年10月11日 晚上

1、sonarqube介绍

Sonar (SonarQube)是一个开源平台,用于管理源代码的质量。支持Java、kotlin、Scala、python、JavaScrip等二十几种编程语言的代码质量管理与检测。支持将代码扫描集成到现有的工作流,以便在项目分支和拉取请求之间进行连续的代码检查。

sonarqube分为四个版本:社区版、开发版、企业版、数据中心版,各版本之间差异如下

image-20240413021201801

官网:https://www.sonarsource.com/products/sonarqube/

Sonar分为两部分:

  • 第一部分为服务端,为Sonarqube为代码指令管理平台
  • 第二部分为客户端,为sonar-scanner扫描器

后续操作将完整的docker搭建sonarqube服务平台过程做记录,并使用sonar-scanner进行手工代码扫描尝试。

2、环境配置要求

官方配置要求:https://docs.sonarsource.com/sonarqube/latest/setup-and-upgrade/installation-requirements/server-host/

搭建环境配置参考:

类型 配置
OS系统 Ubuntu 24.1 LTS
RAM 8G(要求>=4G)
CPU 2 cores(要求>=2 cores)
硬盘 20G(要求>=30G)
JAVA version 17(要求至少为JAVA 11,不支持Java8)
PostgreSQL version 16(要求>=11)

其中硬盘自行决定,这里20GB仅作为短时间验证使用,存储空间按照官方要求来。

3、docker安装PostgreSQL

由于PostgreSQL在性能和兼容性方面优于MySQL,并且作为官方的推荐使用数据库,这里基于PostgreSQL来进行安装配置:

3.1、拉取PostgreSQL镜像

1
docker search postgres

image-20240911134408955

拉取上图中标红的官方镜像:

1
2
3
docker pull postgres
# 也可指定版本拉取
docker pull postgres:11.5

image-20240911134636344

完成后如下:

image-20240911134752386

查看拉取的镜像:

1
docker images

image-20240911135012288

3.2、创建PostgreSQL容器

创建镜像实例(容器):

  • :容器名称。自定义
  • :账户名
  • :账户密码
  • :数据库名
1
2
3
4
5
6
7
8
9
10
# docker run --name <your-postgres-container-name> -e POSTGRES_USER=<your-postgres-user> -e POSTGRES_PASSWORD=<your-postgres-password> -e POSTGRES_DB=<your-postgres-database> -p 5432:5432 -d postgres
docker run --name postgresql \
--restart=always \
-e POSTGRES_USER=admin \
-e POSTGRES_PASSWORD=123456! \
-e POSTGRES_DB=sonarqube_db \
-p 5432:5432 \
-v /opt/postgres:/var/lib/postgresql/data \
-e ALLOW_IP_RANGE=0.0.0.0/0 \
-d postgres

其中-p后接映射端口,此实例下,将容器PostgreSQL默认端口映射到主机的5432端口上。ALLOW_IP_RANGE=0.0.0.0/0 允许任何主机访问,-v /opt/postgres:/var/lib/postgresql/data,做数据持久化,此目录需确保存在。

执行后,docker ps查看运行的容器:

image-20240911150909155

image-20240911150948080

使用前面的账户名,连接到postgresql容器指定的数据库:

1
2
3
4
# docker exec -it <your-postgres-container-name> psql -U <your-postgres-user> -d <your-postgres-database>
docker exec -it postgresql psql -U admin -d sonarqube_db
# 或进入容器控制台后执行psql -U admin -d sonarqube_db
docker exec -it 143aa13dd734 /bin/bash

psql为postgres控制指令。也可使用其他工具如navicat、datagrip等客户端连接到对应的数据库。

效果如下:

image-20240911140954521

\l查看所有的数据库:

image-20240911141428224

\q退出postgre命令行。

4、使用docker安装sonarqube

4.1、拉取sonarqube镜像

Docker Hub库:https://hub.docker.com/_/sonarqube/tags

根据需要选择对应版本,我这里选择社区版本,拷贝后面的拉取镜像指令:

image-20240911111344715

在Ubuntu执行,拉取sonarqube社区版镜像:

1
docker pull sonarqube:9.9-community

image-20240911112050508

拉取完成如下:

image-20240911112314331

使用docker images查看本地的镜像,可以看到已经有对应镜像:

image-20240911112618908

4.2、创建sonarqube容器实例

1)创建默认数据库实例

我们来根据镜像创建并运行实例,当不指定数据库创建时,默认为H2嵌入式数据库:

1
2
# docker run --name 容器名(可任意) -d -p 内部端口:外部端口 镜像名
docker run --name sonarqube -p 9000:9000 -d sonarqube:9.9-community

运行成功:

image-20240911112904627

之后根据创建时的端口,在Linux设备中浏览器访问对应的地址:http://localhost:9000/ ,初始管理员用户和密码为:admin/admin

image-20240911113325377

登录之后会要求更新密码:

image-20240911113422454

登录之后页面如下:

image-20240911113605657

默认的H2嵌入式数据库有下面几个缺点:

  • 内嵌数据库只能用于测试场景
  • 内嵌数据库无法扩展。
  • 无法升级到新版本的SonarQube。
  • 不支持将数据迁移至其他数据库引擎。

基于这些点,也参考官方推荐,使用postgresql数据库是较好的一种方式。下面来说明如何指定PostgreSQL创建sonarqube创建容器实例。

2)创建指定PostgreSQL数据库实例-推荐

提前在Linux设备创建下面几个目录,做相关的数据存放:

1
mkdir -p /opt/sonarqube/data /opt/sonarqube/extensions /opt/sonarqube/logs /opt/sonarqube/conf

之后,创建PostgreSQL数据库容器实例:

1
2
3
4
5
6
7
8
9
10
11
docker run --name sonarqube \
--restart=always \
-e SONAR_JDBC_URL=jdbc:postgresql://192.168.135.128:5432/sonarqube_db \
-e SONAR_JDBC_USERNAME=admin \
-e SONAR_JDBC_PASSWORD=123456! \
-p 9000:9000 \
-v sonarqube_data:/opt/sonarqube/data \
-v sonarqube_extensions:/opt/sonarqube/extensions \
-v sonarqube_logs:/opt/sonarqube/logs \
-v sonarqube_conf:/opt/sonarqube/conf \
-d sonarqube:9.9-community

通过下面这些参数,将指定Postgresql数据库启动,IP替换为postgresql所在的主机地址,sonarqube_db对应为第三节:3、docker安装PostgreSQL创建的数据库名称:

1
2
3
4
# 注意IP、数据库、用户名、密码不要出现错误!与第三节配置保持一致
-e SONAR_JDBC_URL=jdbc:postgresql://192.168.135.128:5432/sonarqube_db \
-e SONAR_JDBC_USERNAME=admin \
-e SONAR_JDBC_PASSWORD=123456! \

下面路径分别做数据存放:

1
2
3
4
5
6
7
8
# 存储 SonarQube 的数据文件:如索引、分析结果、快照等
-v sonarqube_data:/opt/sonarqube/data \
# 用于存放 SonarQube 的扩展和插件
-v sonarqube_extensions:/opt/sonarqube/extensions \
# 存储 SonarQube 的日志文件
-v sonarqube_logs:/opt/sonarqube/logs \
# 存放 SonarQube 的配置文件
-v sonarqube_conf:/opt/sonarqube/conf \

创建完成后,docker ps -a查看对应的容器状态:

image-20240911155852444

image-20240911155917518

在Linux设备浏览器中访问sonarqube服务对应的地址:http://localhost:9000/ ,默认管理员用户及密码:admin/admin,与上一节相同,更新密码后进入到主界面:

image-20240911160234108

注:切换到postgresql首次启动,初始化时间相对会长一些。

若出现问题,可以通过docker logs -f sonarqube查看对应的日志信息检查错误点,修正后重启容器。sonarqube为容器名称。

5、插件安装

5.1、中文汉化插件安装

进入到插件商城,搜索插件chinese,按下面操作进入到插件主页进行下载:

image-20240911160719504

跳转后到如下仓库,进入发布页面:

image-20240911161651943

选择指定版本,点击下载jar包:

image-20240911161510076

注: 下载的插件版本需要与实际sonarqube版本一致,兼容性表参考:

image-20240911161557274

将下好的插件放置到以下路径:

1
/var/lib/docker/volumes/sonarqube_extensions/_data/plugins

image-20240911163931822

此路径,通过docker inspect 772c017e3e4e检查mounts可查看到,772c017e3e4e为容器ID:

image-20240911163601260

放置好插件之后,执行docker restart 772c017e3e4e重启sonarqube容器生效,772c017e3e4e为容器ID。

image-20240911164136503

之后再进入sonarqube首页,可以看到切换为了中文界面。

image-20240911164251850

5.2、PDF分析报告导出插件

PDF报告导出的功能,官方需要升级到企业版才支持,社区版可通过插件来拓展能力。

1)方案1:pdf-plugin插件

插件仓库:https://gitee.com/zzulj/sonar-pdf-plugin/releases

下载9.x版本:

image-20240912111823791

放置到插件路径:

image-20240912112857575

重启sonarqube容器:

image-20240912113059245

重启后进入sonarqube首页,配置PDF下载的账户:填写账户名及密码

image-20240912113330294

之后在‘项目’->‘更多’中,可以看到有下载PDF的按钮,点击直接下载即可:

image-20240912113515997

需要注意的是,在安装完这个插件之后,首次使用需要进行1次新的扫描,否则无法下载PDF。

此插件,目前实测使用存在问题,sonarqube 9.9 LTS版本在执行完1次扫描后,依旧无法下载,实际使用的话需要考虑一下。

2)方案2:bitegarden Report Plugin

其他生成报告插件,付费插件,此插件有14天试用期:https://www.bitegarden.com/sonarqube-report-documentation

填写相关申请信息下载插件使用,信息内容自定义,无校验:

image-20240919163118559

插件下载完成放到sonarqube插件路径,重启sonarqube容器生效:

1
2
# 插件路径
/var/lib/docker/volumes/sonarqube_extensions/_data/plugins

image-20240919163906210

5.3、配置PMD、findbugs、checkstyle规则插件

image-20240919164857955

根据官方插件适配矩阵,选择对应版本集成相应的规则插件。下载jar包放入插件路径:

1
/var/lib/docker/volumes/sonarqube_extensions/_data/plugins

重启sonarqube容器生效。

5.4、C语言扫描插件

插件仓库:https://github.com/SonarOpenCommunity/sonar-cxx

根据适配矩阵下载插件版本,放入插件路径。重启sonarqube容器使插件生效。

配置C/c++扫描规则:

  • 1、创建质量配置:质量配置->创建->创建空质量配置->语言选择cxx->名称自定义

image-20240919171118223

  • 2、进入质量配置->打开创建的cpp_extra_rule配置->右上角齿轮->激活更多规则

image-20240919171358690

  • 3、进入到代码规则页面:批量修改->激活->选择cpp_extra_rule配置->应用

image-20240919181041344

  • 4、切换默认规则:进入质量配置->cxx配置->cpp_extra_rule右侧齿轮打开菜单->选择设为默认

  • 5、项目配置:进入项目页面->打开项目配置->选择质量配置

image-20240914175949631

  • 6、配置项目语言及文件后缀:

添加新语言:选择CXX->选择cpp_extra_rule配置

image-20240919181821869

进入CXX配置页->修改File suffixes文件后缀->添加下面的后缀(.cxx/,cpp/.cc/.c)

image-20240914175911833

至此,可正常在此项目下进行c语言项目扫描了:

6、手动代码分析

在配置完sonarqube后,进入到主页,我们点击‘手工’尝试一下手动代码扫描:填入显示名、项目标识,点击设置进入下一步

image-20240911170717465

由于暂时还未集成其他系统,这里选择其他CI:

image-20240911171103276

进入令牌创建页,点击创建:

image-20240911171249226

保存令牌并点击继续:创建的令牌可在期限内应用到多项目的扫描中

image-20240911171338640

接着根据项目情况选择类型:

image-20240911171559717

根据下面的步骤进行操作:

image-20240911171809485

  • 1、拷贝第一步中的指令,在windows poershell中执行,下载windows平台的扫描器
1
2
3
4
5
6
7
8
9
10
11
$env:SONAR_SCANNER_VERSION = "4.7.0.2747"
$env:SONAR_DIRECTORY = [System.IO.Path]::Combine($(get-location).Path,".sonar")
$env:SONAR_SCANNER_HOME = "$env:SONAR_DIRECTORY/sonar-scanner-$env:SONAR_SCANNER_VERSION-windows"
rm $env:SONAR_SCANNER_HOME -Force -Recurse -ErrorAction SilentlyContinue
New-Item -path $env:SONAR_SCANNER_HOME -type directory
(New-Object System.Net.WebClient).DownloadFile("https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$env:SONAR_SCANNER_VERSION-windows.zip", "$env:SONAR_DIRECTORY/sonar-scanner.zip")
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::ExtractToDirectory("$env:SONAR_DIRECTORY/sonar-scanner.zip", "$env:SONAR_DIRECTORY")
rm ./.sonar/sonar-scanner.zip -Force -ErrorAction SilentlyContinue
$env:Path += ";$env:SONAR_SCANNER_HOME/bin"
$env:SONAR_SCANNER_OPTS="-server"

image-20240911173131811

  • 2、添加环境变量

系统环境变量中创建SONAR_TOKEN,对应值为令牌内容:

image-20240911173327868

  • 3、在项目目录下执行扫描器,触发扫描:
1
sonar-scanner.bat -D"sonar.projectKey=sonarqube-test-code" -D"sonar.sources=." -D"sonar.host.url=http://192.168.135.128:9000"

进入到项目目录,执行上述扫描指令:

image-20240911175203318

执行完成之后,会出现EXECUTION SUCCESS关键字,sonarqube页面会自动刷新结果:

image-20240911175107785

image-20240911175747525

image-20240911175832610

点击对应项可查看详情:

image-20240912111732661

参考:

https://www.pkslow.com/docs/zh/docker-sonarqube/#_2-1-%E5%AE%89%E8%A3%85

https://blog.csdn.net/qq_44281591/article/details/132252039

https://www.cnblogs.com/lixie0215/p/15341843.html

https://juejin.cn/post/7021019542130262024

https://blog.advance.ai/zh-cn/sonar-qube-topic-0

https://juejin.cn/post/7265614572119490595


Ubuntu docker搭建sonarqube社区版
http://www.codestar.top/2024/10/10/Linux/Ubuntu-docker搭建sonarqube社区版/
作者
mini小新
发布于
2024年10月10日
更新于
2024年10月11日
许可协议