sonarQube sonarScanner 和 Jenkins
手把手用SonarQube分析、改善项目代码质量(基于SnarQube 8.9.0)
TIPS
本文基于SonarQube 8.9.0,理论支持6.0及更高版本。
SonarQube是一个开源的代码质量管理系统,可用来快速定位代码中的Bug、漏洞以及不优雅的代码。它支持几乎所有的常见编程语言,例如Java、JavaScript、TypeScript、Kotlin、Ruby、Go, Scala等。并且还有插件机制,利用插件,可以让SonarQube更加强大,例如可以整合Findbugs、PMD、Checkstyle等。可以说,SonarQube是一款提升项目代码质量必备的根据。
本文手把手搭建、使用SonarQube。
环境需求
- X64的操作系统
- JDK(对于6.x - 7.8.x,需要JDK 8或更高版本;从7.9起,需要JDK 11或更高版)
- 2G内存
其他需求详见:docs.sonarqube.org/8.9/require…
TIPS
- 《其他需求》建议大家参照一下,里面探讨如何修改Linux文件描述符限制等说明;
- 上面贴的是是8.9版的链接,如果你使用的是其他版本,只需将版本名称改掉即可,例如改为8.8即可查看8.8.x的需求。
下载
前往 https://www.sonarqube.org/downloads/ ,按需下载即可,一般下载Community版本即可。
加速下载
- 链接: pan.baidu.com/s/1yxky9nnd… 密码: r3pv
- 链接: pan.baidu.com/s/1vg20y5qc… 密码: nite
- 链接: pan.baidu.com/s/1ZRbgvxdL… 密码: o9j7
搭建
单机版搭建
-
解压压缩包
-
将目录切换到SonarQube的
/bin目录,可看到类似如下的目录结构:├── bin
│ ├── jsw-license
│ ├── linux-x86-64
│ ├── macosx-universal-64
│ └── windows-x86-64 -
根据你的操作系统,切换到相应目录。例如,您的机器是
macOS,则可切换到macosx-universal-64目录。 -
执行如下命令即可启动SonarQube。
./sonar.sh start
当然,该shell还有其他命令,可输入
./sonar.sh --help或者./sonar.sh查阅。 -
稍等片刻,访问
http://localhost:9000/即可看到类似如下的界面,说明安装成功。 -
停止SonarQube,只需执行
./sonar.sh stop即可。 -
如需重启,只需执行
./sonar.sh restart即可。
管理员登录
访问:http://localhost:9000
账号:admin
密码:admin
生产环境可用
默认情况下,SonarQube使用的是H2数据库,这是一款非常流行的嵌入式数据库。但生产环境中,SonarQube并不建议使用H2。SonarQube支持多种数据库,例如Qracle、PostgreSQL、SQL Server等。下面,我们以PostgreSQL为例,让SonarQube使用PostgreSQL存储数据。
TIPS
支持的数据库及数据库版本请前往这篇文档查看,避免SonarQube不支持你的数据库版本以及注意点。
docs.sonarqube.org/8.9/require…
举个例子:SonarQube 8.9要求使用PostgreSQL 9.6/10/11/12/13,并且必须配置使用UTF-8
搭建PostgreSQL
简单起见,我用Docker搭建PostgreSQL。
version: '3.1’
services:
postgres:
image: postgres:10
restart: always
environment:
- POSTGRES_USER=itmuch
- POSTGRES_PASSWORD=itmuch
- POSTGRES_DB=sonar
ports: - “5432:5432”
修改SonarQube配置
-
修改配置文件:
$SONARQUBE_HOME/conf/sonar.properties。 -
找到类似如下的内容:
#----- PostgreSQL 9.3 or greater
By default the schema named “public” is used. It can be overridden with the parameter “currentSchema”.
#sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube?currentSchema=my_schema
在这行下面,添加如下内容:
sonar.jdbc.url=jdbc:postgresql://localhost/sonar?currentSchema=public
sonar.jdbc.username=itmuch
sonar.jdbc.password=itmuch这里,数据库地址、账号、密码根据你的需求修改。
-
执行
./sonar.sh restart,重启SonarQube。观察PostgreSQL,可以发现,此时SonarQube会自动在PostgreSQL数据库中建表并插入初始化数据。 -
类似的方式,你也可以为你的SonarQube配置其他数据库。
插件安装
SonarQube拥有强大的插件机制。以安装汉化插件为例——
-
按照图示进行操作:
-
点击
Install按钮后,将会弹出重启SonarQube的提示,点击即可重启。重启后,可看到类似如下的界面 -
类似的方式,也可为SonarQube安装其他插件。
整合Maven
方法一:全局配置(存在暴露sonarqube数据库账号密码的风险,不建议使用)
-
在Maven的全局配置文件:
$MAVEN_HOME/conf/settings.xml(也可能是.m2/settings.xml看你是怎么配置Maven的)中添加如下内容:sonar true
如右上角所示,此时可以看到SonarQube已经为我们分析了一个项目,该项目有1个Bug、2个脆弱点、31个代码味道问题。点击项目名称(图中的 `Spring Cloud YES`)即可看到详情,可以根据SonarQube给我们的提示进行修正、重构。
方法二:直接命令行控制(建议使用)
-
右上角头像 - My Account - Security页中,在
Generate New Token中填入你的Token名称,并点击Generate按钮。 -
点击按钮后,将会看到生成的Token,例如
0ba332dfb69fd1f11ed206a7fc856453cba2d23f -
使用如下命令,即可使用Sonar分析项目。
mvn sonar:sonar
-Dsonar.host.url=http://localhost:9000
-Dsonar.login=0ba332dfb69fd1f11ed206a7fc856453cba2d23f
-Dsonar.java.binaries=target/sonar
SonarScanner
除利用Maven使用Sonar外,还有很多其他用法,例如:
- SonarScanner for Gradle
- SonarScanner for .NET
- SonarScanner for Maven
- SonarScanner for Azure DevOps
- SonarScanner for Jenkins
- SonarScanner for Ant
- SonarScanner
本节探讨 SonarScanner如何使用。
下载
首先,根据自己的操作系统及环境情况下载SonarScanner:
安装
-
解压
-
修改
conf/sonar-scanner.properties,找到类似如下内容:改成SonarQube服务器端地址
sonar.host.url=http://localhost:9000
-
【可选】将
bin/目录添加到环境变量,以便于可以直接使用命令export SONAR_SCANNER_HOME=/Users/itmuch.com/develop/software/sonar-scanner-4.6.1.2450-macosx
export PATH=����������������/���:SONARSCANNERHOME/bin:PATH
项目配置
在项目根目录创建名为 sonar-project.properties 的文件,内容类似如下:
项目唯一标识
sonar.projectKey=jenkins-ci-test-project
项目名称,默认就是projectkEY
sonar.projectName=My project
项目版本,默认为空
sonar.projectVersion=1.0
源码相对于sonar-project.properties的路径,默认是.
sonar.sources=.
源码的编码
sonar.sourceEncoding=UTF-8
使用
sonar-scanner -Dsonar.login=1d2b4651059b8637676e8c0e7c65b4bc2650ae6b -Dsonar.java.binaries=target/sonar
spock 测试框架
code review
团队中要有统一的标准,并以此为基准
不应参杂其他元素,情感绩效,等等
code review 常见问题
- 功能性bug
- 不必要的代码
- 资源是否关闭
- 逻辑优化
- 代码复用
- 能否高效执行
- 资源占用
- 资源池配置是否合理
- 线程是否安全
- 注释是否到位
- 代码结构是否清晰
- 命名是否规范
- 单元测试覆盖情况
- 能否适应未来变化
- 检查是否过度设计(。。)
- 敏感数据是否加密
- 密码能否很好的管理和控制
- 铭感数据是否记录到了日志当中
- 沟通而非对抗
- 不要自负
- 小而多,而非大而少(分多次review)
- 保持简短
- 不要太正式
- 三人行,两个人审一个人的代码
code review 收益
-sonarQube