什么是SonarQube
借用官方文档中的一句话:SonarQube® is an automatic code review tool to detect bugs, vulnerabilities and code smells in your code. It can integrate with your existing workflow to enable continuous code inspection across your project branches and pull requests.
【SonarQube是一个自动化的代码监测工具,它可以监测bugs,漏洞,以及代码中的bad smell. 它还能与你的工作流进行集成进而持续对代码进行检测.】
如何使用SonarQube
这里介绍最简单的使用方法。背景描述:使用gradle构建java项目,通过配置SonarQube来检测当前项目中存在的漏洞等问题,并通过web UI进行直观展示。如果方便的话,最好也把覆盖率显示到UI中。(Jacoco这个代码覆盖率工具在SonarQube中提供了支持)
步骤:
- 拉取sonarqube的docker image,在本地跑起来,sonarqube -- DockerHub
docker pull sonarqube
docker run -d -p 9000:9000 sonarqube
- 项目中配置sonarqube插件信息
plugins {
id "org.sonarqube" version "2.7.1"
}
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.7.1"
}
}
apply plugin: "org.sonarqube"
- 配置sonar认证权限信息(在该目录中创建 ~/.gradle/gradle.properties)
systemProp.sonar.host.url=http://localhost:9000
systemProp.sonar.login=admin
systemProp.sonar.password=admin
- 在项目根目录执行 ./gradlew sonarqube,接下来会生成code quality报告(耗时),最后去http://localhost:9000 查看报告详情.
如果顺利的话,上面步骤执行完成后,应该能在http://localhost:9000这个页面中看到项目代码的详细质量情况,如下图
不要问我为啥,我的是中文界面,你的是英文界面,请自行去下载中文插件.(配置---应用市场--- chinese pack)
image.png
上面这种配置sonarqube的方式适用于在非pipeline模式,如果想要把项目的build,deployment以及嵌入项目代码到sonar,整个这些过程自动化起来的话,就不能用上面的配置方式。特别是配置全局sonar.properties就不合适了,取而代之的方法是,在项目的build.gradle中添加除了添加sonar的必要依赖之外,还要指定sonar的url,login<Token>等信息,具体如下:
sonarqube{
properties{
property "sonar.sourceEncoding", "UTF-8"
property "sonar.host.url", "https://xxxxx"
property "sonar.login", "8a3e6xxxxxxxxxxxxxxx5b5c7fa17c18ddf6b4c"
//property "sonar.coverage.jacoco.xmlReportsPath", "lib/jacoco.exec" //这里放exec二进制文件的位置即可
}
}
最后,在项目构建的过程中执行./gradlew sonarqube即可。(这个过程包括./gradlew build)
本来到这里就结束了,但是在调研Jacoco这个代码覆盖率工具的时候发现SonarQube对其进行了集成,如下图
image.png
接下来就是在build.gradle中配置jacoco,
apply plugin: "jacoco"
//jacoco插件配置
jacoco {
toolVersion = "0.7.6.201602180812"
reportsDir = file("$buildDir/customJacocoReportDir")
}
// jacoco报告配置
jacocoTestReport {
reports {
csv.enabled = true
html.destination file("build/reports/jacoco/jacocoHTML")
xml.enabled = true
}
}
网友评论