SonarQube 学习笔记

1. SonarQube 简介

1.1 为什么要用 sonarQube?

在我们的日常软件开发工作当中,随着项目时间变长,开发人员编写的代码量也会越来越多。长此以往,会面临代码量庞大,却无法横量整体代码质量?若是要优化,也不知道如何优化。
SonarQube 学习笔记_第1张图片
针对这些问题,出现了各种各样的工具,比如:
java 语言的 Checkstyle,FindBugs,PMD,Jtest 等,帮助检测代码编写规范上存在的问题和漏洞。python 语言的 Pyflakes,Pylint,pep8 等。C# 语言的 FxCop、StyleCop 等。通过这些工具扫描的结果分析后,根据结果来优化代码问题,以提高代码质量。以上这些工具都是代码的静态扫描分析工具。

所谓静态代码分析,就是针对开发人员编写的源代码,在不运行的情况下,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷。在单独使用以上这些工具时,我们会面临:
1、需要一个平台,能够汇总呈现不同语言的项目、不同工具的扫描结果;
2、需要一个平台,可以友好的呈现或者追溯,一段时间内每一次扫描的结果的差异。

sonarQube 就是这样的一个平台:
1)支持多种语言的静态代码扫描。
2)多维护呈现项目代码的质量状态。

1.2 sonarQube 是什么?

1、代码质量和安全扫描和分析平台。
2、多维度分析代码:代码量、安全隐患、编写规范隐患、重复度、复杂度、代码增量、测试覆盖率等。
3、支持 25 + 编程语言的代码扫描和分析,包含 java\python\C#\javascript\go\C++ 等。
4、涵盖了编程语言的静态扫描规则: 代码编写规范 + 安全规范。
5、能够与代码编辑器、CI/CD 平台完美集成。
6、能够与 SCM(软件配置管理) 集成,可以直接在平台上看到代码问题是由哪位开发人员提交。
7、帮助程序猿写出更干净、更安全的代码。

静态扫描主要针对开发人员编写的源代码。通过定义好的代码质量和安全规则,对开发人员编写的代码进行扫描和分析。将分析的结果多维护的呈现出来,以方便开发人员进行代码的优化和规范编写。

1.3 sonarQube 如何工作?

1.3.1 sonar 组成

sonar 静态代码扫描由 2 部分组成:sonarQube 平台,sonar-scanner 扫描器。

  1. sonarQube—web 界面管理平台:

1)展示所有的项目代码的质量数据。
2)配置质量规则、管理项目、配置通知、配置 SCM 等。

  1. sonarScanner—代码扫描工具:

1)专门用来扫描和分析项目代码。支持 20 + 语言。
2)代码扫描和分析完成之后,会将扫描结果存储到数据库当中,在 sonarQube 平台可以看到扫描数据。

  1. sonarQube 和 sonarScanner 之间的关系:

SonarQube 学习笔记_第2张图片

1.3.2 工作流转

