代码分析工具 - SonarQube

 1. 常见代码质量分析工具

  • SonarQube:可以分析27多种不同编程语言中的代码,并帮助您提高性能和检测安全漏洞。它由SonarSource的团队开发,对社区免费开源。SonarQube可以添加到您的CI/CD管道中,或者与您选择的代码库托管平台集成,从而帮助执行连续的代码分析。

  • DeepSource:DeepSource是一种静态分析工具,可以智能化测试代码,帮助弄清楚几个关键方面的问题,比如性能、反模式、缺陷风险、安全漏洞、样式和文档问题。

  • Embold:Embold使您可以对软件项目进行静态分析,并提供代码质量报告,其中包括检测到的问题的热图,可帮助您直观地查看导致代码异常的具体组件。它还自称基于AI,可以为您提供建议,以解决这款静态分析工具发现的问题,就像自动校正代码一样。它支持最常见的持续开发策略。可以将其添加到您的GitHub/Bitbucket代码库中,或在您的CI/CD管道中启用它。它对开源项目免费。

  • Veracode:这套工具使您可以执行代码审查、自动测试、静态分析以及必要的补救步骤,以提高软件的性能。Veracode作为一款安全解决方案来销售,可检测并报告程序中的漏洞,同时提供静态分析(SAST)、软件组成分析(SCA)、交互式分析(IAST)和动态分析(DAST)等功能。

  • Codacy:Codacy是一种代码审查自动化工具,支持30多种不同的编程语言。它还随带自托管版本。它使开发人员可以根据要分析的代码选择规则集。UI提供了可视化报告,可帮助团队经理了解代码质量违规现象一再出现的原因。它还与开发团队使用的其他应用程序集成,比如Slack和GitHub。

  • Codebeat:作为一种自动化代码审查工具,Codebeat可以将静态代码分析的结果,收集到一个包含了代码风格、安全漏洞、待改进代码等信息的实时报告中。与流行工具--Code Climate的A到F分级标准类似,Codebeat使用的是4.0的等级系统。不过,与Code Climate不同的是,Codebeat通过使用算法,来分析代码的复杂性。

代码分析工具 成本 支持的语言 优点 缺点
SonarQube 社区版免费,商业版收费 25 种以上的编程语言,包括Java、C#、JavaScript、TypeScript、C/C++、COBOL 及其他。 ① 多语言支持
② 执行安全分析
③ 可与Eclipse、IDEA等IDE 集成
④ 可进行自动化代码检查
① 不会通知用户何时完成耗时的扫描
② 缺乏与Jira和GitHub更紧密的集成
③ 缺少忽略问题的任何方法
DeepSource 免费 Python、JavaScript、Go、Ruby、Java、Docker、SQL、Terraform、Shell ①可使用配置文件生成器进行简单配置
② 可对每个合并请求(PR)进行连续分析
③ 能够保证误报率低于5%
①目前只有SaaS Web应用程序这个版本,CLI版仍在开发中
② 相关材料较少不易于学习和后续使用
③ 支持的前端语言较少
embold 收费 Java、C、C++、C#、Objective-C、TypeScript、JavaScript、Python、PHP、Go、Kotlin、Solidity、SQL。 ① 基于AI提供了代码重构方面的建议。
② 与DevOps易于集成。
③ 视觉和直观的用户界面。
④ 更深入、更快速的检查。
① 缺乏对多语言项目的支持。
② 基于代码行收费的模式存在局限性。
Veracode 收费 Java、.Net、JavaScript、Scala、Python、PHP、Ruby on Rails、ColdFusion、Swift、C/C++、COBOL、Visual Basic 6、RPG,等等 ① 不同测试方法(SAST、DAST、IAST和SCA)的集中式视图。
② 提供渗透测试即服务。
③ 提供安全咨询即服务。
④ 易于配置和快速上手
⑤ 误报率低
⑥ 提供可自定义的仪表板,并带有直观、友好的用户界面
① 缺乏可定制的分析规则
② 缺少Web应用程序界面,用户使用体验欠佳
③ 扫描费时。
Codacy 收费 30 多种语言,包括 Elixir、Go、Java、JavaScript、JSON、Kotlin、Python、Ruby、Scala、Swift、TypeScript 等等 ① 代码审查自动化
② 代码质量分析
③ 安全码分析
④ 集群安装/多实例
⑤  富有洞察力的仪表板。
① 复杂的配置设置
② 缺乏对于问题的搜索能力(个别过滤器除外)
③ 缺乏对于导出代码模式提供支持
④ 大量误报
 Codebeat 公共存储库免费,私有存储库收费。 Python、Ruby、Java、Javascript、Golang、以及Swift等 ① 能够与Slack、GitHub、Bitbucket和GitLab相集成。
② 可检测代码重复。
③ 可以为项目中的流动人员分配不同的访问级别。
① 无法检测安全相关问题。
② 不支持CSS/SCSS的分析。

