sonar 初探

安装

参考文档 https://docs.sonarqube.org/latest/setup/get-started-2-minutes/

sonar 由两部分组成:sonarqube 和 sonar-scanner-cli。前者是 web 端,后者是 CLI 端。下载地址如下:

另外,运行 sonar 需要 jvm 环境,自行安装。ubuntu 可执行 apt install openjdk-11-jdk

运行 web 端

启动服务

解压 sonarqube-7.9.1.zip 后,进入 sonarqube-7.9.1 目录,执行下述指令启动,之后访问 http://localhost:9000

1
./bin/linux-x86-64/sonar.sh console

另外,如果需要修改配置,修改 conf/sonar.properties 文件即可,其中 92 行附近可以修改运行内存

1
sonar.web.javaOpts=-Xmx5000m -Xms5000m -XX:+HeapDumpOnOutOfMemoryError

登录系统

访问 http://localhost:9000,登录信息

  • 用户名 admin
  • 密码 admin

创建项目

点击右上角加号,创建项目,输入项目名称、token 信息后,会显示一个指令,用户

进行代码扫描

之前我们安装了 sonar-scanner-cli-4.0.0.1744-linux.zip,解压后,增加 bin 到环境变量

1
export PATH=$PATH:/home/rovast/Software/sonar-scanner-4.0.0.1744-linux/bin

然后使其生效 source ~/.bashrc 或者 source ~/.zshrc

根据上一步的提示,进入到需要扫描的项目录,执行

1
2
3
4
5
sonar-scanner \
-Dsonar.projectKey=laravel-framework \
-Dsonar.sources=. \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login=0273f96b7dd12e0790ab2350b4c497fcedff6b36

等待运行结束后,web 端会自动加载对应报告进行分析

查看分析报告

自定义检测规则

参考 https://docs.sonarqube.org/latest/analysis/languages/php/

总结

总结起来,sonar 的特点就是功能强大。

  • 支持的语言丰富,主流的开发语言基本都支持了
  • web 界面友好,可以很清晰地查看报告和分析
  • 分析的指标丰富:安全性、技术负债、覆盖度、主流规则等等
  • marketplace

除了上述有点外,sonar 也有一些其他方面待考量的地方

  • sonar 是基于 java 开发,如果需要拓展其中的规则,需要了解 java 体系
  • sonar 本身是一个成熟的产品,如果基于这个来自定义工作流,难度较大
  • sonar 资源占用较大

所以如果需要一套成熟的代码检测相关工具,sonar 是个不错的选择。

sonar 和 phpCodeSinffer 对比

最大的区别

  • sonar 是一个产品提供了完善的解决方案
  • phpCodeSniffer 是一个工具,专注于 php 语法检查

拓展性

  • sonar 是成套的解决方案,可定制化程序较低。需要在 sonar 现有的 rules 中组合自己的 rule,或者在 marketPlace 中找到合适的组件。
  • 如果需要开发完全自定义的规则,可参考 https://docs.sonarqube.org/latest/analysis/languages/php/ ,使用 java 开发对应的规则
  • 如果基于 sonar 来构建自己的工作流,可行性较低。因为他本身是个产品,所有功能都集成了,有自己的一套思想

  • phpCodeSniffer 是基于 PHP 的一套语法检测工具

  • phpCodeSniffer 预留了语法检查的接口和类。如果需要自定义规则,实现对应的接口或类即可,较为简单
  • 如果基于 phpCS 来构建自己工作流,较为现实。毕竟它只是个工具
  • 另外,phpCS 有基于 IDE 的一些插件,可以集成到编辑器中实时检查

总结

  • 如果只是做语法检查,并且希望高度自定义,推荐使用 phpCodeSniffer
  • 如果对定制化程度没有要求,希望有个工具开箱即用,并且也无后续定制需求,可使用 sonar
  • 【推荐】使用 phpCS,这样便于后期和也无框架高度集成,便于做更多贴合框架和业务的检测。比如业务级别调用规范等