![image.png](https://img-blog.csdnimg.cn/img_convert/d530878986efd2047095a3db4bac8898.png#clientId=u966266cb-dbd8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=525&id=u054d75c9&margin=[object Object]&name=image.png&originHeight=525&originWidth=901&originalType=binary&ratio=1&rotation=0&showTitle=false&size=199329&status=done&style=none&taskId=uc5a5261c-793d-4c92-9053-67e3b47b112&title=&width=901)

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

2. SonarQube 安装

SonarQube 学习笔记_第3张图片

  1. 一台SonarQube Server启动3个主要过程:
  • Web服务器,供开发人员,管理人员浏览高质量的快照并配置SonarQube实例
  • 基于Elasticsearch的Search Server从UI进行后退搜索
  • Compute Engine服务器,负责处理代码分析报告并将其保存在SonarQube数据库中
  1. 一个SonarQube数据库要存储:
  • SonarQube实例的配置(安全性,插件设置等)
  • 项目,视图等的质量快照。
  1. 服务器上安装了多个SonarQube插件,可能包括语言,SCM,集成,身份验证和管理插件
  2. 在构建/持续集成服务器上运行一个或多个SonarScanner,以分析项目;

2.1 SonarQube 平台

2.1.1 平台安装

安装包下载:https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.9.56886.zip
安装环境要求:https://docs.sonarqube.org/8.9/requirements/requirements/
默认地址:http:localhost:9000
默认管理员账号:admin/admin

2.1.2 平台启动方式

(1)windows 环境

SonarQube 学习笔记_第4张图片
可能出现的意外情况:StartSonar.bat 打开后,运行几秒钟后退出,此时 Sonar 服务并没有成功启动。
解决办法:打开任务管理器(Ctrl+Alt+Delete),找到 Java™ Platform SE binary,通常情况下会有 2-3 个,结束任务,之后重新双击启动 StartSonar.bat,界面会有提示 SonarQube is up,即成功启动。

(2)Mac 环境

SonarQube 学习笔记_第5张图片

2.1.3 平台汉化

按照下图的点击顺序,进入插件安装页面,搜索框搜索 chinese, 选择中文包,安装中文插件,安装之后,会自动提醒重启服务,点击重启,重启完之后,刷新,就看到中文版的页面。
**注意:**重启后访问出现 502 页面,是由于服务没有全部重启完成导致的,可以多等待一会再试。
SonarQube 学习笔记_第6张图片

2.2 数据库(PostgreSQL)

2.2.1 数据库安装

数据库下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

1. 安装过程

SonarQube 学习笔记_第7张图片
SonarQube 学习笔记_第8张图片
1、Uninstall PostgresSQL and then clean /Library/PostgreSQL/ Directory.
选择上上图中的Cancel取消安装。 删除 /Library/PostgreSQL/这个目录。
2、Open teminal and run :
打开终端界面,运行以下2条命令
sudo dscl . -create /Users/postgres UserShell /bin/sh
sudo dscl . -create /Users/postgres NFSHomeDirectory /Library/PostgreSQL
3、Install PostgresSQL
重新安装PostgresSQL
SonarQube 学习笔记_第9张图片

2. pgAdmin页面

SonarQube 学习笔记_第10张图片
SonarQube 学习笔记_第11张图片
SonarQube 学习笔记_第12张图片

2.2.2 数据库配置

1. 创建 sonar 用户

在General中设置用户名为sonar,Privileges中控制权限。用户名为sonar,密码为sonar:
SonarQube 学习笔记_第13张图片
SonarQube 学习笔记_第14张图片
SonarQube 学习笔记_第15张图片

2. 查询 sonar 用户

SonarQube 学习笔记_第16张图片
SonarQube 学习笔记_第17张图片

3. 创建 sonar 数据库
① 创建数据库

Databases,右键 ,创建数据库。数据库名称为:sonar
SonarQube 学习笔记_第18张图片

② 切换为sonar用户

保存成功之后,可以切换为sonar用户登陆。
SonarQube 学习笔记_第19张图片
SonarQube 学习笔记_第20张图片

4. 配置 SonarQube 数据库连接信息
① 配置数据库地址、用户名、密码

在sonarQube的安装目录的conf目录下,打开sonar.properties。此文件当中,所有支持的数据类型的连接方式都已经放进来了。只需要开放注释,进行配置工作即可。需要配置的参数为:

  • sonar.jdbc.username
  • sonar.jdbc.password
  • sonar.jdbc.url
  • CurrentSchema(默认就是public)

SonarQube 学习笔记_第21张图片

② 重启 sonarQube 服务

重启过程中,sonar会使用配置的数据库,并在数据库中自动创建表格,需要一点时间。重启完成之后,可以在数据库当中看到sonar创建的表:
SonarQube 学习笔记_第22张图片
再次访问sonarQube后,页面底部就不会有如下提示:
image.png

2.3 sonar-scanner

2.3.1 安装

sonar-scanner 下载地址:https://docs.sonarqube.org/8.9/analysis/scan/sonarscanner/
SonarQube Scanner 是默认 Scanner,Sonar 为 Maven、Gradle 等都开发了 Scanner。sonarScanner 4.7 支持 sonarQube8.9+。安装包下载后解压到本地即可。

2.3.2 配置

① 配置连接 SonarQube 服务器

更新 conf/sonar-scanner.properties 文件,配置连接 SonarQube 服务器。
SonarQube 学习笔记_第23张图片

② 配置环境变量

添加 bin 目录到环境变量当中。

  • 新建变量,name=SONAR_SCANNER_HOME。value=G:\develop\sonarqube-7.4\sonar-scanner-3.2.0.1227-windows
  • 打开 path,输入 %SONAR_SCANNER_HOME%\bin;

SonarQube 学习笔记_第24张图片

2.4 项目扫描测试

2.4.1 示例项目代码结构

为什么要了解项目代码结构呢?
1)区分出来,哪些是开发人员写的代码,哪些是引用的第三方包或配置文件等。
2)sonarQube 主要是分析开发人员写的代码质量,对于外部的依赖库这些全部都可以忽略掉。
SonarQube 学习笔记_第25张图片