2. IDEA代码检测插件

2.1 alibaba Java Coding GuideLines

Idea插件使用文档

1)Idea 中搜索插件 Alibaba Java Coding Guidelines,安装重启。

在tools也可看到:

代码分析工具 - SonarQube_第1张图片​​

 2)右击项目或者某个类即可扫描: 

代码分析工具 - SonarQube_第2张图片​​

扫描代码后,将不符合规约的代码按 Blocker/Critical/Major 三个等级显示在下方,双击可以定位至代码处,部分规则右侧窗口还有针对代码的批量修复功能。

在 Snoar 中对代码规则有五个级别,Blocker/Critical/Major 是前三个:崩溃/严重/重要 ,前两级别是必须要处理掉的。

代码分析工具 - SonarQube_第3张图片​​

如果不想让某个规则在代码右侧标黄,可以把他去掉

代码分析工具 - SonarQube_第4张图片​​

 右击规则,可以在这里禁用,禁用了可以不标黄,这个规则也去掉了,但是再次扫描的时候又会出来。。

代码分析工具 - SonarQube_第5张图片​​

 3)提交代码时,勾选Alibaba Code Guidelines选项,可检测要提交的代码:

代码分析工具 - SonarQube_第6张图片​​

2.2 SonarLint

1)Idea 中搜索插件 SonarLint,安装重启。

代码分析工具 - SonarQube_第7张图片

 2)右击项目或者某个类即可扫描: 

​​

 代码分析工具 - SonarQube_第8张图片​​

IDEA代码检测插件,总有一款适合你-技术圈

3. 代码质量分析工具 SonarQube

官网:Try Out SonarQube | SonarQube Docs

3.1 SonarQube 简介

sonar是一款静态代码质量分析工具,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,而且能够集成在IDE、Jenkins、Git等服务中,方便随时查看代码质量分析报告;

代码分析工具 - SonarQube_第9张图片​​

sonar通过配置的代码分析规则,从可靠性、安全性、可维护性、覆盖率、重复率等方面分析项目,风险等级从A~E划分为5个等级;同时,sonar可以集成pmd、findbugs、checkstyle等插件来扩展使用其他规则来检验代码质量;

代码分析工具 - SonarQube_第10张图片​​

 sonar设置了质量门,通过设置的质量门评定此次提交分析的项目代码是否达到了规定的要求;

代码分析工具 - SonarQube_第11张图片​​

 Sonar可以从以下七个维度检测代码质量。

  •  不遵循代码标准:sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。
  • 潜在的缺陷:sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的缺陷。
  • 糟糕的复杂度分布:文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员 难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。
  • 重复:显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示 源码中重复严重的地方。
  • 注释不足或者过多:没有注释将使代码可读性变差,特别是当不可避免地出现人员变动 时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。
  • 缺乏单元测试:sonar可以很方便地统计并展示单元测试覆盖率。
  • 糟糕的设计:通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包 

需要用到的软件有:SonarQube、Sonar-scanner。

  • SonarQube为代码检查的server,并提供可视化界面;
  • Sonar-scanner为client。用于收集检查数据并且发送到server中。也就是传统的C/S关系

 代码分析工具 - SonarQube_第12张图片​ 

3.2 sonar的组成

一个 sonar 项目主要有以下四个组件构成:

 代码分析工具 - SonarQube_第13张图片​ 

1)一台 SonarQube Server 启动 3 个主要过程:

  • Web服务器,供开发人员,管理人员浏览高质量的快照并配置SonarQube实例
  • 基于Elasticsearch的Search Server从UI进行后退搜索
  • Compute Engine服务器,负责处理代码分析报告并将其保存在SonarQube数据库中

2)一个SonarQube数据库要存储:

  • SonarQube实例的配置(安全性,插件设置等)
  • 项目,视图等的质量快照。

3)服务器上安装了多个SonarQube插件,可能包括语言,SCM,集成,身份验证和管理插件

4)在构建/持续集成服务器上运行一个或多个SonarScanner,以分析项目;

3.3 工作流转

以下架构图为 sonar 项目的工作流转图: 

 代码分析工具 - SonarQube_第14张图片​ 

  •  开发人员在其IDE中进行编码,并使用SonarLint运行本地分析。
  • 开发人员将其代码推送到他们最喜欢的SCM中:git,SVN,TFVC等。
  • Continuous Integration Server会触发自动构建,并执行运行SonarQube分析所需的SonarScanner。
  • 分析报告将发送到SonarQube服务器进行处理。
  • SonarQube Server处理分析报告结果并将其存储在SonarQube数据库中,并在UI中显示结果。
  • 开发人员通过SonarQube UI审查,评论,挑战他们的问题,以管理和减少技术债务。
  • 经理从分析中接收报告。Ops使用API​​自动执行配置并从SonarQube提取数据。运维人员使用JMX监视SonarQube Server。 

