代码质量管理

223 阅读5分钟

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版本即可。

加速下载

搭建

单机版搭建

  • 解压压缩包

  • 将目录切换到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如何使用。

下载

首先,根据自己的操作系统及环境情况下载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=����������������/���:SONARS​CANNERH​OME/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 常见问题

  1. 功能性bug
  2. 不必要的代码
  3. 资源是否关闭
  4. 逻辑优化
  5. 代码复用
  6. 能否高效执行
  7. 资源占用
  8. 资源池配置是否合理
  9. 线程是否安全
  10. 注释是否到位
  11. 代码结构是否清晰
  12. 命名是否规范
  13. 单元测试覆盖情况
  14. 能否适应未来变化
  15. 检查是否过度设计(。。)
  16. 敏感数据是否加密
  17. 密码能否很好的管理和控制
  18. 铭感数据是否记录到了日志当中
  19. 沟通而非对抗
  20. 不要自负
  21. 小而多,而非大而少(分多次review)
  22. 保持简短
  23. 不要太正式
  24. 三人行,两个人审一个人的代码

code review 收益

-sonarQube