2.4.2 配置扫描数据

① 添加 sonar-project.properties 文件

在项目根目录下,添加 sonar-project.properties 文件,并配置如下内容:

# must be unique in a given SonarQube instance
sonar.projectKey=my:project  

# --- optional properties ---

# defaults to project key
#sonar.projectName=My project
# defaults to 'not provided'
#sonar.projectVersion=1.0

# Path is relative to the sonar-project.properties file. Defaults to .
#sonar.sources=.

# Encoding of the source code. Default is default system encoding
#sonar.sourceEncoding=UTF-8

② 常用配置参数
  • sonar.projectKey(必填): 的值为你的项目名称,是会显示在sonarQube管理平台上的。要求在SonarQube当中,项目key名唯一。其它项目不能够再取这个名字。
  • sonar.projectName:项目名称。一般与key名一致。
  • sonar.sources:项目下有多个目录。可以指定要扫描的源码目录,多个则用,分隔。主要目的是扫描团队当中开发人员编写的代码 。所以可以根据项目情况来指明。
  • sonar.exclusions:需要排除的文件夹,多个则用,分隔;
  • sonar.go.coverage.reportPaths:Go的覆盖率文件,多个文件以,分隔;
  • sonar.sourceEncoding:指定源码的编码格式,一般都会去指定为UTF-8。
  • sonar.java.binaries(必填):指定java文件编译后class文件目录。
  • sonar.language:指定在扫描当中,只扫描的语言。
  • sonar.host.url :SonarQube 服务器地址;
  • sonar.login:SonarQube 用户创建的一个token;

SonarQube 学习笔记_第26张图片

2.4.3 启动扫描

在项目的根目录下,运行sonar-scanner命令:
在扫描任务完成之后,sonarQube需要将其扫描结果写入数据库,需要一定的时间。扫描的代码量越大,写入数据库的时间相对的也要长一点。
SonarQube 学习笔记_第27张图片
SonarQube 学习笔记_第28张图片

2.4.4 查看扫描结果

在sonar-scanner提示扫描完成之后,访问sonarQube地址( http://localhost:9000/projects ),会看到有1个后台任务正在执行中。等待sonarQube的后台任务处理完成,再去查看项目分析结果:
SonarQube 学习笔记_第29张图片

① Issues(问题) 类型

Bug:编码错误,将破坏您的代码,需要立即修复
漏洞:代码中容易受到攻击的一点
异味:一个可维护性问题,使您的代码混乱且难以维护

② Issues 严重级别

阻塞(Blocked):极有可能影响应用程序的行为的问题,必须立即修复
严重(Critical):可能引起很小的错误或者安全性问题,必须立即检查代码
主要(Main):严重影响开发人员生产力的质量缺陷
次要(Minor):稍微影响开发人员生产力的质量缺陷
提示(Info):不是错误也不是质量缺陷,只是发现

③ Issues 生命周期

Open(打开):SonarQube 发现问题时自动设置为 open
Confirmed(确认):手动确认此问题(解决/误判/不会修复)
Resolved(解决):开发人员处理此问题提交代码后,手动设置为已解决
Reopened(重新开发):关闭后的问题 SonarQube 再次扫描出来,会自动设置为Reopened
Closed(关闭):SonarQube 下次扫描时若问题已处理会自动设置为关闭

3. SonarQube Docker 安装

3.0 Docker 安装

本文使用的硬件环境:

MacOS Catalina 版本:10.15.3
Docker 官方下载 mac 下的 docker app,安装完成即可。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app), 更重要的是容器性能开销极低。Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