4. SonarQube 的安装及使用

4.1 SonarQube 版本分类

SonarQube分为社区版,开发者,企业版和数据中心版4种,目前我们选择的是社区版。

版本功能比较统计:

① 社区版(免费) :在CI / CD中采用代码质量的起点

② 开发者版(收费):最大应用程序安全性跨分支机构和PR的最大值

③ 企业版(收费) :管理您的应用程序组合,在企业级别启用代码质量和安全性。

④ 数据中心版(收费) :高可用性,适用于全球部署

代码分析工具 - SonarQube_第15张图片

4.2 安装工具列表

  • SonarQube 9.7:代码分析

  • JDK 11 :运行 SonarQube 必备条件

  • PostgreSQL 13:存储扫描规则和历史扫描记录信息(非必须,SonarQube有内置H2数据库,但是无法扩展,也无法升级到新版本的SonarQube,并且不能支持将你的数据迁移至其他数据库引擎)

  • Sonar Scanner 4.7:Scanner是在本地执行扫描分析的工具(非必须,使用Maven进行代码扫描也可以)

安装包下载地址:https://download.csdn.net/download/weixin_44210965/86927617

SonarQube 与 JDK 和 MySQL 都有版本对应,查看 SonarQube 与 JDK、数据库 版本对应:

例如 SonarQube 9.7 对应JDK 11,PostgreSQL 13。

SonarQube 7.6, 对应 JDK8,MySQL 版本>=5.6 && <8.0。(sonarqube从7.8起,不再支持mysql)(要安装对版本,比如mysql要求5.6或者5.7 你要是使用8.0 就会失败,亲测--)

例如,如使用SonarQube 7.6,配置的是MySQL 8.0,就会报错:

为了解决这个报错,在连接url后面加了这个:allowPublicKeyRetrieval=true

sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarTest?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false&allowPublicKeyRetrieval=true

再启动 sonarQube,又报错了:这里是 sonarQube 初始化建表的时候失败了,原因是建表语句中的“groups”在MySQL 5.7的时候不是关键字,但是到了MySQL8就是关键字了。这里我看了下源码,sonarQube的建表语句是在代码里面动态生成的,考虑到要修改这个地方的话,不仅建表语句需要修改,插入表以及查询表等语句都要修改,所以就不再尝试连接MySQL8了,还是用5.7吧。

2022.10.21 21:16:58 ERROR web[][DbMigrations] #1 'Create initial schema': failure | time=1368ms
2022.10.21 21:16:58 ERROR web[][DbMigrations] Executed DB migrations: failure | time=1371ms
2022.10.21 21:16:58 ERROR web[][o.s.s.p.Platform] Web server startup failed
java.lang.IllegalStateException: Fail to execute CREATE TABLE groups (id INTEGER NOT NULL AUTO_INCREMENT,name VARCHAR (500) NULL,description VARCHAR (200) NULL,cr
eated_at DATETIME NULL,updated_at DATETIME NULL, CONSTRAINT pk_groups PRIMARY KEY (id)) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin
at org.sonar.server.platform.db.migration.step.DdlChange$Context.execute(DdlChange.java:97)

4.3 JDK11 安装

openJDK下载地址:Archived OpenJDK GA Releases

#把下载好的JDK放到指定目录(我这里放到了/usr/java目录),然后解压
tar -xzvf jdk-11.0.14_linux-x64_bin.tar.gz
    
#修改环境配置文件
vim /etc/profile
    
    #配置文件中配置Java环境变量
    JAVA_HOME=/usr/java/jdk-11.0.1
	PATH=$PATH:$JAVA_HOME/bin
	CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
	export JAVA_HOME CLASSPATH PATH

#刷新配置文件使之生效
source /etc/profile

#查看java版本
java -version

4.4 PostgreSQL13 安装

PostgreSQL13 安装

4.5 SonarQube 安装

SonarQube下载地址:Download | SonarQube

Windows环境从零搭建SonarQube 7.4(稳定版) - 简书

以下为Linux的安装流程:

1) 上传文件及解压

(我这里是上传到了/opt/sonar目录,也可上传到/usr/local目录)

unzip sonarqube-9.7.0.61563.zip

2)创建用户

useradd sonar
passwd sonar

赋予权限

chown -R sonar.sonar /opt/sonar/sonarqube-9.7

3)切换用户,启动SonarQube

su  sonar
cd /opt/sonar/sonarqube-9.7/bin/linux-x86-64
./sonar.sh start

如果报错了可以在 /opt/sonar/sonarqube-9.7/logs 路径下看日志。

如:

less /opt/sonar/sonarqube-9.7/logs/web.log

4)浏览器测试

(端口在 sonar.properties 文件中配置。sonar web 默认为9000,search默认为9001。根据自己需求,可不修改)

浏览器测试地址:localhost:9000

用户名:admin

密码:admin

代码分析工具 - SonarQube_第16张图片

4.6 汉化

汉化插件包下载:Releases · xuhuisheng/sonar-l10n-zh · GitHub

代码分析工具 - SonarQube_第17张图片

 汉化包有版本对应的,版本不对应汉化会失败。jar包下载好后,直接扔到 /extensions/plugins(我的目录是/opt/sonar/sonarqube-9.7/extensions/plugins)目录夹下(记得修改下 Jar 包的权限,不然 sonar 用户可能读不到),重启sonar即可。

代码分析工具 - SonarQube_第18张图片

4.7 配置数据库

(因为SonarQube有内置数据库,如果只是简单的试试sonarQube的话,这一步也可以省略)

#修改配置:sonar.properties
[sonar@-uat conf]$ vim /opt/sonar/sonarqube-9.7/conf/sonar.properties

    #如需要自定义端口 需要更改端口 sonar web 默认为9000 search默认为9001。根据自己需求,可不修改
    sonar.web.port=60001
    # sonar表示数据库名字
    sonar.jdbc.url=jdbc:postgresql://localhost/sonardatabase?currentSchema=public
    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar

修改配置文件之后重启 sonarQube。

我这里重启之后报错了:

2022.11.02 12:24:58 ERROR es[][o.e.b.Bootstrap] node validation exception
[2] bootstrap checks failed. You must address the points described in the following [2] lines before starting Elasticsearch.
bootstrap check failure [1] of [2]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
bootstrap check failure [2] of [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
2022.11.02 12:24:58 INFO  es[][o.e.n.Node] stopping ...
2022.11.02 12:24:58 INFO  es[][o.e.n.Node] stopped

解决:

max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
# 每个进程最大同时打开文件数太小,可通过下面2个命令查看当前数量
ulimit -Hn
ulimit -Sn

修改/etc/security/limits.conf文件,增加配置,用户退出后重新登录生效,注意带* 号

[root@-uat ~]# vim /etc/security/limits.conf

    *               soft    nofile          65536
    *               hard    nofile          65536

代码分析工具 - SonarQube_第19张图片

 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

修改 /etc/sysctl.conf 文件,添加vm.max_map_count参数。

[root@-uat ~]# vim /etc/sysctl.conf

	vm.max_map_count = 262145

[root@-uat ~]# sysctl -p

 重启sonarQube。

可以看到配置的数据库中 sonar 已经创建了很多表:

 进入到页面之后,底部的数据库提示也消失了。

 代码分析工具 - SonarQube_第20张图片

 ok,数据库集成成功。

5. 项目扫描

5.1 本地使用 Sonar Scanner 进行项目扫描

1)下载 Sonar Scanner 扫描器

Sonar Scanner扫描器根据SonarQube版本会有对应的扫描器版本, 下载地址:SonarScanner | SonarQube Docs

 下载下来之后解压:

代码分析工具 - SonarQube_第21张图片

 把bin目录配置到%PATH%环境变量中:

在D:\sonarQube\sonarQube9.7\sonar-scanner-4.7.0.2747-windows\conf目录下找到sonar-scanner.properties文件并修改。

添加 sonar.java.binaries 参数,不然下面使用Sonar Scanner扫项目的时候会报错。

sonar.java.binaries=target/classes

如果不加的话报错:

ERROR: Error during SonarScanner execution
org.sonar.java.AnalysisException: Your project contains .java files, please provide compiled classes with sonar.java.binaries property, or exclude them from the analysis with sonar.exclusions property.

2)创建项目令牌

选择添加项目的方式:

 代码分析工具 - SonarQube_第22张图片

填写项目名称及标识

 代码分析工具 - SonarQube_第23张图片

 代码分析工具 - SonarQube_第24张图片

为项目创建访问令牌:

进行项目扫描时,登录token可以一个项目使用一个,也可以创建一个全局token,所有项目都使用这个:

代码分析工具 - SonarQube_第25张图片

 设置编程语言以及获取令牌,这里使用其他构建技术:

 ​代码分析工具 - SonarQube_第26张图片

2)本地扫描项目

在要扫描的项目路径下执行刚刚看到的命令:

sonar-scanner.bat -D"sonar.projectKey=activity" -D"sonar.sources=." -D"sonar.host.url=http://10.*.*.*:60001" -D"sonar.login=sqp_bc7e99dfaf3e19108e4d"

执行完命令之后就可以在页面上看到项目了:

代码分析工具 - SonarQube_第27张图片

5.2 本地使用 Maven 方式进行项目扫描

使用 maven 技术进行扫描:

代码分析工具 - SonarQube_第28张图片

 在项目路径下面执行命令:

