赞
踩
SonarQube支持多种开发语言,包括但不限于Java、Python、PHP、JavaScript、CSS、C、C++、Go等,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞等问题。其检测范围涵盖了从细微的样式选择到设计错误等多个方面,可以确保代码可靠性,减少技术债务。
SonarQube具有多种功能特性,例如能够结合静态和动态分析工具,持续扫描项目的代码质量;与用户的开发工作流程集成,实现跨项目分支和拉取请求的持续代码检查;提供项目代码质量报告,使开发人员能够更清楚地了解代码的健康状况。
SonarQube可以与多种软件整合进行代码扫描,如Maven、Gradle、Git、Jenkins等,并且会将代码检测结果推送回SonarQube,并在系统提供的UI界面上显示出来。这使得SonarQube成为了一个跨平台、跨语言的代码质量管理工具,能够满足多种场景下的代码质量管理需求。
sonarqube是一个自我管理的自动代码管理工具,SonarQube 是一个开源的代码分析平台, 用来持续分析和评测项目源代码的质量。 通过SonarQube我们可以检测出项目中重复代码,潜在bug,代码规范,安全性漏洞等问题,并通过SonarQube web UI展示出来。
SonarQube主要由四个核心组件组成,它们共同协作以实现代码质量管理。
1、SonarQube服务器:这是SonarQube系统的核心,负责管理代码质量管理流程。它接收来自SonarScanner的数据,处理这些分析结果,并将它们存储在数据库中。此外,SonarQube服务器还提供Web界面,用于配置、管理和查看代码质量报告。开发人员可以通过Web界面浏览查看代码分析结果,进行相应的配置。计算引擎服务器则主要处理代码分析报表,并将这些数据存储在数据库中。
2、SonarQube数据库:这个数据库用于存储SonarQube服务器生成的所有数据。这些数据包括项目元数据、代码质量度量、检测到的问题等。
3、SonarScanner:这是与开发环境接口的工具,负责执行代码的静态分析。它从源代码管理系统中获取代码,根据预定义的规则和标准对代码进行分析,然后将分析结果发送给SonarQube服务器。SonarScanner可以单独部署,也可以集成在如Maven、Gradle等构建工具中。
4、多个Sonar插件:SonarQube通过插件来扩展其核心功能,以支持更多种类的编程语言和代码分析规则。这些插件包括分析各种语言的插件,可以根据项目的需求进行选择和配置。
其基本架构图如下:
sonarqube server上主要有3个应用:
Web服务:为SonarQube用户界面提供服务的。
搜索服务:基于 Elasticsearch 器。
计算引擎:负责处理代码分析报告并将其保存在SonarQube数据库中。
SonarQube 可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题。
(1)不遵循代码标准:sonar 可以通过 PMD、CheckStyle、Findbugs 等知名的静态代码规则分析工具规范代码编写。
(2)潜在的缺陷:sonar 可以通过 PMD、CheckStyle、Findbugs 等知名的静态代码规则分析工具检测出潜在的缺陷。
(3)糟糕的复杂度分布:文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们,且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。
(4)重复:显然程序中包含大量复制粘贴的代码是质量低下的,sonar 可以展示源码中重复严重的地方。
(5)注释不足或者过多:没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降,而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。
(6)缺乏单元测试:sonar可以很方便地统计并展示单元测试覆盖率。
(7)糟糕的设计:通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则,通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况,检测耦合。
另外 SonarQube 也可以生成详细的代码分析质量报告,并通过强大的仪表盘展示出来,使我们能够根据角色的不同,查看不同维度的度量标准。
sonar静态代码扫描由2部分组成:sonarQube平台,sonar-scanner扫描器。
sonarQube: web界面管理平台。
1)展示所有的项目代码的质量数据。
2)配置质量规则、管理项目、配置通知、配置SCM等。
sonarScanner: 代码扫描工具
专门用来扫描和分析项目代码。支持20+语言。
代码扫描和分析完成之后,会将扫描结果存储到数据库当中,在sonarQube平台可以看到扫描数据。
sonarQube和sonarScanner之间的关系:
工作流程介绍
1.开发人员在IDE中开发和合并代码,并将代码签入到DevOps平台。
2.持续集成工具(如jenkins)检查、构建和运行单元测试,集成SonarQube扫描仪分析结果。
3.扫描程序将结果发布到SonarQube服务器,该服务器通过SonarQube界面、电子邮件、IDE内通知(通过SonarLint)和拉入或合并请求的装饰(使用Developer Edition及更高版本时)向开发人员提供反馈。
(1)支持所有语言的检测。一个工具,搞定所有。
(2)灵活扩展,插拔式使用。自定义的代码检测规则,可自定义插件,独立打成JAR包放到SONARQUBE插件目录下,重启即生效,开发使用非常方便。而且自带UT验证框架,开发效率高。
(3)规则支持多租户隔离。租户可定制自己的规则集。
(4)生态强大,业界有诸多插件,与jenkins友好集成。
(5)部署使用便捷。
(6)架构松耦合,通过与maven/jenkins等集成,将代码扫描的计算消耗迁移到业务或者构建方的资源上,极大的提升了自身的吞吐能力。
1.Bugs Bug是出现了明显错误或是高度近似期望之外行为的代码。
2.漏洞 漏洞是指代码中可能出现被黑客利用的潜在风险点。
3.安全热点 安全敏感代码需要手工审核,以便判断是否存在安全漏洞。
4.异味 代码异味会困扰代码的维护者并降低他们的开发效率。主要的衡量标准是修复它们所需的时间。
5.重复率 新代码中的重复行密度 (%),重复行数,重复代码块
6.行数 程序中代码的行数
#从 SonarQube 8.2 开始,官方不再支持 MySQL 数据库,因此这里使用postgresql数据库
官方下载 PostgreSQL: File Browser 本文我用的14版本
[root@ligc_227 ~]# wget --no-check-certificate https://ftp.postgresql.org/pub/source/v14.6/postgresql-14.6.tar.gz
[root@ligc_227 ~]# yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel python-devel gcc-c++ openssl-devel cmake
[root@ligc_227 ~]# tar -zxf postgresql-14.6.tar.gz
[root@ligc_227 ~]# cd postgresql-14.6
[root@ligc_227 postgresql-14.6]# ./configure --prefix=/usr/local/postgresql
[root@ligc_227 postgresql-14.6]# make && make install
[root@ligc_227 postgresql-14.6]# cd /usr/local/postgresql
[root@ligc_227 postgresql ]# mkdir data
[root@ligc_227 postgresql ]# useradd postgresql
[root@ligc_227 postgresql ]# chown -R postgresql. data/
[root@ligc_227 postgresql ]# vim /home/postgresql/.bash_profile
export PGHOME=/usr/local/postgresql #最后一行添加即可
export PGDATA=$PGHOME/data
export PATH=$PATH:$HOME/bin:$PGHOME/bin
这里需要切换到postgres用户下执行下面命令(不支持root下运行)
[root@ligc_227 postgresql-14.6]# su - postgresql #切换用户
[postgresql@ ligc_227 ~]$ cd /usr/local/postgresql/
[postgresql@ ligc_227 postgresql]$ initdb #初始化
[postgresql@ligc_229 ~]$ vim /usr/local/postgresql/data/postgresql.conf
listen_addresses = '*' #60行,取消注释,修改成*;
port = 5432 #64行,取消注释;
[postgresql@ligc_229 ~]$ vim /usr/local/postgresql/data/pg_hba.conf
host all all 0.0.0.0/0 trust
###添加到92行,IPV4local位置的127.0.0.1/32下面;
[postgresql@ ligc_229 ~]$ su - root #切换至root用户;
[root@ ligc_229 ~]# cd postgresql-14.6/contrib/start-scripts/ #切换目录
[root@ ligc_229 start-scripts]# ls
freebsd linux macos # linux文件为Linux系统启动脚本
[root@ ligc_229 start-scripts]# chmod a+x linux #增加执行权限
[root@ ligc_229 start-scripts]# cp linux /etc/init.d/postgresql
#拷贝文件到init.d并改名为postgresql;
[root@ ligc_229 start-scripts]# vim /etc/init.d/postgresql #编辑文件
prefix=/usr/local/postgresql #32行,修改安装目录;
PGDATA="/usr/local/postgresql/data" #35行,修改数据目录;
PGUSER=postgresql #38行,修改运行账号
[root@ ligc_229 start-scripts]# chkconfig --add postgresql #添加启动管理
[root@ ligc_229 start-scripts]# chkconfig postgresql on #开机启动
[root@ ligc_229 start-scripts]# service postgresql start #启动服务
Starting PostgreSQL: ok
[root@ ligc_229 start-scripts] netstat -antup | grep 5432 #查询端口
查询postgres服务状态
[root@ligc_229~]# pg_ctl status
启动postgres服务
[root@ligc_229~]# pg_ctl start
重启postgres服务
[root@ligc_229~]# pg_ctl restart
停止postgres服务
[root@ligc_229~]# pg_ctl stop
[root@ligc_229~]# su - postgresql #切换用户
[postgresql@ligc_229~]$ psql #登录数据库;
postgres=# create user sonarqube with password '123456'; #创建数据库用户sonarqube ,密码为123456
postgres=# alter user sonarqube createrole createdb replication login;
ALTER ROLE #修改用户权限
postgres=# \du
postgres=# create database sonarqube owner sonarqube;
CREATE DATABASE #创建数据库,所属者为sonarqube用户;必须创建这个数据库不然启动会报错
postgres=# \l #查看数据库列表,小写的L
切换数据库
postgres=# \c //切换到test数据库 \c test;
退出数据库用户
postgres=# \q 或者 exit 或者quit
查看数据库用户权限列表
postgres=# \du
#下载网站:https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html
[root@ligc_227~]# yum -y install jdk-11.0.22_linux-x64_bin.rpm
[root@ligc_227~]# java -version
java version "11.0.22" 2024-01-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.22+9-LTS-219)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.22+9-LTS-219, mixed mode)
#下载网站
https://www.sonarsource.com/products/sonarqube/downloads/historical-downloads/
1) 下载软件包
[root@ligc_227~]# wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.2.0.49834.zip
[root@ligc_227~]# mv sonarqube-9.2.0.49834.zip /opt/
2) 解压
[root@ligc_227~]# cd /opt/
[root@ligc_227opt]# unzip sonarqube-9.2.0.49834.zip
[root@ligc_227opt]# ls
sonarqube-9.2.0.49834 sonarqube-9.2.0.49834.zip
3) 创建用户
[root@ligc_227opt]# useradd sonarqube
原因:
其实就是elasticsearch的原因,elsticsearch不能用root启动,sonarqube包含这个组件
4) 修改权限
[root@ligc_227opt]# chown -R sonarqube:sonarqube sonarqube-9.2.0.49834
5) 切换用户并启动
[root@ligc_227 opt]# su - sonarqube
[sonarqube@ligc_227~]$ cd /opt/sonarqube-9.2.0.49834/bin/linux-x86-64
[sonarqube@ligc_227linux-x86-64]$ ./sonar.sh start
Starting SonarQube...
Started SonarQube.
#这个过程需要等待一段时间,或者查看日志。
#查看端口
[root@ligc_227 opt]# netstat -antup |grep 9000
1) 网页登录
输入:http://192.168.10.227:9000
默认账号密码:admin/admin
2) 配置token
有这个token之后,为了重复利用,我们把他作为一个【凭据】保存在jenkins里面,也就是在jenkins里面创建一个凭据。我们回到jenkins,到-系统管理-管理凭据添加一个类型为Secret tex的凭据。
到jenkins的系统管理-工具配置里面,配置一下sonar-scannerr,主要就是告诉jenkins我们要使用哪个版本的scanner
还差一步,那就是最关键的jenkins和sonarqube连接,我们转到 jenkins的 系统管理-系统配置,往下一直拉,找到SonarQube servers
这里我采用的是maven的若依项目进行测试
添加的内容:
sonar.projectKey=demo #去sonarqube上进行配置的,同下列的Name
sonar.projectName=demo
sonar.projectVersion=1.0
sonar.language=java
sonar.sourceEncoding=UTF-8
sonar.sources=$WORKSPACE
sonar.java.binaries=$WORKSPACE
详解:
sonar.projectKey=demo: 这是项目的唯一标识键。在SonarQube服务器上,每个项目通过此键进行识别,确保在同一个SonarQube实例中它是唯一的。尽管直接写在这里的是项目密钥。
sonar.projectName=demo: 这是项目在SonarQube界面中显示的名称,可以是更易读的文本,不一定需要与sonar.projectKey相同,但通常保持一致以便于理解。
sonar.projectVersion=1.0: 指定项目的版本。这对于跟踪不同版本的代码质量非常有用。
sonar.language=java: 指定分析的代码语言。在这个例子中,您正在配置Java项目。
sonar.sourceEncoding=UTF-8: 设置源代码文件的字符编码,确保SonarQube能够正确地读取和分析源代码。
sonar.sources=$WORKSPACE: 指定了要分析的源代码目录。$WORKSPACE是一个环境变量或变量引用,通常在持续集成/持续部署(CI/CD)工具中设置,指向包含源代码的工作空间目录。
sonar.java.binaries=$WORKSPACE: 指定编译后Java字节码的路径。这使得SonarQube能够进行更深入的分析,比如对代码覆盖和复杂度的计算。同样使用了$WORKSPACE作为路径,意味着假设编译输出与源代码位于同一目录下,这在某些情况下可能需要根据实际情况调整。
#创建一个project叫doem
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。