在上一篇文章中介绍了代码重构指南的理论部分。
这篇文章是一些实战的内容,作为上一篇文章内容的补充。
我会在本文中介绍最流行的代码静态分析工具 SonarQube 的搭建和使用。
ichati.cn 的前后端都使用了 SonarQube 做代码质量分析。它帮我们发现了项目中很多问题,对项目质量很有帮助。
SonarQube 介绍
就像 Sonar 自己所宣传的那样,SonarQube 是代码静态分析这个领域中最强者之一,是行业的标准。
它的客户不仅有 Ebay、Microsoft、Hilton、Dell、Intel 等国际大厂,甚至包括 FBI、NASA、T- Moblie、MIT 这些政府、高校、通信等各大行业的顶级组织和机构。
据 Sonar 称,它们共清理了超过 5000 亿行代码。
SonarQube 的商业模式中规中矩。
和 strapi、discourse 这些开源项目的模式几乎一摸一样。都提供了开源版本和收费版本。
SonarQube 分为4 个等级。
社区版、开发版、企业版和数据中心版。
其中社区版是免费的。开发版是每年 150 美元、企业版是每年 20000 美元。数据中心版是每年 130000 美元。
可以看到,SonarQube 的定价还是非常高的。像 ichati.cn 这种小型团队,最多只能接受 150 美元的开发版。
前置条件与安装
SonarQube 的安装方式分两种。一种是 Docker,一种是压缩包安装。
以下是压缩包安装的方式。
使用 SonarQube 需要准备几个工具。Java、PostgreSQL、浏览器。
Java
SonarQube 使用 Java 编写,所以需要依赖 Java 环境。
目前最新版本的 SonarQube 是 10,这个版本必须使用 Java 17 版本。经过测试,Java 11 和 20 都不支持。
Java 17 下载地址:
在 terminal 运行:
java --version
确保 Java 版本正确。
PostgreSQL
SonarQube 在运行时会用到数据库,最受支持的数据库是 PostgreSQL。
除了 PostgreSQL,还可以选择 Oracle。MySQL 曾经也受到支持,但是最新版本的 SonarQube 已经不支持 MySQL 了。
几乎支持所有版本的 PostgreSQL。
SonarQube
下载 SonarQube。
SonarQube 10 下载地址:
www.sonarsource.com/products/so…
SonarQube 中会包含三个组件,分别是 CI/CD、主Server(WebServer、计算引擎和 SearchServer) 和 DatabaseServer。
SonarScanner
下载 SonarScanner。
SonarScanner 下载地址:
docs.sonarqube.org/10.0/analyz…
Sonar Scanner 下载完成后,需要把解压目录下的 /bin 目录添加到环境变量中,这样我们就可以直接通过命令行运行 SonnarScanner 了。
运行命令验证配置是否正确。
sonar-scanner -h
配置
在 SonarQube 解压目录中的 /conf/sonar.properties 文件中写入必要的配置。
首先这三项是必须的。分别是数据库的账号、密码和 url。
sonar.jdbc.username=sonarqube sonar.jdbc.password=mypassword sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube
另外还会有一些可选项,比如 IP、端口、上下文之类的。
sonar.web.host=0.0.0.0 sonar.web.port=9200 sonar.web.context=
启动项目
每个操作系统的启动命令略有不同,以下是各系统的启动命令:
- Linux 上:
<安装目录>/bin/linux-x86-64/sonar.sh start
- macOS 上:
<安装目录>/bin/macosx-universal-64/sonar.sh start
- Windows 上:
<安装目录>/bin/windows-x86-64/StartSonar.bat
启动成功后会在之前配置的 IP 端口上运行 WebServer。默认是 http://127.0.0.1:9000 。
默认账号密码是 Admin/Admin。
第一次登陆系统会提示修改密码。
分析项目
进入系统后创建项目,点击 create project,选择 Manually。
输入项目名、项目 key 和对应的分支。
创建完成后会进入项目主界面。
它可以从多个地方分析项目,这里我们选择本地项目 Locally。
选择 token 名称和过期时间,它会帮我们生成一个 token。
第二步是选择分析的语言和操作系统,它会生成对应的扫描命令。
它把参数放到了命令行中,其实我们可以通过另一种方式更方便的管理参数。
sonar.projectKey=ichati sonar.sources=. sonar.host.url=http://localhost:9200 sonar.token=YOUR_TOKEN
这样就可以直接在项目根目录下运行分析命令了。
sonar-scanner
稍等片刻,分析完成后,浏览器会自动刷新,展示分析结果。
可以看到分析的结果非常清晰。
有 Bugs、Vulnerabilities(漏洞)、Debt(技术债务)、Code Smells(代码的坏味道)、重复代码块和重复代码行等信息。
每一项指标都可以点击进去,查看具体的文件、行数和原因。
它甚至还对修复问题的时间做出了预测。针对每一项问题我们都可以进行评论和跟踪。
作为项目管理人员来说,这些功能都非常贴心。
我们对代码进行修复后,可以再次进行扫描来查看最新的代码健康状况。SonarQube 提供了非常强大的可视化来监控项目随着时间的变化。
SonarQube 的能力还远不止于此,它还可以与 CI/CD、DevOps 平台进行更深度的集成,比如 Jenkins、GithubActions 等,从而做到全方位分析系统的代码质量。
但是 ichati.cn 目前使用的 CICD 比较冷门,所以并没有在这方面和 SonarQube 做集成,所以这部分的内容就不展开讲了。
篇幅所限,本文暂时结束。
后面会持续更新,让我们一起期待《大型网站重构指南》的下一篇。
如果你对最新的技术感兴趣,特别是对 Web3、AI 相关的内容感兴趣,可以添加我的微信 LZQ20130415,拉你进群交流。