sonar:sonar  -Dsonar.host.url=http://10.*.*.*:60001  -Dsonar.login=sqp_724c426d55763fc45e0b0c0 -Dsonar.java.binaries=target/classes -Dsonar.projectKey=JanetTestProject

由于我本地使用的是 JDK 8,与SonarQube版本不对应,报错了:

org/sonar/batch/bootstrapper/EnvironmentInformation has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

升级为JDK11之后,再执行命令就ok了。

代码分析工具 - SonarQube_第29张图片

集成到线上也差不多是这个流程。

5.3 SonarQube 集成 GitLab Runner

sonar-scanner 镜像下载:sonar-scanner-cli-latest镜像-Java文档类资源-CSDN下载

1)gitLab创建令牌

代码分析工具 - SonarQube_第30张图片

2)sonarQube 中配置

代码分析工具 - SonarQube_第31张图片

 代码分析工具 - SonarQube_第32张图片

 集成完成:

代码分析工具 - SonarQube_第33张图片

添加项目:

代码分析工具 - SonarQube_第34张图片

 选择项目:

代码分析工具 - SonarQube_第35张图片

 选择方式:

代码分析工具 - SonarQube_第36张图片

代码分析工具 - SonarQube_第37张图片

代码分析工具 - SonarQube_第38张图片

注明:

1)这里创建令牌会生成一个该项目专属的项目token,你在配置token的时候,可以使用这个,也可以创建一个全局token,所有项目都使用这个:

代码分析工具 - SonarQube_第39张图片


2)这里的SonarQube令牌环境变量和网址环境变量可以在GitLab中配置上(这两个变量是项目级别的,不是全局的,每个项目都要设置),那么在执行扫描命令- sonar-scanner的时候就不用加这两个参数了。如果没有在GitLab中配置,那么执行扫描命令的时候就要添加-Dsonar.host.url参数和-Dsonar.login参数。(无论在GitLab配不配置这两个环境变量都需要点击创建令牌的哈,注意有效期,如果设置的有效期比较短,过期了就不能用了,我这里选的是永久有效)

① 在GitLab配置SonarQube令牌环境变量和网址环境变量:

代码分析工具 - SonarQube_第40张图片

点击添加变量之后:

代码分析工具 - SonarQube_第41张图片

添加好变量之后,下面第3步yml中的执行命令则为:

- sonar-scanner -Dsonar.projectKey=[项目key] -Dsonar.sources=. -Dsonar.java.binaries=target/classes

② 不在GitLab添加变量,则下面第3步yml中的执行命令为:

- sonar-scanner -Dsonar.projectKey=[项目key] -Dsonar.sources=. -Dsonar.host.url=[sonarQube地址加端口] -Dsonar.login=[项目登录token] -Dsonar.java.binaries=target/classes

 代码分析工具 - SonarQube_第42张图片

3)GitRunner 配置 yml 文件

下面的sonar-scanner命令如果已经在GitLab中配置了SonarQube令牌环境变量和网址环境变量,就不用添加-Dsonar.host.url参数和-Dsonar.login参数。我这里是GitLab没配置,所以这里添加上了(当然,在GitLab中设置环境变量会好一点哈,把变量设置为隐藏变量,降低泄露风险)。

扫描代码:
  stage: sonarstage
  image: [镜像地址]/cicd/sonar-scanner-cli:latest
  tags:
    - ${GITLAB_RUNNER_INSTALL_TAGS}
  script:  
    - echo "开始代码扫描~"
    - sonar-scanner -Dsonar.projectKey=[项目key] -Dsonar.sources=. -Dsonar.host.url=[sonarQube地址加端口] -Dsonar.login=[项目登录token] -Dsonar.java.binaries=target/classes
    - echo "代码扫描结束~"
  cache:
    key: ${CI_COMMIT_REF_NAME}
    paths:
      - target/
  only:
     - branch-dev

执行完成:

 SonarQube 页面就可以看到项目了:

代码分析工具 - SonarQube_第43张图片

4)GitLab定时任务进行代码扫描

如果不想每次都在流水线中进行代码扫描,就可以设置一个定时任务进行代码扫描。

① 修改yml配置中的only参数:

only这个参数之前我们默认的是代码分支名(在哪个分支可以执行扫描代码这个job),现在我们不想在普通流水线上执行扫描代码这个job,就可以把only设置为schedule,只在定时任务中执行。

扫描代码:
  stage: sonarstage
  image: [镜像地址]/cicd/sonar-scanner-cli:latest
  tags:
    - ${GITLAB_RUNNER_INSTALL_TAGS}
  script:  
    - echo "开始代码扫描~"
    - sonar-scanner -Dsonar.projectKey=[项目key] -Dsonar.sources=. -Dsonar.host.url=[sonarQube地址加端口] -Dsonar.login=[项目登录token] -Dsonar.java.binaries=target/classes
    - echo "代码扫描结束~"
  cache:
    key: ${CI_COMMIT_REF_NAME}
    paths:
      - target/
  only:
     - schedule

