一、SonarQube简介
SonarQube 是一种自动代码审查工具,用于检测代码中的错误、漏洞和代码异味。它可以与您现有的工作流程集成,以实现跨项目分支和拉取请求的持续代码检查。
目前适用于 29编程语言:
1、场景
在典型的开发过程中:
- 开发人员在 IDE 中开发和合并代码,并将他们的代码签入到 DevOps 平台。
- 持续集成 (CI) 工具检查、构建和运行单元测试,集成的 SonarQube 扫描仪分析结果。
- 扫描器将结果发布到 SonarQube 服务器,该服务器通过 SonarQube 界面、电子邮件、IDE 内通知(通过 SonarLint),向开发人员反馈。
2、服务架构
SonarQube 实例包含三个组件:
- SonarQube 服务器运行以下进程:
- 为 SonarQube 用户界面提供服务的 Web 服务器。
- 基于 Elasticsearch 的搜索服务器。
- 负责处理代码分析报告并将其保存在 SonarQube 数据库中的计算引擎。
- 存储以下内容的数据库:
- 代码扫描期间生成的代码质量和安全性指标和问题。
- SonarQube 实例配置。
- 在构建或持续集成服务器上运行的一个或多个扫描器来分析项目。
二、安装条件
1、必须软件
SonarQube是‘基于java语言’开发的,因此SonarQube 的机器上必须安装 Java(Oracle JRE 或 OpenJDK)。
2、硬件要求
- SonarQube 服务器实例需要至少 2GB 的 RAM 才能有效运行,并且需要 1GB 的可用 RAM 供操作系统使用,生产至少8核16GB。
- 您需要的磁盘空间量取决于您使用 SonarQube 分析的代码量。
- SonarQube 必须安装在具有出色读写性能的硬盘上。最重要的是,“data”文件夹包含 Elasticsearch 索引,当服务器启动并运行时,将在这些索引上完成大量 I/O。因此,出色的硬盘读写性能将对 SonarQube 服务器的整体性能产生很大影响。
- SonarQube 在服务器端不支持 32 位系统。然而,SonarQube 在扫描仪端支持 32 位系统。
3、软件选择
基于SonarQube 8.9.8 LTS
3.1 Java
SonarQube 扫描器需要 JVM 版本 8 或 11,SonarQube 服务器需要版本 11。
SonarQube 能够分析任何类型的 Java 源文件,无论基于什么 Java 版本。
3.2 数据库
MySQL 弃用和迁移
从 7.9 版开始,SonarQube 将不再支持 MySQL。要从 MySQL 迁移到受支持的数据库,请参阅MySQL Migrator 工具。
如下表SonarQube支持如下3种数据库,可根据自己需求进行选择,本文选择开源数据库PostgreSQL 13。
3.3 linux环境说明
在 Linux 上运行,则必须确保:
- vm.max_map_count大于或等于 524288
- fs.file-max大于或等于 131072
- 运行 SonarQube 的用户可以打开至少 131072 个文件描述符
- 运行 SonarQube 的用户至少可以打开 8192 个线程
#查看默认值
sysctl vm.max_map_count
sysctl fs.file-max
ulimit -n #指定系统打开的最大文件数,默认值1024,如果超过设定值报error:too many open file
ulimit -u #用户最多可开启的进程数目
可以通过运行以下命令为当前会话动态设置(需要root权限):
sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192
sysctl -w #-w 临时改变某个指定参数的值
要永久地设置这些值,更新_/etc/sysctl.d/99-sonarqube.conf_(或_/etc/sysctl.conf_)
ulimit #临时修改
永久生效: /etc/security/limits.conf是linux资源限制配置文件,需要在root权限下,才能修改/etc/security/limits.conf文件。
centos6 需修改的文件路径为 /etc/security/limits.d/90-nproc.conf ,centos7 需修改的文件路径为 /etc/security/limits.d/20-nproc.conf
注意: 修改完limits.conf文件后,需要重启才能生效,通过ulimit -a检验是否生效。
三、安装配置
1、软件版本及系统配置
1.1 软件版本
软件名 | 软件版本 | IP | 系统 | 配置 |
---|---|---|---|---|
JDK | jdk-11.0.15 | 192.168.223.92 | CentOS 7.9 | 2C/3G |
sonarqube | 8.9.8LTS | 192.168.223.92 | CentOS 7.9 | 2C/3G |
PostgreSQL | postgresql-13 | 192.168.223.92 | CentOS 7.9 | 2C/3G |
jenkins | Jenkins 2.341 | 192.168.223.90 | CentOS 7.9 | 2C/3G |
gilab | 13.12.15 | 192.168.223.91 | CentOS 7.9 | 2C/3G |
1.2 系统配置
# 临时生效
sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192
#查看设置的值
[root@sonarqube ~]# sysctl vm.max_map_count
vm.max_map_count = 524288
[root@sonarqube ~]# sysctl fs.file-max
fs.file-max = 131072
[root@sonarqube ~]# ulimit -n
131072
[root@sonarqube ~]# ulimit -u
8192
- 永久生效
#1)永久修改
[root@sonarqube ~]# vim /etc/sysctl.conf
vm.max_map_count=524288
fs.file-max=131072
## 查看
[root@sonarqube ~]# sysctl -p
vm.max_map_count = 524288
fs.file-max = 131072
#2)永久修改最大打开文件数和最佳进程数
[root@sonarqube ~]# vim /etc/security/limits.conf
* soft nofile 131072
* hard nofile 131072
* soft nproc 8192
* hard nproc 8192
[root@sonarqube ~]# vim /etc/security/limits.d/20-nproc.conf
* soft nproc 8192
root soft nproc unlimited
#检查未生效
[root@sonarqube ~]# ulimit -n
1024
[root@sonarqube ~]# ulimit -u
7184
#需要重启服务器生效,如果不急需重启,先设置临时生效
ulimit -n 131072
ulimit -u 8192
2、部署Jdk
Jdk下载地址:https://www.oracle.com/java/technologies/downloads/#java11-linux
注意: 需登录下载
#1)通过迅雷下载
jdk-11.0.15.1_linux-x64_bin.tar.gz
#2)上传jdk并安装
[root@sonarqube ~]# cd /usr/local/src/
[root@sonarqube src]# tar zxvf jdk-11.0.15.1_linux-x64_bin.tar.gz -C /usr/local/
#创建软连接
[root@sonarqube local]# ln -sv /usr/local/jdk-11.0.15.1 /usr/local/jdk
"/usr/local/jdk" -> "/usr/local/jdk-11.0.15.1"
#3)配置java环境变量
[root@sonarqube ~]# vim /etc/profile
#java
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
[root@sonarqube ~]# source /etc/profile
#测试
[root@sonarqube ~]# java -version
java version "11.0.15.1" 2022-04-22 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.15.1+2-LTS-10)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.15.1+2-LTS-10, mixed mode)
3、部署PostgreSQL
3.1 yum方式安装
访问官方网站
- 选择版本自动生成安装步骤
- 安装Pg数据库
# Install the repository RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Install PostgreSQL:
sudo yum install -y postgresql13-server
- 初始化数据库并启动
# 初始化数据库
sudo /usr/pgsql-13/bin/postgresql-13-setup initdb
#启动数据库
sudo systemctl enable postgresql-13
sudo systemctl start postgresql-13
- 创建postgres用户
注意: postgres中的命令不能以root账户运行,yum源安装自动创建了postgres用户,所以此处再次创建
[root@sonarqube ~]# id postgres
uid=26(postgres) gid=26(postgres) 组=26(postgres)
[root@sonarqube ~]# su - postgres
-bash-4.2$ psql
psql (13.7)
输入 "help" 来获取帮助信息.
postgres=# help
您正在使用psql, 这是一种用于访问PostgreSQL的命令行界面.
键入: \copyright 显示发行条款
\h 显示 SQL 命令的说明
\? 显示 pgsql 命令的说明
\g 或者以分号(;)结尾以执行查询
\q 退出
- 创建sonar用户 和sonarqube数据库
#登录数据库后创建用户
postgres=# create user sonar with password 'yanglt123.';
CREATE ROLE
#创建数据库
postgres=# create database sonarqube owner sonar;
CREATE DATABASE
3.2 开启远程连接
主要修改两个文件:
- postgresql.conf: 配置PostgreSQL数据库服务器的参数。
- pg_hba.conf: 配置对数据库的访问权限;
- 将数据库服务器的监听模式修改为监听所有主机发出的连接请求。
# 修改配置文件:
[root@sonarqube ~]# vim /var/lib/pgsql/13/data/postgresql.conf
listen_addresses = '*'
2. 配置用户的访问权限
[root@sonarqube ~]# vim /var/lib/pgsql/13/data/pg_hba.conf
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
host all all 192.168.223.0/24 scram-sha-256
- 重启服务
[root@sonarqube ~]# systemctl restart postgresql-13
- 测试连接
打开Dbeaver建立连接:
4、部署SonarQube
[安装文档]https://docs.sonarqube.org/8.9/setup/install-server/
[下载地址]https://www.sonarqube.org/downloads/
Version: 9.4,长期支持版本为Version: 8.9.8LTS
4.1 下载软件包
选择长期支持版本8.9.8 LTS
#1)下载软件包
[root@sonarqube ~]# cd /usr/local/src/
[root@sonarqube src]# wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.8.54436.zip
4.2 添加系统用户
[root@sonarqube ~]# useradd sonar
[root@sonarqube ~]# echo "sonar"|passwd --stdin sonar
4.3 解压安装包
[root@sonarqube src]# unzip sonarqube-8.9.8.54436.zip -d /usr/local/
[root@sonarqube src]# cd /usr/local/
[root@sonarqube local]# ln -sv /usr/local/sonarqube-8.9.8.54436 /usr/local/sonarqube
"/usr/local/sonarqube" -> "/usr/local/sonarqube-8.9.8.54436"
#改变属主数组
[root@sonarqube local]# chown -R sonar:sonar /usr/local/sonarqube/
#添加“/”保证所有文件都修改成功
[root@sonarqube local]# ll /usr/local/sonarqube/
总用量 52
drwxr-xr-x 6 sonar sonar 94 4月 1 16:21 bin
drwxr-xr-x 2 sonar sonar 50 4月 1 16:21 conf
-rw-r--r-- 1 sonar sonar 7651 4月 1 16:21 COPYING
drwxr-xr-x 2 sonar sonar 24 4月 1 16:21 data
-rw-r--r-- 1 sonar sonar 40613 4月 1 16:24 dependency-license.json
drwxr-xr-x 7 sonar sonar 132 4月 1 16:38 elasticsearch
drwxr-xr-x 4 sonar sonar 40 4月 1 16:21 extensions
drwxr-xr-x 6 sonar sonar 143 4月 1 16:38 lib
drwxr-xr-x 2 sonar sonar 24 4月 1 16:21 logs
drwxr-xr-x 2 sonar sonar 24 4月 1 16:21 temp
drwxr-xr-x 6 sonar sonar 4096 4月 1 16:38 web
4.4 修改配置文件
#1)切换到sonar用户
[root@sonarqube local]# su - sonar
[sonar@sonarqube ~]$ cd /usr/local/sonarqube/conf/
[sonar@sonarqube conf]$ vim sonar.properties
[sonar@sonarqube conf]$ grep -Ev "^$|^#" sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=yanglt123.
sonar.jdbc.url=jdbc:postgresql://192.168.223.92/sonarqube
4.5 启动服务
$cd /usr/local/sonarqube/bin/linux-x86-64/
$ ./sonar.sh start
Starting SonarQube...
Started SonarQube.
4.6 验证服务
步骤一: 连接PostgreSQL,查看sonarqube数据库是否自动创建了相关的表
步骤二: 检查sonarqube的服务端是否可以正常访问
http://192.168.223.92:9000
5、SonarQube登录配置
5.1 修改密码
默认账户: admin/admin
首次登录,强制修改密码。
注意: 要确保sonarqube数据库已经连上,并已经按照上文步骤验证
- log in
5.2 安装汉化插件
Administration -> Marketplace ->I understand the risk(知晓安装风险之后才会出现install)-> Plugins 中搜索 Chinese pack ,然后Install.
未确认风险:i understand the risk
确认风险后: i understand the risk
Restart Server生效
再次登录已经汉化
四、SonarScanner
1、SonarScanner安装
官方文档:https://docs.sonarqube.org/8.9/analysis/scan/sonarscanner/
#1)登录jenkins服务器下载安装包
root@jenkins ~]# cd /data/devops-tools-install-pkg/
[root@jenkins devops-tools-install-pkg]# wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.7.0.2747-linux.zip
#2)解压安装
[root@jenkins devops-tools-install-pkg]# unzip sonar-scanner-cli-4.7.0.2747-linux.zip -d /usr/local/
#创建软链接
[root@jenkins devops-tools-install-pkg]# ln -sv /usr/local/sonar-scanner-4.7.0.2747-linux /usr/local/sonar-scanner
"/usr/local/sonar-scanner" -> "/usr/local/sonar-scanner-4.7.0.2747-linux"
#3)配置环境变量
[root@jenkins devops-tools-install-pkg]# vim /etc/profile
export Sonar_Home=/usr/local/sonar-scanner
export PATH=$PATH:$JAVA_HOME/bin:$Sonar_Home/bin
[root@jenkins devops-tools-install-pkg]# source /etc/profile
2、获取maven项目
#1)获取maven项目
[root@jenkins data]# git clone https://github.com/YLT001/simple-java-maven-app.git
#2) maven 构建
[root@jenkins simple-java-maven-app]# mvn clean package
#查看打包文件
[root@jenkins simple-java-maven-app]# ls -l target/ | awk '{print $NF}'
classes
maven-archiver
maven-status
my-app-1.1-SNAPSHOT.jar
surefire-reports
test-classes
3、扫描项目
方式一:指定配置文件
方式二:指定参数的方法
使用方式二创建脚本扫描
[root@jenkins simple-java-maven-app]# vim sonar_scan.sh
#!/bin/bash
projectName="demo-service"
scanTime=`date +%Y%m%d%H%M%S`
for((i=1;i<=5;i++))
do
sonar-scanner -Dsonar.host.url=http://192.168.223.92:9000 \
-Dsonar.projectKey=${projectName} \
-Dsonar.projectName=${projectName} \
-Dsonar.projectVersion=${scanTime} \
-Dsonar.login=admin \
-Dsonar.password=yanglt123. \
-Dsonar.ws.timeout=30 \
-Dsonar.projectDescription="my first project!" \
-Dsonar.links.homepage=http://www.baidu.com \
-Dsonar.sources=src \
-Dsonar.sourceEncoding=UTF-8 \
-Dsonar.java.binaries=target/classes \
-Dsonar.java.test.binaries=target/test-classes \
-Dsonar.java.surefire.report=target/surefire-reports
echo "${projectName} scan success!"
done
执行扫描脚本:
[root@jenkins simple-java-maven-app]# chmod +x sonar_scan.sh
[root@jenkins simple-java-maven-app]# ./sonar_scan.sh
执行效果:
参考博客:
https://www.cnblogs.com/mascot1/p/11295048.html
https://blog.csdn.net/qq_23936389/article/details/119312848