SonarQube
是什么:
- 是devops中的一个测试阶段使用的扫描工具,SonarQube 就是一个自动化测试的框架,主要可以进行代码的质量进行扫描,可以通过jenkins工具借助进行实现自动化部署过程中的扫描操作,支持多语言(Java, Python, JavaScript, C, C++, Go, PHP…),可以和 CI/CD(Jenkins, GitLab CI, GitHub Actions 等)集成。它是分为社区版,企业版,可以先选用社区版(支持检测的语言类型较少)。
官方地址:
https://www.sonarsource.com/
文档地址:
https://docs.sonarsource.com/sonarqube-server/latest/
社区版文档:
https://docs.sonarsource.com/sonarqube-community-build/
1.安装
- 注意版本Java版本不同,不同的版本支持的数据库不同。
1-1.安装数据库
1.mysql下载
官方地址:https://downloads.mysql.com/archives/community/
2.下载二进制文件
wget -O /opt/mysql.tar.gz https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
3.卸载maridb的依赖,防止运行mysql数据库冲突
yum clean all && yum makecache # 清除缓存下载新缓存
yum remove -y mariadb-libs
rm -rf /etc/my.conf
yum install wget vim -y # 下载工具
4.解压缩配置mysql并且设置PATH环境变量
tar -zxf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz && mv mysql-5.7.28-linux-glibc2.12-x86_64 mysql-5.7.2
ln -s /opt/mysql-5.7.28-linux-glibc2.12-x86_64 /opt/mysql # 设置软连接
# 设置全局环境变量
vim /etc/profile
PATH=/usr/local/mysql/bin/:${PATH}:/opt/mysql-5.7.2/bin/
source /etc/profile # 重载
which mysql # 验证环境变量
5.检查需要的依赖,安装依赖
ldd /opt/mysql/bin/mysqld # 如果缺少就进行安装
yum install -y libaio-devel
6.创建数据存储目录与启动用户
useradd -M -s /bin/nologin mysql
mkdir -p /mysql_db/
chown mysql.mysql -R /mysql_db/
chown mysql.mysql -R /opt/mysql*
7.初始化数据库 # 默认无密码
--user=指定启动进程用户
--basedir=指定当前程序所在的根目录
--datadir=指定当前数据库存储的目录
mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql-5.7.28/ --datadir=/mysql_db/
#错误: 上面命令出现错误:[ERROR] mysqld: unknown option ‘–initialize-insecure’
mysqld --initialize --user=mysql --basedir=/opt/mysql-5.7.28/ --datadir=/mysql_db/
# 如果还是错误:使用mysql_install_db进制命令进行mysql初始化
mysql_install_db --user=mysql --basedir=/opt/mysql-5.7.28/ --datadir=/mysql_db/
8.创建配置文件
vim /etc/my.cnf
[mysqld]
user=mysql
basedir=/opt/mysql-5.7.28/
datadir=/mysql_db/
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
9.通过systemctl命令管理启动mysql
将mysql提供的启动脚本拷贝到/etc/init.d/使用systemctl进行管理
# 脚本:support-files/mysql.server
cp /opt/mysql/support-files/mysql.server /etc/init.d/ # 拷贝
systemctl daemon-reload # systemctl重新加载/etc/init.d/mysqld 这个脚本,才能启动
systemctl start mysql # 就是通过systemctl 命令调用 /etc/init.d/mysql.server 脚本启动
10.连接数据库
mysql -uroot -p # 默认没有密码,根据版本不同初始化的情况不同有些有密码,有些没有。
11.设置root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
12.创建sonarqube的数据库
mysql -uroot -p123456 -e 'create database sonar CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;' # 创建
mysql -uroot -p123456 -e 'show databases;' # 验证
1-2.安装Sonarqube
1.安装前:又去内部嵌入了Elasticsearch。
sysctl -w vm.max_map_count=524288 # 控制一个进程控制内存映射区最大数量
sysctl -w fs.file-max=131072 # 打开全局文件描述符最大值
ulimit -n 131072 # 用于管理用户级别的资源限制,每个进程可以打开的最大文件描述符数量
ulimit -u 8192 # 用户最大可以创建的进程或者线程数
2.下载Sonarqube(当前使用的7.0版本) # 在文档中直接下载最新的社区版本
下载文件地址:https://binaries.sonarsource.com/
社区版的历史:https://binaries.sonarsource.com/?prefix=Distribution/sonarqube/
3.安装java # 注意需要根据官方提供的版本进行下载安装
yum install -y java # 使用的是7.0 使用的java 8
java -version # 版本查询
4.解压下载的sonarqube7.0,设置软连接
unzip sonarqube-7.0.zip # 解压
ln -s /opt/sonarqube/sonarqube-7.0 /opt/sonarqube-7.0 # 设置软连接
# 在这个目录下存在各种平台的执行程序,全部平台都兼容的
ls ./sonarqube-7.0/bin
5.设置账户专门启动sonarqube
useradd -M -s /bin/nologin sonar
chown sonar.sonar -R /opt/sonarqube-7.0
chown sonar.sonar -R /opt/sonarqube
6.修改配置文件
cp /opt/sonarqube-7.0/conf/sonar.properties{,.bak} # 拷贝配置文件
vim /opt/sonarqube-7.0/conf/sonar.properties # 修改
# 修改内容如下,主要修改数据
sonar.jdbc.username=root
sonar.jdbc.password=123456
# 远程连接需要远程的授权账户jdbc:mysql://远程地址即可:3306/
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
7.修改启动脚本文件
# /opt/sonarqube-7.0/bin/linux-x86-64/sonar.sh 是sonarqube的启动脚本文件
修改参数 RUN_AS_USER=sonar
grep '^RUN_AS' /opt/sonarqube-7.0/bin/linux-x86-64/sonar.sh # 查看是否修改成功
8.创建sonar脚本,让systemctl进行管理soanr
cat >/usr/lib/systemd/system/sonar.service<<'EOF'
[Unit]
Description=sonar
[Service]
ExecStart=/opt/sonarqube-7.0/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube-7.0/bin/linux-x86-64/sonar.sh stop
Type=forking
User=sonar
Group=sonar
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
9.启动sonarqube,查看
systemctl start sonar # 默认端口是 9000
1-3.关于Sonarqube的日志文件说明
1.日志文件目录
ssonarqube-7.0/logs
2.日志文件有
logs/ce.log # 计算引擎日志。记录代码分析报告的处理过程,比如你用 sonar-scanner 上传结果后,SonarQube 会在这里接收和处理。如果项目分析并没有出现展示可以查看这里报错
logs/access.log # 记录 HTTP 请求(方法、路径、响应码、耗时)。调试 API 调用、监控流量情况。
logs/es.log # 内置 Elasticsearch 的日志。索引的创建、查询、存储相关的操作和错误。如果内存不足或者ulimit设置不当这里会报错
logs/sonar.log # 主日志文件。要是进程启动、停止的信息,以及 JVM 参数、配置加载情况。通过这个日志确定是否正常启动或者为什么不启动。
logs/web.log # Web 进程日志。和 Web 服务器 (Spring、Elasticsearch HTTP 接口、认证、UI 访问) 相关的事件。页面打不开,认证失败、端口冲突等问题,都可以从这里找。
2.使用
默认账户:admin
默认密码:admin
2-1.导入中文插件
官方插件说明:
https://docs.sonarsource.com/sonarqube-server/latest/server-installation/plugins/plugin-version-matrix/
1.soanrqube的插件目录
ssonarqube-7.0/extensions/plugins
2.将原来的插件进行备份
cp -a /opt/sonarqube-7.0/extensions/plugins /opt/sonarqube-7.0/extensions/plugins_bak
3.在将准备的插件解压到这个 ssonarqube-7.0/extensions/plugins 文件夹内
tar -zxf /opt/sonar_plugins.tar.gz -C /opt/sonarqube-7.0/extensions/ # 插件存在重复,需要删除重复的插件在进行启动
4.重启查看是否汉化
systemctl restart sonar
2-2.sonar创建第一个项目
# 登录后创建,在第一次登录时会出现手动创建项目,如果跳过后就无法在进行创建(社区版)。
1.通过sonar-scanner工具创建
1.sonar扫描器的下载地址以及说明:
https://docs.sonarsource.com/sonarqube/latest/analyzing-source-code/scanners/sonarscanner/
2.在用户中创建一个令牌:
6cefa0b325add1957963c4c9de4ec8553ccc5cc0
3.解压下载的sonar-scanner,设置软连接,添加环境变量 sonar-scanner-4.0.0.1744-linux
sonar-scanner -v # 在进行验证
2.通过sonar-scanner工具执行项目创建
sonar-scanner \
-Dsonar.projectKey=test123 \ # 设置项目的key,必须唯一,同一个 SonarQube 实例里不能重复
-Dsonar.projectName=test123 \ # 设置项目的名称,只是显示使用,但是与key性质形同
-Dsonar.sources=. \ # 源码所在的目录位置
-Dsonar.host.url=http://192.168.85.152:9000 \ # 当前sonar服务器地址
-Dsonar.login=6cefa0b325add1957963c4c9de4ec8553ccc5cc0 # 设置的令牌
# 执行命令
sonar-scanner -Dsonar.projectKey=test123 -Dsonar.projectName=test123 -Dsonar.sources=. -Dsonar.host.url=http://192.168.85.152:9000 -Dsonar.login=6cefa0b325add1957963c4c9de4ec8553ccc5cc0
3.简单理解这条命令参数作用
sonar-scanner 就是需要安装的sonar扫描器的脚本
根据 -Dsonar.host.url 找到当前的sonar服务器
根据 -Dsonar.login 与sonar服务器进行一个登录认证
根据 -Dsonar.sources 通过sonar扫描器进行扫描代码将数据上传mysql(其他版本可能不是mysql)数据库
根据 -Dsonar.projectKey 将mysql数据库的【扫描代码数据】与这个【key的项目】进行绑定,那么数据就在这个项目中展示
2-3.扫描器说明
# sonar-scanner 就是 sonarqube的扫描器,也是客户端。将源代码(如 Java, Python, C#, JavaScript 等)发送到 SonarQube 服务器进行分析,并根据服务器上定义的代码质量规则生成检测报告。
# 注意:
sonar要扫描的话,需要下载各个语言的插件,比如 python 或者 java 需要更多的插件支持,社区版的插件少,只有企业版的功能多(付钱)。另外版本也是问题,如果你的sonar的版本太低,很多插件不兼容。建议保留之前下载的插件存储。
3.将soarn与jenkins进行结合使用
过程:
- 开发将代码存放到gitl仓库中。
- 测试在jenkins的工作区中对代码进行扫描,将扫描的结果发送给sonar服务端记录。
- 运维在进行构建部署操作。
机器准备:
机器地址 作用 192.168.85.152 部署sonar服务端(192.168.85.152:9000) 192.168.85.149 部署gitlab服务(192.168.85.149:80) 192.168.85.150 部署jenkins服务(192.168.85.150:8080)
3-1.jenkins里添加sonarqube的凭证
# 作用:添加服务器地址和认证令牌
1.添加凭证 # 将sonar的令牌进行添加,注意需要jenkins支持sonarqube的插件
系统管理 -> 系统设置
2.添加sonar的服务器地址,与sonarqube的名称。
3.添加sonar凭证,在选择添加的凭证并且保存。
3-2.jenkins中设置sonar扫描器的路径
# 作用:在执行时,可以找到这个sonar扫描器命令进行执行
1.添加sonar的扫描器
系统 -> 全局工具 -> sonarqube server
2.添加扫描工具的路径和名称
# 注意:
1.如果是sonar是远程的话,需要在jenkins这个台服务器本地下载一个soran扫描工具
2.如果是jenkins与sonar(安装服务端与扫描器)在一台机器上的话,就不需要安装
理解:说白了就是让jenkins执行这个 sonar-cli 的命令,所以需要当前服务器安装后扫描器的安装路径
3-3.jenkins中添加构建
1.添加gitlab的仓库地址选择秘钥
2.添加sonar构建
sonar.projectName=${JOB_NAME} # 就是执行sonar时的名称 ${JOB_NAME} 就是当前job的项目名
sonar.projectKey=html # 设置key
sonar.sources=. # 因为jenkins操作都在工作目录(拉去代码或者其他操作),那么就使用当前目录
命令对比:
sonar-scanner \
-Dsonar.projectKey=linux0224 \ # 就是 sonar.projectName=${JOB_NAME}
-Dsonar.projectKey=linux0224 \ # sonar.projectKey=html
-Dsonar.sources=. \ # sonar.sources=.
-Dsonar.host.url=http://192.168.19.100:9000 \
-Dsonar.login=cd8b18aabedc1157f4856c62a17d8eca93f3a4d3
3.需要将这个sonar构建操作,在部署建构之前
1.开发先开发代码上传到gitlab
2.测试进行测试功能(使用sonar代替)
3.运维进行部署项目 # 当前测试没有这个操作,可以进行添加后续部署操作
4.SonarQube新版安装
# 注意防火墙问题:
systemctl stop firewalld
systemctl disable firewalld
1.java环境与数据库要求:
https://docs.sonarsource.com/sonarqube/latest/requirements/prerequisites-and-overview/
2.安装过程
1.sonar新版安装zip包下载地址
https://www.sonarsource.com/products/sonarqube/deployment/zip-file/
2.关于数据参数配置说明
https://docs.sonarsource.com/sonarqube/latest/setup-and-upgrade/install-the-server/installing-sonarqube-from-zip-file/
3.安装PostgreSQL
https://www.postgresql.org/ftp/source/
4.安装对应版本java
3.安装源与基本工具
1.配置阿里源
mkdir -p /etc/yum.repos.d/repos && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/repos
curl -s -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
curl -s -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
2.安装基础库
yum install vim curl gcc make glibc-devel net-tools wget -y
4-1.安装数据库
# PostgreSQL 为例:
1.下载数据库
wget https://ftp.postgresql.org/pub/source/v15.0/postgresql-15.0.tar.gz
2.解压
tar -zxf postgresql-15.0.tar.gz && mv postgresql-15.0 postgresql15
3.安装依赖环境
yum install autoconf automake openssl-devel zlib-devel libxml2-devel libjpeg-devel libpng-devel libcurl-devel libxslt-devel icu-devel libselinux-devel openldap-devel perl libperl-devel readline-devel
4.进入解压文件,编译源码
# 一定要查看他的安装说明,进行安装环境
cd postgresql15 && mkdir -p /usr/local/postgresql && ./configure --prefix=/usr/local/postgresql
make && make install
5.添加一个用户以存储数据的文件夹
useradd postgre
mkdir /postgre_data
# 对数据文件进行授权
chown postgre.postgre /postgre_data
6.设置环境变量
echo "export PATH=${PATH}:/usr/local/postgresql/bin/" >> /etc/profile
source /etc/profile
7.初始化数据库
su - postgre
initdb -D /postgre_data
8.启动测试
# 使用初始化命令进行启动
pg_ctl -D /postgre_data -l logfile start
createdb test
psql test
4-2.数据库的配置
1.当安装后,数据库配置文件会存储到初始化数据库的目录中
#port = 5432 默认监听地址为5432
# postgre_data 初始化数据目录
/postgre_data/postgresql.conf # 配置PostgreSQL数据库服务器的相应的参数。
/postgre_data/pg_hba.conf # 配置对数据库的访问权限。
2.修改数据库配置,可以远程访问
vim /postgre_data/postgresql.conf
listen_addresses = 'localhost' 改为 listen_addresses = '*' # 修改
vim /postgre_data/pg_hba.conf
host all all 0.0.0.0/0 trust # 添加
3.使用systemctl管理prosgre
# 所在目录
/opt/postgresql15/contrib/start-scripts/
1.拷贝脚本
cp /opt/postgresql15/contrib/start-scripts/linux /etc/init.d/postgresql
2.设置执行权限
chmod a+x /etc/init.d/postgresql
3.修改脚本中得两个变量
vim /etc/init.d/postgresql
1.prefix="数据安装所在的家目录"
2.PGDATA="初始化数据库文件所在的目录"
3.PGUSER="初始化数据目录授权用户"
4.重载systemcl
systemctl daemon-reload
4.启动数据库
systemctl start postgre
6.切换用户,创建授权用户与数据库
su - postgre
# 进入命令行(进入你当前用户名所对应的数据库,如果你的用户名是自定义的,请使用createdb 数据库),如果出现错误,请使用createdb 数据库,比如当前我的postgre,就需要创建一个数据库名为postgre,然后输入psql进入命令才可以,默认自带的数据库是postgres
psql
create user pg password 'pg';
ALTER ROLE pg SUPERUSER;
create database sonar;
4-3.安装java
1.下载:
https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html
# 使用rpm安装,简单速度快
wegt https://download.oracle.com/java/17/archive/jdk-17.0.9_linux-x64_bin.rpm
2.解压,当前下载的时解压即用的
yum -y loaclinstall jdk-17.0.9_linux-x64_bin.rpm
3.查看版本
java -version
4-4.安装Sonarqube
1.下载
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-10.3.0.82913.zip
2.解压,设置一个软连接
unzip sonarqube-10.3.0.82913.zip
ln -s /opt/sonarqube-10.3.0.82913 /usr/local/sonarqube
3.创建启动用户,设置授权
useradd -M -s /bin/nologin sonar
chown sonar.sonar -R /opt/sonarqube-10.3.0.82913
4.配置文件设置
1.备份配置文件
cp /opt/sonarqube-10.3.0.82913/conf/sonar.properties{,.bak}
2.修改配置
cat > /opt/sonarqube-10.3.0.82913/conf/sonar.properties << 'EOF'
sonar.jdbc.username=pg
sonar.jdbc.password=pg
# 远程连接需要远程的授权账户
sonar.jdbc.url=jdbc:postgresql://localhost/sonar
EOF
5.脚本中需要java的变量 # 添加显式配置
echo "export SONAR_JAVA_PATH=/usr/bin/java" >> /etc/profile
6.启动sonar,进行访问 # 还是可以设置成为一个systemctl管理的脚本进行操作
bash /opt/sonarqube-10.3.0.82913/bin/linux-x86-64/sonar.sh start
# 注意:添加中文插件/获取其他插件
如果下载失败,可能是网络问题,需要在,查看下载失败报错日志,根据提示,获取url,在自己的电脑上下载,然后上传到 /opt/sonarqube-10.3.0.82913/extensions/plugins,重启sonar即可。
4-5.sonar-cli扫描器
1.创建项目 # 可以进行手动创建项目
2.创建项目,使用cl工具
1.下载扫描器
https://docs.sonarsource.com/sonarqube/latest/analyzing-source-code/scanners/sonarscanner/
https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-5.0.1.3006-linux.zip
2.解压
3.设置环境变量
# 设置token值
export SONAR_TOKEN=sqp_831f44d43ecabc4192ee4baac4be91de37e729da
# 设置环境变量
echo "export PATH=${PATH}:/opt/sonar-scanner-5.0.1.3006-linux/bin/" > /etc/profile
source /etc/profile
4.执行命令
sonar-scanner \
-Dsonar.projectKey=linuxsonar \
-Dsonar.sources=. \
-Dsonar.host.url=http://192.168.19.138:9000
4-6.安装问题
4-6-1.问题1
问题内容:
2024.01.05 13:40:38 ERROR es[][o.e.b.Elasticsearch] node validation exception
[2] bootstrap checks failed. You must address the points described in the following [2] lines before starting Elasticsearch. For more information see [https://www.elastic.co/guide/en/elasticsearch/reference/8.11/bootstrap-checks.html]
bootstrap check failure [1] of [2]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]; for more information see [https://www.elastic.co/guide/en/elasticsearch/reference/8.11/_file_descriptor_check.html]
bootstrap check failure [2] of [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]; for more information see [https://www.elastic.co/guide/en/elasticsearch/reference/8.11/_maximum_map_count_check.html]
1.文件描述符不足(进程可以打开的最大文件(文件/资源)数量的值,进程达到了后无法再打开新的文件了)
# max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
1.使用 root用户 修改内核参数
vim /etc/sysctl.conf
fs.file-max = 65535 # 添加
1.切换到启动 "elasticsearch" 用户查看 # elasticsearch进程启动的用户
ulimit -n
2.切换root用户修改
vim /etc/security/limits.conf # 打开文件
# user 是运行 elasticsearch 进程启动用户
<username> soft nofile 65535 # 软限制:立即生效为65535
<username> hard nofile 65535 # 硬限制:最高也只能到65535
例如:用户是 elasticsearch 就这样设置
elasticsearch soft nofile 65535 # 软限制:立即生效为65535
elasticsearch hard nofile 65535 # 硬限制:最高也只能到65535
# 补充:关于sofr与hard的说明
soft:
1.当前用户会话实际生效的限制值。进程打开的文件描述符数量不能超过这个值。
2.目的:作为当前的、可调整的操作限制。
3.用户可以通过 ulimit -n <新值> 临时调整值
hard:
1.Soft Limit 能够设置的上限。用户不能自行将 Soft Limit 调整得比 Hard Limit 还高。
2.目的:防止用户或进程无限制地消耗系统资源,提供最终的安全保障。
3.只有 root才能修改这个hard这个值
理解:
<username> soft nofile 65535 # 默认生效65535
<username> hard nofile 131072 # 但允许在需要时临时翻倍,最高的可以打开文件描述符的值最大就是131072,只有root可以设置值的大小。
1.普通用户只能在自己的会话中将 Soft Limit 调高(但不能超过 Hard Limit 的 131072)
2.root用户可以 Hard Limit 的值
4.root用户重新加载
sysctl -p
5.切换 "elasticsearch" 用户是否生效
ulimit -n
2.虚拟内存映射区域数量不足
# vm.max_map_count [65530] is too low, increase to at least [262144];
1.切换root 用户修改 vm.max_map_count
echo "vm.max_map_count=262144" >> /etc/sysctl.conf # 永久修改
sudo sysctl -w vm.max_map_count=262144 # 临时修改
# 说明:vm.max_map_count 是 Linux 内核参数
1.它定义了一个进程可以拥有的内存映射区域(Memory Map Areas) 的最大数量。
2.Elasticsearch 严重依赖内存映射文件来高效访问索引数据。如果这个值太低,会导致无法创建新的索引或甚至使节点崩溃。
# 理解:
vm.max_map_count:进程在内存中使用的映射到磁盘的真实数据所在位置的一个索数量,它是在内存中存储。限制开启这个索引数量值。
可以理解为它是一本数据的目录,只记录书某章节标题对应的具体页面,不记录任何内容(就是索引),Elasticsearch可以根据它快速的找到用户需要的内容。(数值越大,Elasticsearch管理的内容就越多)。
2.root用户重新加载
sysctl -p
3.进行查看确认
sysctl -p
vm.max_map_count = 262144
4-6-2.问题2
# 无法以root启动
解决方式:
创建一个用户,对sonar目录进行授权,切换到这个用户来启动sonar