SonarQube 学习笔记_第30张图片

3.1 安装 postgresql 数据库

3.1.1 终端命令中,拉取 postgres 镜像

docker pull postgres

SonarQube 学习笔记_第31张图片

3.1.2 运行镜像容器:

 docker run --name db -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -d postgres

–name: 容器名称 此为处 db
**-e:**使用值 docker 将名称为 POSTGRES_PASSWORD,POSTGRES_USER 的环境变量暴露给容器。POSTGRES_PASSWORD 环境变量设置 PostgreSQL 的超级用户密码。您可以设置其他环境变量。这些包括 POSTGRES_USER 和 POSTGRES_DB。此处设置的为:数据库名为 sonar, 超级用户名为 sonar, 密码为 sonar.

  • POSTGRES_USER 设置超级用户名。如果未提供,则超级用户名默认为 postgres。
  • POSTGRES_DB 设置要设置的默认数据库的名称。如果未提供,则默认为 POSTGRES_USER 的值。

**-d: **后台运行容器,并返回容器 ID
SonarQube 学习笔记_第32张图片

3.2 SonarQube 安装与配置

3.2.1 下载 sonarQube 镜像:

docker pull sonarqube

3.2.2 启动 sonar,并配置数据库为 1 中的 postgres

docker run --name sonar --link db -e SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -p 9000:9000 -d sonarqube

–name:容器名称 此为处 sonar
–link:与其它容器通信。
**–link **容器名称 此处为与名为 db 的容器,即 postgres 的数据库。添加了 SONARQUBE_JDBC_URL 环境变量为 jdbc:postgresql:// 容器名称: 端口 / 数据库名称 (数据库连接驱动),添加了 SONARQUBE_JDBC_USERNAME 环境变量为 sonar(数据库连接用户名),添加了 SONARQUBE_JDBC_PASSWORD 环境变量为 sonar(数据库连接密码)
-p: 指定端口映射,格式为:主机 (宿主) 端口: 容器端口
image.png

SonarQube 学习笔记_第33张图片
在浏览器当中,访问:http://localhost:9000
SonarQube 学习笔记_第34张图片
sonarqube 能够正常访问之后,就可以开始扫描项目代码啦。

3.3 项目扫描测试

请参考上一章节。

4. 使用手册

4.1 项目:被扫描的项目

4.1.1 项目首页

SonarQube 学习笔记_第35张图片

4.1.2 (项目)总览

SonarQube 学习笔记_第36张图片
SonarQube 学习笔记_第37张图片

4.1.3 问题

SonarQube 学习笔记_第38张图片

4.1.4 安全热点

SonarQube 学习笔记_第39张图片

4.1.5 指标

SonarQube 学习笔记_第40张图片
Sonar 七个维度检测代码质量:

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

4.1.6 代码

SonarQube 学习笔记_第41张图片
SonarQube 学习笔记_第42张图片

4.1.7 活动

SonarQube 学习笔记_第43张图片

4.2 问题:被扫描项目的问题

所有项目的问题总览。将 Issue 指派给开发人员,处理 Issue。
SonarQube 学习笔记_第44张图片
SonarQube 学习笔记_第45张图片

4.3 代码规则:代码检测规则

SonarQube 学习笔记_第46张图片
SonarQube 学习笔记_第47张图片

4.4 质量配置:分析时使用的规则集合

SonarQube 学习笔记_第48张图片
SonarQube 学习笔记_第49张图片

4.5 质量阀:正常 / 错误

复杂度
  复杂度
  复杂度 / 类
  复杂度 / 文件
  复杂度 / 方法
覆盖率
  分支覆盖
  集成测试的新分支覆盖
  新代码的分支覆盖率
  覆盖率
  新集成测试覆盖
  新覆盖率
  集成测试分支覆盖
  集成测试覆盖
  集成测试覆盖行
  集成测试未覆盖分支
  集成测试未覆盖行
  代码覆盖率
  集成测试的新行覆盖
  新代码覆盖率
  代码行
  集成测试的新行覆盖
  覆盖的新代码
  总体分支覆盖率
  总体新分支覆盖率
  总体覆盖率
  总体新覆盖率
  总体代码覆盖率
  总体新代码覆盖率
  总体覆盖的新行数
  总体未覆盖分支
  总体未覆盖的新分支
  总体未覆盖代码
  总体未覆盖新行数
  单元测试忽略数
  未覆盖分支
  集成测试未覆盖的新分支
  未覆盖新分支
  未覆盖的代码
  集成测试未覆盖的行
  未覆盖的新代码
  单元测试持续时间
  单元测试错误数
  单元测试失败数
  单元测试成功 (%)
  单元测试数
