SonarQube 学习笔记

1. SonarQube 简介

1.1 为什么要用 sonarQube?

在我们的日常软件开发工作当中,随着项目时间变长,开发人员编写的代码量也会越来越多。长此以往,会面临代码量庞大,却无法横量整体代码质量?若是要优化,也不知道如何优化。
image.png
针对这些问题,出现了各种各样的工具,比如:
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 之间的关系:

image.png

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 安装

4f70ba7b-af32-406d-b6d8-b81843bf6e5f.png

  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 环境

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

(2)Mac 环境

image.png

2.1.3 平台汉化

按照下图的点击顺序,进入插件安装页面,搜索框搜索 chinese, 选择中文包,安装中文插件,安装之后,会自动提醒重启服务,点击重启,重启完之后,刷新,就看到中文版的页面。
**注意:**重启后访问出现 502 页面,是由于服务没有全部重启完成导致的,可以多等待一会再试。
5ff59710-7031-4580-841f-61d3973cdf2f.png

2.2 数据库(PostgreSQL)

2.2.1 数据库安装

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

1. 安装过程

image.png
image.png
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
image.png

2. pgAdmin页面

image.png
image.png
image.png

2.2.2 数据库配置

1. 创建 sonar 用户

在General中设置用户名为sonar,Privileges中控制权限。用户名为sonar,密码为sonar:
image.png
image.png
image.png

2. 查询 sonar 用户

image.png
image.png

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

Databases,右键 ,创建数据库。数据库名称为:sonar
image.png

② 切换为sonar用户

保存成功之后,可以切换为sonar用户登陆。
image.png
image.png

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

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

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

image.png

② 重启 sonarQube 服务

重启过程中,sonar会使用配置的数据库,并在数据库中自动创建表格,需要一点时间。重启完成之后,可以在数据库当中看到sonar创建的表:
image.png
再次访问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 服务器。
image.png

② 配置环境变量

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

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

image.png

2.4 项目扫描测试

2.4.1 示例项目代码结构

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

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;

image.png

2.4.3 启动扫描

在项目的根目录下,运行sonar-scanner命令:
在扫描任务完成之后,sonarQube需要将其扫描结果写入数据库,需要一定的时间。扫描的代码量越大,写入数据库的时间相对的也要长一点。
image.png
image.png

2.4.4 查看扫描结果

在sonar-scanner提示扫描完成之后,访问sonarQube地址( http://localhost:9000/projects ),会看到有1个后台任务正在执行中。等待sonarQube的后台任务处理完成,再去查看项目分析结果:
image.png

① 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):仓库可看成一个代码控制中心,用来保存镜像。

image.png

3.1 安装 postgresql 数据库

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

docker pull postgres

image.png

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

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

image.png
在浏览器当中,访问:http://localhost:9000
image.png
sonarqube 能够正常访问之后,就可以开始扫描项目代码啦。

3.3 项目扫描测试

请参考上一章节。

4. 使用手册

4.1 项目:被扫描的项目

4.1.1 项目首页

image.png

4.1.2 (项目)总览

image.png
image.png

4.1.3 问题

image.png

4.1.4 安全热点

image.png

4.1.5 指标

image.png
Sonar 七个维度检测代码质量:

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

4.1.6 代码

image.png
image.png

4.1.7 活动

image.png

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

所有项目的问题总览。将 Issue 指派给开发人员,处理 Issue。
image.png
image.png

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

image.png
image.png

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

image.png
image.png

4.5 质量阀:正常 / 错误

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

image.png
image.png

4.6 配置:系统全局配置

4.6.1 配置

① 通用设置

image.png

② 加密

image.png

③ 自定义指标

image.png

④ 网络调用

image.png

4.6.2 权限

① 用户

image.png

② 群组

image.png

③ 全局权限

image.png

④ 全局权限

image.png

4.6.3 项目

① 项目管理

一般都会把项目设置为私有,给某些开发人员设置使用项目的权限。
image.png
image.png

② 后台任务

image.png
image.png

4.6.4 系统

image.png

4.6.5 应用市场

image.png

4.6.6 SonarLint 插件

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

① 独立模式

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

② 连接模式

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

image.png

配置完后,开始使用

当前项目使用的是默认的质量配置时:
image.png

选择某个 java 包:
image.png

扫描分析结果:
image.png

更换质量配置

当项目的质量配置更换成公司自定义的质量配置。

image.png

记得 apply
再次分析:一个都没扫描出来。因为这里使用的是测试的质量配置,没几个规则。
image.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值