在我们的日常软件开发工作当中,随着项目时间变长,开发人员编写的代码量也会越来越多。长此以往,会面临代码量庞大,却无法横量整体代码质量?若是要优化,也不知道如何优化。
针对这些问题,出现了各种各样的工具,比如:
java 语言的 Checkstyle,FindBugs,PMD,Jtest 等,帮助检测代码编写规范上存在的问题和漏洞。python 语言的 Pyflakes,Pylint,pep8 等。C# 语言的 FxCop、StyleCop 等。通过这些工具扫描的结果分析后,根据结果来优化代码问题,以提高代码质量。以上这些工具都是代码的静态扫描分析工具。
所谓静态代码分析,就是针对开发人员编写的源代码,在不运行的情况下,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷。在单独使用以上这些工具时,我们会面临:
1、需要一个平台,能够汇总呈现不同语言的项目、不同工具的扫描结果;
2、需要一个平台,可以友好的呈现或者追溯,一段时间内每一次扫描的结果的差异。
sonarQube 就是这样的一个平台:
1)支持多种语言的静态代码扫描。
2)多维护呈现项目代码的质量状态。
1、代码质量和安全扫描和分析平台。
2、多维度分析代码:代码量、安全隐患、编写规范隐患、重复度、复杂度、代码增量、测试覆盖率等。
3、支持 25 + 编程语言的代码扫描和分析,包含 java\python\C#\javascript\go\C++ 等。
4、涵盖了编程语言的静态扫描规则: 代码编写规范 + 安全规范。
5、能够与代码编辑器、CI/CD 平台完美集成。
6、能够与 SCM(软件配置管理) 集成,可以直接在平台上看到代码问题是由哪位开发人员提交。
7、帮助程序猿写出更干净、更安全的代码。
静态扫描主要针对开发人员编写的源代码。通过定义好的代码质量和安全规则,对开发人员编写的代码进行扫描和分析。将分析的结果多维护的呈现出来,以方便开发人员进行代码的优化和规范编写。
sonar 静态代码扫描由 2 部分组成:sonarQube 平台,sonar-scanner 扫描器。
1)展示所有的项目代码的质量数据。
2)配置质量规则、管理项目、配置通知、配置 SCM 等。
1)专门用来扫描和分析项目代码。支持 20 + 语言。
2)代码扫描和分析完成之后,会将扫描结果存储到数据库当中,在 sonarQube 平台可以看到扫描数据。
![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)
安装包下载: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
可能出现的意外情况:StartSonar.bat 打开后,运行几秒钟后退出,此时 Sonar 服务并没有成功启动。
解决办法:打开任务管理器(Ctrl+Alt+Delete),找到 Java™ Platform SE binary,通常情况下会有 2-3 个,结束任务,之后重新双击启动 StartSonar.bat,界面会有提示 SonarQube is up,即成功启动。
按照下图的点击顺序,进入插件安装页面,搜索框搜索 chinese, 选择中文包,安装中文插件,安装之后,会自动提醒重启服务,点击重启,重启完之后,刷新,就看到中文版的页面。
**注意:**重启后访问出现 502 页面,是由于服务没有全部重启完成导致的,可以多等待一会再试。
数据库下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
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
在General中设置用户名为sonar,Privileges中控制权限。用户名为sonar,密码为sonar:
Databases,右键 ,创建数据库。数据库名称为:sonar
在sonarQube的安装目录的conf目录下,打开sonar.properties。此文件当中,所有支持的数据类型的连接方式都已经放进来了。只需要开放注释,进行配置工作即可。需要配置的参数为:
重启过程中,sonar会使用配置的数据库,并在数据库中自动创建表格,需要一点时间。重启完成之后,可以在数据库当中看到sonar创建的表:
再次访问sonarQube后,页面底部就不会有如下提示:
sonar-scanner 下载地址:https://docs.sonarqube.org/8.9/analysis/scan/sonarscanner/
SonarQube Scanner 是默认 Scanner,Sonar 为 Maven、Gradle 等都开发了 Scanner。sonarScanner 4.7 支持 sonarQube8.9+。安装包下载后解压到本地即可。
更新 conf/sonar-scanner.properties 文件,配置连接 SonarQube 服务器。
添加 bin 目录到环境变量当中。
为什么要了解项目代码结构呢?
1)区分出来,哪些是开发人员写的代码,哪些是引用的第三方包或配置文件等。
2)sonarQube 主要是分析开发人员写的代码质量,对于外部的依赖库这些全部都可以忽略掉。
在项目根目录下,添加 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-scanner命令:
在扫描任务完成之后,sonarQube需要将其扫描结果写入数据库,需要一定的时间。扫描的代码量越大,写入数据库的时间相对的也要长一点。
在sonar-scanner提示扫描完成之后,访问sonarQube地址( http://localhost:9000/projects ),会看到有1个后台任务正在执行中。等待sonarQube的后台任务处理完成,再去查看项目分析结果:
Bug:编码错误,将破坏您的代码,需要立即修复
漏洞:代码中容易受到攻击的一点
异味:一个可维护性问题,使您的代码混乱且难以维护
阻塞(Blocked):极有可能影响应用程序的行为的问题,必须立即修复
严重(Critical):可能引起很小的错误或者安全性问题,必须立即检查代码
主要(Main):严重影响开发人员生产力的质量缺陷
次要(Minor):稍微影响开发人员生产力的质量缺陷
提示(Info):不是错误也不是质量缺陷,只是发现
Open(打开):SonarQube 发现问题时自动设置为 open
Confirmed(确认):手动确认此问题(解决/误判/不会修复)
Resolved(解决):开发人员处理此问题提交代码后,手动设置为已解决
Reopened(重新开发):关闭后的问题 SonarQube 再次扫描出来,会自动设置为Reopened
Closed(关闭):SonarQube 下次扫描时若问题已处理会自动设置为关闭
本文使用的硬件环境:
MacOS Catalina 版本:10.15.3
Docker 官方下载 mac 下的 docker app,安装完成即可。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app), 更重要的是容器性能开销极低。Docker 包括三个基本概念:
docker pull postgres
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.
docker pull sonarqube
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: 指定端口映射,格式为:主机 (宿主) 端口: 容器端口
在浏览器当中,访问:http://localhost:9000
sonarqube 能够正常访问之后,就可以开始扫描项目代码啦。
请参考上一章节。
所有项目的问题总览。将 Issue 指派给开发人员,处理 Issue。
复杂度
复杂度
复杂度 / 类
复杂度 / 文件
复杂度 / 方法
覆盖率
分支覆盖
集成测试的新分支覆盖
新代码的分支覆盖率
覆盖率
新集成测试覆盖
新覆盖率
集成测试分支覆盖
集成测试覆盖
集成测试覆盖行
集成测试未覆盖分支
集成测试未覆盖行
代码覆盖率
集成测试的新行覆盖
新代码覆盖率
代码行
集成测试的新行覆盖
覆盖的新代码
总体分支覆盖率
总体新分支覆盖率
总体覆盖率
总体新覆盖率
总体代码覆盖率
总体新代码覆盖率
总体覆盖的新行数
总体未覆盖分支
总体未覆盖的新分支
总体未覆盖代码
总体未覆盖新行数
单元测试忽略数
未覆盖分支
集成测试未覆盖的新分支
未覆盖新分支
未覆盖的代码
集成测试未覆盖的行
未覆盖的新代码
单元测试持续时间
单元测试错误数
单元测试失败数
单元测试成功 (%)
单元测试数
文档
注释行
注释 (%)
公共 API
公共注释的 API (%)
公共未注释的 API
重复
重复块
重复文件
重复行
重复行 (%)
问题
阻断违规
确认问题
严重违规
误判问题
提示违规
违规
主要违规
次要违规
新阻断违规
新严重违规
新提示违规
新违规
新主要违规
新次要违规
开启问题
重开问题
不修复的问题
可维护性
新代码的技术债务
坏味道
达到可维护性 A 级所需的工作
新增坏味道
技术债务
技术债务比率
新代码技术债务比率
Management
Burned budget
Business value
Team size
可靠性
Bugs
新增 Bugs
可靠性修复工作
新代码的可靠性修复工作
安全性
新增漏洞
安全修复工作
新代码的安全修复工作
漏洞
大小
类
目录
文件
方法
生成的行数
生成的代码行数
行数
代码行数
项目
语句
一般都会把项目设置为私有,给某些开发人员设置使用项目的权限。
SonarQube 与 Eclipse: http://downloads.sonarsource.com/eclipse/eclipse/
由于刚安装完插件之后设置是默认打开自动检测的,所以现在你的最底层工具栏里应该会多一项 sonarlint,你打开不同的 Java 文件,检测会自动进行 ,检测结果也会直接展示在那里。
对于企业级的开发,很多企业可能对代码风格和检查项有自己的要求。这就可以为公司的开发者提供 sonarqube 服务器,在其上进行配置,然后开发者连接以后就可以让 sonarlint 按照公司的定义来进行检查了。
ps:如果不想它自动检查把下图的对勾取消勾选就可以了。
链接的时候,可以选择使用 token 或者账号链接。
token 生成: