SonarQube代码质量管理平台搭建使用

  • SonarQube环境搭建
      • 安装SonarQube
      • 安装MySQL
      • 安装SonarScanner
      • 安装 GoJunitReport
      • 安装 GoCovXML
      • 安装GoMetaLinter
      • 配置SonarQube
          • 配置MySQL数据库连接
          • 添加GoLang插件
  • SonarQube使用方法
      • 执行单元测试
      • 计算代码覆盖率
      • 执行代码静态扫描
      • 导入结果到SonarQube
  • SonarQube问题管理流程(待补充)
  • SonarQube附加内容
      • Go语言单元测试编写规则介绍(待补充)
          • 语言强制规则
          • 可选附加规则

SonarQube环境搭建

本文以Ubuntu Linux系统作为演示,Windows、Mac系统都可以进行参考。

安装SonarQube前,请确保Java已安装并正确配置。

安装SonarQube

1
专业的代码质量管理系统
  1. 进入SonarQube官网,获取SonarQube下载链接。
  2. 执行如下命令,下载SonarQube:
    1
    wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-6.7.6.zip
  3. 解压sonarqube-6.7.6.zip,进入其bin/linux-x86-64目录(根据系统自行选择),执行如下命令:
    1
    ./sonar.sh start
  4. 浏览器访问 http://localhost:9000,检查SonarQube系统是否安装成功。

安装MySQL

1
为SonarQube准备一个单独的数据库
  1. 安装MySQL前,先进行环境清理,Ubuntu下执行如下命令(其它系统自行百度彻底清理MySQL方式):
    1
    sudo apt-get remove --purge mysql-\*
  2. 执行如下命令,安装MySQL:
    1
    sudo apt-get install mysql-server mysql-client
  3. 为SonarQube创建数据库及用户:
    1
    mysql -u root -p
    1
    2
    3
    4
    create schema sonarqube default character set utf8 collate utf8_general_ci;
    create user 'sonarqube'@'%' identified by '88888888';
    grant all on sonarqube.* to sonarqube;
    flush  privileges;

安装SonarScanner

1
2
sonarqube官方的项目分析启动器(命令行),此处用于运行sonarqube的代码扫描规则,并将go test、go cov、gometalinter的
报告数据传入sonarqube系统
  1. 进入SonarQube官网,获取Scanner下载链接(需要仔细寻找),如下:
    https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
  2. 执行如下命令,下载Scanner
    1
    wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.3.0.1492-linux.zip
  3. 解压sonar-scanner-cli-3.3.0.1492-linux.zip,将其bin目录路径加入path环境变量中(方法自行百度)

安装 GoJunitReport

1
将go语言单元测试结的果转换为Junit xml形式,以便sonar scanner识别使用
  1. 进入Github,搜索go-junit-report,进入项目页面 https://github.com/jstemmer/go-junit-report
  2. 参考项目的README.md文档,完成GoJunitReport安装,如:
    1
    go get -u github.com/jstemmer/go-junit-report

安装 GoCovXML

1
将go语言计算单元测试覆盖度的结果转换为Junit xml形式,以便sonar scanner识别使用
  1. 进入Github,搜索gocov-xml,进入项目页面 https://github.com/AlekSi/gocov-xml
  2. 参考项目的README.md文档,完成GoCovXML安装,如:
    1
    2
    go get github.com/axw/gocov/...
    go get github.com/AlekSi/gocov-xml

安装GoMetaLinter

1
go语言代码静态检查工具,整合主流go语言检查程序,并将其输出标准化
  1. 进入Github,搜索gometalinter,进入项目页面 https://github.com/alecthomas/gometalinter
  2. 参考项目的README.md文档,完成GoMetaLinter安装,如:
    1
    curl -L https://git.io/vp6lP | sh

配置SonarQube

配置MySQL数据库连接
  1. 打开SonarQube目录下的conf/sonar.properties文件,在MySQL配置项下增加如下配置:
    1
    2
    3
    4
    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
    sonar.jdbc.username=sonarqube
    sonar.jdbc.password=88888888
    sonar.sorceEncoding=UTF-8
  2. 进入SonarQube目录下的bin/linux-x86-64目录(根据系统自行选择),执行如下命令,重启SonarQube:
    1
    ./sonar.sh restart
添加GoLang插件
  1. 进入SonarQube系统,点击进入配置–>应用市场,搜索并安装golang插件,可选安装Chinese Pack中文插件。
  2. 安装完成后,点击页面中的重启提示,进行重启。

SonarQube使用方法

准备好项目源码,进入项目根目录。

执行单元测试

执行Go语言单元测试,命令如下:

1
go test -v ./... | go-junit-report > unittest.xml

计算代码覆盖率

计算单元测试代码覆盖率,命令如下:

1
2
3
4
5
6
#老的方式,Go v1.9以上版本不再支持
go test -v -coverprofile=cover.out ./...
gocov convert cover.out | gocov-xml > coverage.xml

#新的方式,支持Go最新版本,推荐使用
# gocov test ./... | gocov-xml > coverage.xml

执行代码静态扫描

  1. 执行Go语言代码静态扫描,命令如下:
    1
    gometalinter --checkstyle ./... > golint.xml
  2. [可选] 你可以为项目创建GoMetaLinter配置文件.gometalinter.json,来选择性的执行检查程序。也可以在执行gometalinter命令行中直接指定要执行的检查程序。或者完全不指定,按照默认配置运行。
    1
    2
    # 命令指定示例:
    gometalinter --disable-all --enable=errcheck --enable=vet --checkstyle ./...
    1
    2
    3
    4
    # 文件指定示例:  [.gometalinter.json文件]
    {
    "Enable": ["deadcode", "unconvert"]
    }

导入结果到SonarQube

  1. 为项目创建SonarScanner配置文件sonar-project.properties,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    sonar.host.url=http://localhost:9000    #SonarQube的访问路径
    sonar.sourceEncoding=UTF-8    #源代码使用的字符集
    sonar.login=sonarqube    #SonarQube用户名
    sonar.password=sonarqube    #SonarQube用户密码
    sonar.projectKey=Test    #SonarQube上显示的项目名称
    sonar.projectName=Test    #项目的名称
    sonar.projectVersion=1.0    #项目的版本
    sonar.test.reportPath=unittest.xml    #执行单元测试生成的文件
    sonar.coverage.reportPath=coverage.xml    #计算代码覆盖率生成的文件
    sonar.coverage.dtdVerification=false
    sonar.golint.reportPath=golint.xml    #执行代码扫描生成的文件
    sonar.sources=./    #源码相对于本文件的路径
    sonar.sources.inclusions=**/**.go
    sonar.sources.exclusions=**/**_test.go, **/vendor/*.com/**, **/vendor/*.org/**, **/vendor/**
    sonar.tests=./
    sonar.test.inclusions=**/**_test.go
    sonar.test.exclusions=**/vendor/*.com/**, **/vendor/*.org/**, **/vendor/**

    如不创建项目配置文件,SonarScanner将使用 其安装目录下的conf/sonar-scanner.properties默认配置文件。

  2. 传入结果到SonarQube系统,命令如下:

    1
    sonar-scanner

SonarQube问题管理流程(待补充)

暂无内容,敬请期待!

SonarQube附加内容

Go语言单元测试编写规则介绍(待补充)

语言强制规则
  • 单元测试文件名必须以_test.go结尾;
  • 测试用例方法必须以Test开头,且Test后一位字母不能为小写英文字母[a-z];
可选附加规则
  • 单元测试文件应统一在tests目录下管理;