文档
  注释行
  注释 (%)
  公共 API
  公共注释的 API (%)
  公共未注释的 API
重复
  重复块
  重复文件
  重复行
  重复行 (%)
问题
  阻断违规
  确认问题
  严重违规
  误判问题
  提示违规
  违规
  主要违规
  次要违规
  新阻断违规
  新严重违规
  新提示违规
  新违规
  新主要违规
  新次要违规
  开启问题
  重开问题
  不修复的问题
可维护性
  新代码的技术债务
  坏味道
  达到可维护性 A 级所需的工作
  新增坏味道
  技术债务
  技术债务比率
  新代码技术债务比率
  Management
  Burned budget
  Business value
  Team size
可靠性
  Bugs
  新增 Bugs
  可靠性修复工作
  新代码的可靠性修复工作
安全性
  新增漏洞
  安全修复工作
  新代码的安全修复工作
  漏洞
大小
  类
  目录
  文件
  方法
  生成的行数
  生成的代码行数
  行数
  代码行数
  项目
  语句

SonarQube 学习笔记_第50张图片
SonarQube 学习笔记_第51张图片

4.6 配置:系统全局配置

4.6.1 配置

① 通用设置

SonarQube 学习笔记_第52张图片

② 加密

SonarQube 学习笔记_第53张图片

③ 自定义指标

SonarQube 学习笔记_第54张图片

④ 网络调用

SonarQube 学习笔记_第55张图片

4.6.2 权限

① 用户

SonarQube 学习笔记_第56张图片

② 群组

SonarQube 学习笔记_第57张图片

③ 全局权限

SonarQube 学习笔记_第58张图片

④ 全局权限

SonarQube 学习笔记_第59张图片

4.6.3 项目

① 项目管理

一般都会把项目设置为私有,给某些开发人员设置使用项目的权限。
SonarQube 学习笔记_第60张图片
SonarQube 学习笔记_第61张图片

② 后台任务

SonarQube 学习笔记_第62张图片
SonarQube 学习笔记_第63张图片

4.6.4 系统

SonarQube 学习笔记_第64张图片

4.6.5 应用市场

SonarQube 学习笔记_第65张图片

4.6.6 SonarLint 插件

SonarQube 与 Eclipse: http://downloads.sonarsource.com/eclipse/eclipse/

① 独立模式

由于刚安装完插件之后设置是默认打开自动检测的,所以现在你的最底层工具栏里应该会多一项 sonarlint,你打开不同的 Java 文件,检测会自动进行 ,检测结果也会直接展示在那里。
SonarQube 学习笔记_第66张图片

② 连接模式

对于企业级的开发,很多企业可能对代码风格和检查项有自己的要求。这就可以为公司的开发者提供 sonarqube 服务器,在其上进行配置,然后开发者连接以后就可以让 sonarlint 按照公司的定义来进行检查了。
ps:如果不想它自动检查把下图的对勾取消勾选就可以了。
SonarQube 学习笔记_第67张图片
链接的时候,可以选择使用 token 或者账号链接。
token 生成:
SonarQube 学习笔记_第68张图片

SonarQube 学习笔记_第69张图片

配置完后,开始使用

当前项目使用的是默认的质量配置时:
SonarQube 学习笔记_第70张图片

选择某个 java 包:
SonarQube 学习笔记_第71张图片

扫描分析结果:
SonarQube 学习笔记_第72张图片

更换质量配置

当项目的质量配置更换成公司自定义的质量配置。
SonarQube 学习笔记_第73张图片

SonarQube 学习笔记_第74张图片

记得 apply
再次分析:一个都没扫描出来。因为这里使用的是测试的质量配置,没几个规则。
SonarQube 学习笔记_第75张图片

你可能感兴趣的:(开发工具,学习,代码规范)