如果想在定时任务中只执行编译代码(这个是必须要的,扫描代码是基于编译后的class源码进行扫描分析的)和扫描代码,不想执行别的job(例如打包镜像),就可以在打包镜像的那个job中添加参数:except,值为schedules,意思就是这个job不在定时任务中的流水线执行。

代码分析工具 - SonarQube_第44张图片

② 在GitLab中设置一个定时任务:

还可以试着执行一下:

果然只有这两个编译代码和扫描代码job,大功告成。可以去SonarQube Web 页面看下扫描结果有没有更新。

代码分析工具 - SonarQube_第45张图片

6. SonarQube Web 页面基本功能介绍

  • 项目维护:被扫描的项目

  • 问题处理:被扫描项目的问题

  • 代码规则:代码检测规则

  • 质量配置:质量配置是在分析时使用的规则集合。可以启用或者禁用某些规则。外部规则导入

  • 质量阈:正常/错误。可以指定一些指标条件时为错误,比如bug数大于某个值时为错误

  • 配置功能:编辑SonarQube实例的全局属性设置(可配置需要包含或需要排除扫描的源文件、新代码周期),账号设置,账号权限设置,邮箱设置,PDF报告配置等

6.1 项目维护

  • 显示项目搜索的条件过滤器

  • 显示所有添加的项目

  • 显示项目扫描的主要指标情况

  • 显示项目的检测配置信息

代码分析工具 - SonarQube_第46张图片

点击项目,可进入项目维护明细界面,包括问题分类、问题分级、 问题解决、 代码健康指标、 代码问题查看、活动热点、项目报告导出等功能。

  • 显示项目触发的质量阈条件。

  • 显示项目的新代码及全代码的扫描情况。

  • 显示项目扫描的SQALE评级。

  • SQALE评级: SQALE全称是Software Quality Assessment based on Lifecycle Expectations,是一套评估代码质量的方法

  • 可靠性评级计算方法(bug):根据扫描的项目问题中bug的严重等 级进行的评级算法。

  • 安全性评级计算方法(漏洞):根据扫描的项目问题中漏洞的严重 等级进行的评级算法。

  • 可维护性评级计算方法(技术债务):根据项目的技术债务及异味 问题数量进行的评级算法。

代码分析工具 - SonarQube_第47张图片

用户访问权限配置

添加完项目后,项目创建人默认拥有管理员权限,授权给团队其他人员仅设置浏览、查看源码、问题管理员、管理安全热点即可。

代码分析工具 - SonarQube_第48张图片

 代码分析工具 - SonarQube_第49张图片

 ① 浏览:访问一个项目,浏览它的指标,创建 / 编辑它的问题。

② 查看源码:查看项目的源代码。(用户也需要“浏览”权限)

③ 问题管理员:对问题进行额外编辑:设置误判 / 不会修复,修改问题严重级别。(用户也需要“浏览” 权限)

④ 管理安全热点:通过"安全热点"检测漏洞。驳回,清理,接受,重开"安全热点"(用户也需要"浏览"权限)

⑤ 管理员:查看项目配置,执行管理任务。(用户也需要“浏览”权限)

⑥ 执行分析:可以获取执行分析的所有配置(包含安全配置,比如密码),并可以将分析结果推送至 SonarQube服务器。

6.2 问题处理

问题面板提供对问题代码的详细展示、任务分配、解决状态标识、解释为何是问题、潜在风险、如何解决、提供Code Example、添加评论等功能。

左侧是过滤器,可以对于扫描的问题进行条件筛选,包括严重程度、处理方式、状态、规则、负责人、 文件等条件;右侧是对应的源码扫描出的问题。

代码分析工具 - SonarQube_第50张图片

① 类型:一条规则定义的类型,有4种:bug,漏洞,异味,安全热 点时单独的。

② 严重程度:有5种:阻断,严重,重要,次要,提示。

③ 状态:5种:打开,解决,重开,关闭,确认

④ 负责人:问题被分配给了谁。

⑤ 修复预估时间:系统给的预计修复时间

⑥ 评论:可以对每一条问题的修复情况进行评论说明。

6.3 代码规则

代码规则是SonarQube展示所有内置规则的面板,可以查看规则面板,也可以调整规则的状态,如调整规则为激活状态,或者调整为挂起。

代码分析工具 - SonarQube_第51张图片

 可以新建一个质量配置,然后自定义规则进去。

规则的运用:

点开规则有详细的注解:解释为何是问题、错误案例Demo、解决方案;规则默认分类:Bug,漏洞,异味,安全热点,不可进行修改;规则默认严重性:阻断、 严重、主要、次要、提示,不可进行修改,但根据扫描出的问题的严重层级是可进行调整的;

6.4 质量配置

