一、什么是SonarQube
SonarQube is a self-managed, automatic code review tool that systematically helps you deliver Clean Code. As a core element of our Sonar solution, SonarQube integrates into your existing workflow and detects issues in your code to help you perform continuous code inspections of your projects. The tool analyses 30+ different programming languages and integrates into your CI pipeline and DevOps platform to ensure that your code meets high-quality standards. ——官方文档介绍
UP的粗糙译文:
SonarQube 是一个自我管理的自动代码审查工具,可系统地帮助您交付 Clean Code。作为 Sonar 解决方案的核心元素,SonarQube 可集成到您现有的工作流程中并检测代码中的问题,以帮助您对项目执行持续性的代码检查。这个工具可以分析30+种不同的编程语言并集成到您的 CI 管道和 DevOps 平台中,以确保您的代码符合高质量标准。
拓展——Sonar的几个产品:
注:本文关注的是临时使用 SonarQube,即官方所谓的“试用”,也是意味着使用本地示例,不在项目中直接引入 Sonar,而是在外部执行命令进行代码的静态扫描。如果是正式大规模引入 SonarQube,则使用方式不大一样。不是本文考虑范围。这是正式使用 SonarQube 的官方操作说明。
二、下载
注意:虽然是国外的,但是不需要魔法,可以直接上去下载,速度不慢。
注意:这里直接点击下载的话,是下载最新版本。如果你要下载旧版本的,请沿着本文继续阅读下去。
内容来自官网
定价:
内容来自官网
需要特别注意:SonarQube 对运行环境是有一些要求的,具体可以看官网对各个版本的描述说明。
举一些例子:
有网友说 6.6之后(不含6.6),就开始不支持 Java8 了,只是我没在官网里找到 7.9 之前的发布说明文档,无法证实这个说法。
SonarQube 7.9不再支持 MySQL,要从 MySQL 迁移到受支持的数据库,请参阅免费的 MySQL 迁移器工具。
SonarQube 7.9 服务器需要 Java 11。如有必要,分析可以继续使用 Java 8。
SonarQube 9.9 服务器需要 Java 17。
除了上面提及的默认最新版本,通常情况下,还可以直接从官网下载到许多版本的SonarQube
如果官方没有直接提供下载入口,就只能直接通过链接路径的方式来下载各个版本的SonarQube(你要下载哪个版本,就直接改后缀的版本号,例如现在这个是直接下载6.6版本):
https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-6.6.zip
注:实际上这些文件的下载来源就是官方,只是明面上没提供下载入口罢了。
三、启动
注:官网也有关于本地示例怎么执行,怎么操作的流程说明
如果你不想去看官方文档,则可以继续看下去.....
按照上一步骤,不管你是以什么方式下载,得到的是应该是一个ZIP压缩包。
下载到的压缩包
此时,解压这个压缩包,得到这样一个文件夹。
注:不同版本的文件夹内容可能有所差异,实属正常,我们只要关心会用到的核心文件就好。
文件夹内容示例
点击进入 bin 目录
bin目录内容示例
选择自己的当前平台,进入相应的文件夹,例如我这里是 Windows系统,则进入的是 windows-x86-64 文件夹(下面都是以在Windows平台上的操作为例)
文件夹内容示例
这里可以直接双击执行StartSonar.bat 文件运行 SonarQube ,但是这里不太推荐,因为成功执行起来的话是会显示出命令行界面。但是如果执行失败的话,会直接闪退,导致看不到错误信息。
所以,这里展示的是在命令行窗口执行的示例:
先利用快捷键 Win+R 调出 Windows命令运行框
Windows命令运行框
输入 cmd,点击确定或者按回车,打开控制台命令窗口
控制台命令窗口
将 StartSonar.bat 直接拖动到控制台命令窗口中
直接点击回车开始执行。
如果执行成功,则会是这样(执行成功后,不要关闭控制台窗口):
SonarQube7.9,运行环境JDK11
注:在该窗口,按 Ctrl+C 并输入确认信息,则可以退出并关闭 SonarQube。或者也可以暴力一点,直接关闭窗口。
注:如果关闭了窗口,则相当于关闭了 SonarQube,无法再访问本地网页,此时只要再按照前面的做法,启动就行。
注:如果关闭 SonarQube 前执行过代码扫描,扫描的结果数据不会丢失。
如果 Java 的环境不对,会有类似的报错:
要求Java 17,但是运行环境只装了Java 11
要求Java 17,但是运行环境只装了Java 8
反正出错了的话首先第一步,就是先看电脑上的 JDK 版本,下载的 SonarQube 版本是不是支持。
如果是其他的报错,由于作者没遇到,所以无法提供解决示例,建议去官网查找解决方案。
四、扫描代码
在浏览器中输入地址:http://127.0.0.1:9000/
则会打开该页面
点击 Log in
跳转到登录页:
默认账号:admin
默认密码:admin
登录进去后:
点击这里:
输入数据 Project Key 和 Display name(注意查看 Snoar 的输入值建议(就是那个问号图标里的说明)):
其实,只能说按建议写会比较规范,其实似乎并不会产生什么影响。
例如,这是我的 Maven 项目的填写:
填写完毕后,点击 Set Up 创建。
然后出现这个页面,输入 Token名称:
然后点击 Generate,生成Token
点击 Continue
选择好等下要被扫描的项目的编写语言,以及其他选项(本文以 Java+Maven 为例):
复制控制台命令,新建一个控制台命令窗口,进入到项目文件夹目录(如果是 Maven 项目,就是你可以在文件夹中看到 pom.xml 文件的位置)
项目文件夹举例
执行对应的命令
注:如果担心泄密,则可以先将涉密的内容去除后,再来扫描
注:SonarQube 的扫描,是静态文件扫描,不需要运行被扫描的项目
注:很奇怪,除了这个页面,后面进入管理页面后,就找不到这个命令的获取位置了。所以建议先将其复制保存一下,避免等下要用却找不到。
注:建议先用文本编辑器将命令改成一行,然后再拿去执行
注:不同版本的 SonarQube 对 Maven的版本 要求不同,例如 8.9 要求最低是 3.x
执行结果(执行需要消耗一会儿时间):
执行命令时,可能会因为Java版本对不上而报错。
解决时增加的参数示例:
-Dsonar.java.jdkHome=/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home
图源自官方论坛
五、扫描结果
此时,返回到先前通过 http://127.0.0.1:9000/ 地址打开的网页,刚刚扫描的结果就展现了出来。(没有显示就刷新一下页面)
注:这些数字都是可以点击进去查看详情的,会标注说是哪里不行,为啥不行。
此时,你就可以依据报告提供的这些信息,对项目代码进行优化迭代。(其实还可以对问题进行管理,包括分配给谁、设置等级、标注问题等操作)
若优化完毕,则可以重复执行上面的扫描项目命令,此时 SonarQube 将再次扫描你的项目,给出新的扫描结果。
关于单元测试覆盖率:
SonarQube doesn't run your tests or generate reports. It only imports pre-generated reports. —— 官方描述
粗糙的译文:SonarQube 不会运行您的测试或生成报告。它仅导入预先生成的报告。
如果是 JAVA,要使用 JaCoCo 作为生成代码测试覆盖率的工具。
怎么使用 JaCoCo 不在本文讨论范围之内,请另行阅读我的另一篇文章:JaCoCo的Maven应用入门使用教程
如果 JaCoCo 已经执行并生成覆盖率文件(jacoco.exec),那么可以往下继续了。
在 sonar 的 Administration 页面这里,可以看到默认配置的JaCoCo的覆盖率文件路径(这里的路径是基于项目路径),如果有需要,可以手动调整该路径。
JaCoCo的加载配置
原先扫描的时候如果没有配置 JaCoCo,则现在可以再执行一遍扫描命令。
然后就能看到覆盖率的信息:
六、删除项目(有需要的话)
删除项目
注意:删除有二次确认,如果真的删除了,那就对应项目的全部记录都没了,相当于从头开始。
七、新增项目(有需要的话)
新增项目
注意:怎么输入信息,前文已有提及,这里不再重复。
八、报告导出(有需要的话)
注意版本支持信息:
一定要选择支持的 SonarQube 版本去下载插件。
例如这里点入的是:
点击下载 sonar-pdfreport-plugin-3.0.3.jar
将下载好的 jar包 放入到 SonarQube 的对应目录底下:\sonarqube-7.9.6\extensions\plugins
打开本地管理页面(http://127.0.0.1:9000/),按照下图中所标记的菜单项,进入到对应管理页面。
点击 Restart Server按钮重启服务
点击 Restart
点击后,等待服务重启完成。
重启完成后,页面会跳到登录页,此时重新登录即可。
此时,可以在项目的扫描结果页面的 More 菜单项里看到这个功能:
点击Download Pdf Report,页面跳转到这里
点击 download 。
可能会出现这个报错:
原因和解决方案:安装插件之前扫描的结果不能直接进行pdf的导出,需要再扫描一下,然后就行了。
如果你找不到之前的命令的话,可以参考我的这个命令格式示例:
mvn sonar:sonar -Dsonar.projectKey=ProjectKey -Dsonar.host.url=http://127.0.0.1:9000 -Dsonar.login=Token
其中,ProjectKey的值可以在这里获取:
Token的值可以在这里获取:
点击 My Account
选择 Security
输入新Token名,生成新的 Token 进行使用(和原来的不一样没关系)
重新执行的话,刷新一下项目结果页面,可以看到多出一列,显示新的代码的检测信息
(这里因为没动过代码,所以都是0)
执行扫描命令时可能会报错:
Can't get Compute Engine task status.Retry.........
org.sonarqube.ws.connectors.ConnectionException: HTTP error: 401, msg: , query: org.apache.commons.httpclient.methods.GetMethod@3ae0e1e7
[ERROR] Problem generating PDF file.
org.sonar.report.pdf.entity.exception.ReportException: Can't get Compute Engine task status.
原因:缺少配置
解决:配置账号密码(登录管理页面的账号密码),然后重新执行扫描项目的命令。
扫描过程中成功的日志
此时可以导出PDF报告文件,进行前面介绍的方式进行导出,成功的话,可以获得一个PDF文件。文件内容基本涵盖了网页上可以看到的各个信息。具体自行生成后阅读吧。
PDF文件内容示例