背景

最近关注代码质量管理工具,用过了阿里的开发者规范插件后,又看了下 Sonar ,弄明白这个工具的使用流程花费了小半天的时间,这里整理下其中的盲点。说来也奇怪,搜索到的 IDEA 集成 Sonar 的文章也不少,就是没有一篇能教会我这个初次接触 Sonar 的人。还得靠自己连蒙带猜地各种尝试,才搞明白整个过程。

相关的模块及关系

  • Sonar :该工具的统称
  • SonarLint:IDEA 的 Sonar 插件
  • SonarQube:一个 Web 应用,服务端,统一管理 Sonar 扫描结果、扫描规则配置
  • sonar-maven-plugin:Sonar 客户端,从 SonarQube 服务器获取扫描规则,并上传扫描结果到 SonarQube 平台

插件安装

插件的安装比较简单,这个基本上不会有问题,在插件仓库中搜索 “SonarLint” 插件,找到插件后点击安装即可。本机已经安装过了,结果如下:
在这里插入图片描述
可能是我本机使用的 IDEA 版本【2016.3.1】比较老,所以插件安装完成后,只有在某个文件编辑页面右键才有 “Analyze with SonarLint” 操作,而在工程上右键,网上都说菜单位于 Analyze 中:
在这里插入图片描述
我的 IDEA 中找不到这个操作,但是选中某个文件夹后,可以通过快捷键【Ctrl+Shif+S】对该目录进行扫描,通过进度条可以知道它扫描的是整个目录:
在这里插入图片描述
在单个文件中,右键有扫描操作:

注意点:插件安装成功后,可以直接进行扫描,虽然当前版本的 IDEA 工程右键没有这个操作,但是快捷键可以用,说明插件安装成功。

SonarQube 启动

SonarQube 是 Sonar 的 Web 管理应用,非解压版的,下载地址

由于这是一个 Web 应用,需要用到数据库,需要创建一个数据库,名称没有限制,需要修改配置文件中的数据库连接信息。操作过程:

  1. 本地数据库用 MySQL ,创建一个名为 sonar 的数据库
  2. 解压 SonarQube ,定位到配置文件目录 E:\software\sonarqube-7.6\conf
  3. 修改 sonar.properties 文件,在 28 行添加如下配置:
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.jdbc.username=root
sonar.jdbc.password=123456
sonar.sorceEncoding=UTF-8
sonar.login=admin
sonar.password=admin
  1. 进入 bin 目录找到跟自己主机一致的目录 E:\software\sonarqube-7.6\bin\windows-x86-64
  2. 运行 StartSonar.bat 启动 SonarQube

注意点:StartSonar.bat 会启动一个 DOS 窗口运行,首次启动时耗时较长。此外,关闭 DOS 界面时,后台对应的 Java 进程不会结束。

不会结束的坑就是:端口会继续被占据。如果再次点击启动文件,则启动操作会闪退,此时可以在 log 目录中查看日志定位错误。因此,没有事情的话,不要关闭它的界面,如果必须关闭后重启,那么关闭后手动打开进程管理器,停掉对应的 Java 进程。

SonarQube 创建工程

SonarQube 启动后,访问 http://localhost:9000 进入其登录界面,输入 sonar.properties 中配置的帐号和密码后进入主界面:
在这里插入图片描述
SonarQube 是以工程为单位进行扫描管理的,第一步需要点击 A 前面的 + 号,创建一个新工程:
在这里插入图片描述
注意点:如果插件配置认证方式为 Token ,那么这里需要记录该项目的 Token 信息。

插件配置

IDEA 中需要配置 SonarQube 的访问地址和工程,配置方法为:

1.打开插件通用配置界面
在这里插入图片描述
2.点击 + 号添加 SonarServer
在这里插入图片描述
3.下一步配置认证信息
在这里插入图片描述
认证方式有两种,Token 和密码,Token 即前面创建项目时生成的 Token 信息。这里选择密码方式,输入 SonarQube 访问密码:
在这里插入图片描述
4.SonarLint 项目配置
在这里插入图片描述
至此,IDEA 插件 SonarLint 和 SonarQube 关联配置完成。

maven-sonar 插件

maven-sonar 插件,本质是一个 sonar-runner 扫描工具,也是一个客户端。根据 官方 maven-sonar 插件配置教程 完成 Maven setting.xml 配置。

1.添加 maven-sonar 插件

在 pluginGroups 节点下,添加一个子节点:

<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>

2.添加 sonar 的 profile

在 profiles 节点下添加一个子节点,配置 sonar 插件的主机 URL:

<profile>
		<id>sonar</id>
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
		<properties>
			<!-- Optional URL to server. Default value is http://localhost:9000 -->
			<sonar.host.url>
			  http://localhost:9000
			</sonar.host.url>
		</properties>
    </profile>

3.工程 pom.xml 配置插件版本

在待扫描工程的 pom.xml 文件中,添加 build 插件,配置 maven-sonar 插件版本:

 <plugin>
    <groupId>org.sonarsource.scanner.maven</groupId>
    <artifactId>sonar-maven-plugin</artifactId>
    <version>3.6.0.1398</version>
  </plugin>

maven 执行扫描命令

直接运行 maven 生命周期中的各种方法,都不能完成 soanr 代码扫描及结果上传。官方是通过执行mvn sonar:sonar 命令完成的,所以想到的办法是在 IDEA 的 termianl 控制界面执行该命令,测试它的确能完成扫描结果的上传:
在这里插入图片描述
执行成功结果为:
在这里插入图片描述
maven-sonar 插件使用的注意点:不能对 SVN 服务器端版本较低的 SVN 项目进行扫描,否则会执行失败。
错误信息如下:

Error when executing blame for file src/main/java/com/xxxx/SpringContextUtil.java: svn: E200007: Retrieval of mergeinfo unsupported by svn:url

网上找的解决办法不生效,所以只能对本地非 SVN 项目进行代码扫描。

扫描结果查看

mvn sonar:sonar 命令执行完成后,访问 SonarCube 主页能查看最新的扫描结果:
在这里插入图片描述
Issues 菜单下,选择 All 而不是 My Issues ,貌似它可以对扫描到的 Issues 进行分配,这里能看到所有的问题。
Project 菜单下,呈现各个项目的,这里使用命令执行后,自动创建了一个与工程应用名相同的项目:
在这里插入图片描述

启示录

反复执行扫描后,发现 SonarLint 插件的功能跟 maven-sonar 插件是一样的。理论上来讲,通过 SonarLint 功能,即对某个功能执行 Analyze with SonarLint 与在终端执行 mvn sonar:sonar 命令效果应该一样才对。

maven 的 setting.xml 中只配置了 SonarQube 的 host.url ,并没有指定项目名称,所以执行完成 mvn sonar:sonar 命令后,在 Web 页面会自动创建一个与扫描工程名称一样的项目。

而前面对插件配置的 SonarQube Server 和 project 指定是针对 Analyze with SonarLint 的,手动执行该操作后,理论上应该在对应的项目中看到扫描结果的。可惜,我这个 IDEA 版本下没有完成扫描结果的上传。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