质量配置是SonarQube的核心组件之一,可以在其中定义规则集以适应不同的项目需要。

代码分析工具 - SonarQube_第52张图片

 外部规则导入:SonarQube支持第三方扫描规则,如FindBugs、CheckStyle、PMD等,可以导入规则插件进行应用。

详细步骤可见下面的 ‘SonarQube 集成阿里 p3c 规则’。

6.5 质量阈

质量阈是一系列基于指标的布尔表达式。它可以帮助我们实时了解项目是否已经满足生产要求了。理想情况下,所有项目使用相同的质量阈。每个项目的质量阈状态都会展示在首页。

代码分析工具 - SonarQube_第53张图片

 ① 创建:根据统一标准,制定新的质量阈。

② 添加条件:对新创建的质量阈添加新代码和全代码的触发条件。

③ 改名:修改质量阈名称;复制:复制一个质量阈以创建新的质量 阈。

④ 编辑/删除:可以调整质量阈的条件或者删除某一个条件。

⑤ 可以查看当前默认的质量阈及其对应的新代码和全代码的触发条件。

如果分析结果不满足默认质量阈任何一个条件,首页项目的质量阈状态就是失败,还会显示是不满足哪一条:

代码分析工具 - SonarQube_第54张图片

6.6 配置功能

配置是编辑SonarQube实例的全局设置,如邮件通知配置、PDF报告设置、全局扫描文件过滤器配置、ALM集成配置、用户或用户组 配置、权限配置、插件下载、服务器升级等。

代码分析工具 - SonarQube_第55张图片

 ① 配置:包括通用配置、加密、网络调用配置。

② 权限:包括用户、群组、全局权限、权限模板配置。

③ 项目:管理所有的项目及查看所有项目的扫描后台记录。

④ 系统:查看SonarQube的服务器信息及相关系统配置信息

⑤ 应用市场:查看、安装、卸载插件,升级SonarQube付费版。

7. SonarQube 集成阿里 p3c 规则

7.1 下载插件集成到 SonarQube 中

下载插件:Release pmd-3.2.0-beta-with-p3c1.3.6-pmd6.10.0 · rhinoceros/sonar-p3c-pmd · GitHub

代码分析工具 - SonarQube_第56张图片

然后把 target/sonar-pmd-plugin-3.2.0-SNAPSHOT.jar 更新到 sonarqube 服务器上的 /opt/sonar/sonarqube-9.7/extensions/plugins目录中(如果有旧的pmd插件,需要删除),jar 包给 sonar 用户授权。

更新后启动sonarqube。

重启之后就可以看到 p3c 的规则了:

7.2 质量配置

这里需要新建一个质量配置,应用 p3c 规则。

代码分析工具 - SonarQube_第57张图片

代码分析工具 - SonarQube_第58张图片

激活规则:​

代码分析工具 - SonarQube_第59张图片

其实把规则导入进来之后,就相当于往原来的规则池里面加入了新的规则。如果你新建了质量配置,是可以在这个规则池里面选规则的,SonarQube 原来的规则以及新增的p3c的规则都可以添加进去。

过滤器那里搜一下p3c的规则(我这里就只添加p3c的规则,不要SonarQube 原来的规则):

代码分析工具 - SonarQube_第60张图片

把这些规则应用到刚刚我们创建的配置中:

代码分析工具 - SonarQube_第61张图片

然后在质量配置中把我们的规则设置为默认:

代码分析工具 - SonarQube_第62张图片

至此,p3c规则成功集成到Sonar中。

下面测试一下是否成功了:

在本地进行代码扫描(这里还是使用mvn命令)

sonar:sonar -Dsonar.host.url=http://*.*.*.*:60001 -Dsonar.login=4977379b8765bbfcb88c -Dsonar.java.binaries=target/sonar

可以看到新的统计已经出现了p3c的规则:

 代码分析工具 - SonarQube_第63张图片

说明p3c规则已经集成成功了。

7.3 P3C自定义规则

开发步骤:sonar-java/CUSTOM_RULES_101.md at master · SonarSource/sonar-java · GitHub

下载源码地址:Tags · alibaba/p3c · GitHub

扩展Alibaba P3C 实现自定义代码规范检查 - 灰信网(软件开发博客聚合)

SonarQube 自定义规则开发 - 吴思老 - 博客园

P3C-PMD自定义规则实战_ouyangshixiong的博客-CSDN博客_pmd 自定义规则

idea p3c 自定义_扩展阿里p3c实现自定义代码规范检查_米线抄手麻辣烫的博客-CSDN博客

8. 调用 web 接口

SonarQube 提供了 web 接口给我们获取分析结果的相关数据:

SonarQube 调用 Api 是需要认证的,这里提供了两种方式:使用token或者是账号密码:

代码分析工具 - SonarQube_第64张图片

​例如:

#使用token:
[admin@uat sonar]$ curl -u squ_c9371c32fee554313: http://localhost:60001/api/measures/search?projectKeys=activity\&metricKeys=bugs
{"measures":[{"metric":"bugs","value":"107","component":"activity","bestValue":false}]}


#使用账号密码:
[admin@uat sonar]$ curl -u admin:admin http://localhost:60001/api/measures/search?projectKeys=activity\&metricKeys=bugs
{"measures":[{"metric":"bugs","value":"107","component":"activity","bestValue":false}]}

如果用 token 方式请求,可以生成一个不会过期的token(tokne记得保存下来,只会出现一次):

代码分析工具 - SonarQube_第65张图片

如果想要在postman中测试请求的话,可以再请求头中加上Cookie(可以在浏览器中拿)

代码分析工具 - SonarQube_第66张图片

代码分析工具 - SonarQube_第67张图片

​8.1 查询主要分析结果

url:http://localhost:60001/api/measures/search?projectKeys=org.example:JanetTestProject&metricKeys=alert_status

参数:

① projectKeys:项目标识

web主页面右下角可以看到:

② metricKeys 查询类型

  • "bugs": Bugs
  • "vulnerabilities": 漏洞  
  • 'code_smells': 异味 
  • 'coverage': 覆盖率 
  • 'duplicated_lines_density': 重复 
  • 'alert_status':   质量阀是否正常

 代码分析工具 - SonarQube_第68张图片

 代码分析工具 - SonarQube_第69张图片

8.2 根据查询结果阻断 GitRunner 流程

项目.gitlab-ci.yml文件中关键stage:

扫描代码:
  stage: sonarstage
  image: [镜像地址]/cicd/sonar-scanner-cli:latest
  tags:
    - ${GITLAB_RUNNER_INSTALL_TAGS}
  script:  
    - echo "开始代码扫描~"
    - sonar-scanner -Dsonar.projectKey=[项目key] -Dsonar.sources=. -Dsonar.host.url=[sonarQube地址加端口] -Dsonar.login=[项目登录token] -Dsonar.java.binaries=target/classes
    - chmod a+x sonarqube_scan.sh  
    - ./sonarqube_scan.sh
    - echo "代码扫描结束~"
  cache:
    key: ${CI_COMMIT_REF_NAME}
    paths:
      - target/
  only:
     - branch-dev

shell脚本:sonarqube_scan.sh

#!/bin/sh

resquestResult=""
bugsValue=0

resquestResult=$(curl -u [登录token,上面有说到]: http://[sonarQubeip地址+端口]/api/measures/search?projectKeys=[项目key]\&metricKeys=bugs)
echo "http请求结果:"$resquestResult

bugsValue=$(echo $resquestResult | awk -F '"' '{print $10}')

echo "Bug 数量为:"$bugsValue

if [ $bugsValue -gt 0 ]
then
        echo "bug数量大于0,请及时处理bug!!!!!!!!"
        exit 1
fi

执行结果:

代码分析工具 - SonarQube_第70张图片

9. 授权GitLab登录

9.1 授权GitLab登录

登录GitLab,通过Applications添加API接口,授权给Sonar使用。

代码分析工具 - SonarQube_第71张图片

Redirect URI地址为: http://[sonar地址]:[端口]/oauth2/callback/gitlab

代码分析工具 - SonarQube_第72张图片

9.2 ALM集成

登录Sonar,通过ALM集成中的配置功能,授权给Gitlab。(填上刚刚在GitLab那里显示的应用程序ID以及密码)

 代码分析工具 - SonarQube_第73张图片

 代码分析工具 - SonarQube_第74张图片

代码分析工具 - SonarQube_第75张图片

配置好之后,在登录页面就可以用gitlab登陆了:

代码分析工具 - SonarQube_第76张图片

 使用 GitLab 登录进去之后顶部就没有配置配置栏了。

代码分析工具 - SonarQube_第77张图片

10. 系统配置

系统配置:其可以管理系统的通用配置,如项目的通用配置、邮箱配置、系统用户配置、系统权限配置、查看系统环境信息等

10.1 邮箱配置

代码分析工具 - SonarQube_第78张图片

代码分析工具 - SonarQube_第79张图片

配置测试地址:

代码分析工具 - SonarQube_第80张图片

 收到的邮件:

代码分析工具 - SonarQube_第81张图片

10.2 PDF Report配置

免费版需安装PDF打印插件,并在配置PDF打印权限,才可产生PDF扫描报告。


参考文章:

比较9款代码质量工具,看看哪款更好用

Sonar-扫描插件自定义扩展_M哥聊技术的博客-CSDN博客_扫描插件

P3C-PMD自定义规则实战_ouyangshixiong的博客-CSDN博客_pmd 自定义规则

你可能感兴趣的:(软件安装,开发工具,开发问题记录笔记,sonarqube)