SonarQube 安装及使用

简介#

SonarQube 是一款用于代码质量管理的开源工具,是静态代码检查工具,采用 B/S 架构它主要用于管理源代码的质量,可以支持众多计算机语言,比如 php,java, C#, go,C/C++, Cobol, JavaScrip, Groovy 等。sonar 可以通过 PMD,CheckStyle,Findbugs 等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,异味等信息。

可以从七个维度检测代码质量:

1. 复杂度分布(complexity):代码复杂度过高将难以理解
2. 重复代码(duplications):程序中包含大量复制、粘贴的代码而导致代码臃肿,sonar可以展示源码中重复严重的地方
3. 单元测试统计(unit tests):统计并展示单元测试覆盖率,开发或测试可以清楚测试代码的覆盖情况
4. 代码规则检查(coding rules):通过Findbugs,PMD,CheckStyle等检查代码是否符合规范
5. 注释率(comments):若代码注释过少,特别是人员变动后,其他人接手比较难接手;若过多,又不利于阅读
6. 潜在的Bug(potential bugs):通过Findbugs,PMD,CheckStyle等检测潜在的bug
7. 结构与设计(architecture & design):找出循环,展示包与包、类与类之间的依赖、检查程序之间耦合度

架构#

SonarQube 平台由 4 个组件组成:
架构

  1. 一个 SonarQube 服务器启动 3 个主要进程:

    • 供开发人员、管理人员浏览质量快照和配置 SonarQube 实例的 Web 服务器

    • 基于 Elasticsearch 的 Search Server 支持从 UI 进行搜索

    • Compute Engine Server 负责处理代码分析报告并将其保存在 SonarQube 数据库中

      SonarQube 安装及使用

  2. 一个用于存储的 SonarQube 数据库:

    • SonarQube 实例的配置(安全性、插件设置等)
    • 项目、视图等的质量快照。
  3. 服务器上安装了多个 SonarQube 插件,包括语言、SCM、集成、身份验证等

  4. 在您的构建 / 持续集成服务器上运行一个或多个 SonarScanner 来分析项目

一体化#

一体化

  1. 开发人员在他们的 IDE 中编码并使用 SonarLint 运行本地分析。
  2. 开发人员把代码推送到 Git 等代码管理仓库
  3. 通过 Jenkens 等持续集成服务器,并使用 sonar-scanner 进行代码分析
  4. 分析报告被发送到 SonarQube 服务器进行处理。
  5. SonarQube Server 将分析报告结果处理并存储在 SonarQube 数据库中,并在 UI 中显示结果。
  6. 开发人员通过 SonarQube UI 审查、评论、挑战他们的问题,以管理和减少他们的技术债务。
  7. 使用 API 来自动化配置并从 SonarQube 中提取数据。

安装 sonar#

本文安装的版本是 SonarQube 7.6 版本,目前最高版本 (2021 年 7 月 27 日 10:29:21) SonarQube 9.0,2019 年 4 月 10 号,SonarQube 发文称在 7.9 之后,所有的 SonarQube 的版本中将停止对 MySQL 的支持。

  1. SonarQube 7.6
  2. java 1.8
  3. Mysql 5.6

CentOs6.9 安装可参考 博客

安装完后可打开网址:
SonarQube 安装及使用

安装 sonar-scanner#

本文使用 Sonar-scanner 进行代码分析

  1. 根据环境 下载,本文以 linux 系统为例

  2. 上传 sonar-scanner-cli-4.6.2.2472-linux.zip 文件到虚拟机或服务器

  3. 解压缩

     `unzip sonar-scanner-cli-4.6.2.2472-linux.zip`
  4. 添加 sonar-scanner-4.6.2.2472-linux/bin 到环境变量

    • vim /etc/profile
        #配置 sonar-scanner
        SONAR_RUNNER_HOME=/opt/sonar-scanner-4.6.2.2472-linux
        PATH=$SONAR_RUNNER_HOME/bin:$PATH
        export  SONAR_RUNNER_HOME
        export  PATH
    • source /etc/profile
    • sonar-scanner -h 查看是否添加成功
        INFO: 
        INFO: usage: sonar-scanner [options]
        INFO: 
        INFO: Options:
        INFO:  -D,--define <arg>     Define property
        INFO:  -h,--help             Display help information
        INFO:  -v,--version          Display version information
        INFO:  -X,--debug            Produce execution debug output
  5. 修改 sonar-scanner 配置文件 sonar-scanner-4.6.2.2472-linux/conf

    • vim sonar-scanner.properties

        #Configure here general information about the environment, such as SonarQube server connection details for example
        #No information about specific project should appear here
      
        #----- Default SonarQube server
        sonar.host.url=http://127.0.0.1:10005
      
        #----- Default source code encoding
        #sonar.sourceEncoding=UTF-8
        sonar.jdbc.url=jdbc:mysql://127.0.0.1:3307/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
        #数据库账号
        sonar.jdbc.username=sonar
        #数据库密码
        sonar.jdbc.password=sonar
        sonar.sorceEncoding=UTF-8

      此配置文件是有关环境的常规信息,例如 SonarQube 服务器连接详细信息。有关特定项目的信息不应该在此处配置

检测代码#

SonarQube 创建项目#

  1. 打开 SonarQube Web 页面创建项目
    SonarQube 安装及使用
    SonarQube 安装及使用
    SonarQube 安装及使用
    SonarQube 安装及使用
    本文使用 PHP 进行分析

使用 Sonar-scanner 分析代码#

  1. 进入需要分析的代码项目路径下

  2. touch sonar-project.properties 在项目路径下创建文件,

  3. vim sonar-project.properties

     # must be unique in a given SonarQube instance
     sonar.projectKey=test
    
     # --- optional properties ---
    
     # defaults to project key
     sonar.projectName=test
     # defaults to 'not provided'
     sonar.projectVersion=1.0
    
     # Path is relative to the sonar-project.properties file. Defaults to .
     # 多个路径可以使用逗号隔开
     sonar.sources=./app,./config
    
     # Encoding of the source code. Default is default system encoding
     sonar.sourceEncoding=UTF-8
     #这个具体作用目前不太清除,官网也没写
     sonar.java.binaries=.
     # SonarQube 创建项目生成的令牌
     sonar.login=6c8148e18e76fbc96e73354
    描述
    sonar.projectKey 项目的唯一键。允许的字符是:字母,数字 - , _ , . 和 : ,与至少一个非数字字符。
    sonar.sources 需要进行代码分析的文件目录,多个使用逗号分割
    sonar.projectName 将显示在 Web 界面上的项目名称。
    sonar.projectVersion 项目版本
    sonar.login 对项目具有执行分析权限的 SonarQube 用户的登录或身份验证令牌
    sonar.password 与 sonar.login 用户名一起使用的密码。如果正在使用身份验证令牌,则应将其留空
    sonar.projectDescription 项目说明
    sonar.sourceEncoding 源文件的编码。例如: UTF-8

    更过参数请参考 官方文档

  4. 在 sonar-project.properties 文件同级目录执行 sonar-scanner
    SonarQube 安装及使用

  5. 查看 SonarQube Web 页面,就可以看到 test 项目有一个 后台任务 正在执行,此时就是 Sonar-scanner 提交数据到 SonarQube 服务器,SonarQube 服务器分析数据
    SonarQube 安装及使用

  6. 后台任务执行完,就可以查看代码分析结果
    SonarQube 安装及使用

SonarQube 简单使用#

用户管理#

  1. 创建群组

    1. 配置 > 权限 > 群组 > 右上角
      SonarQube 安装及使用
  2. 创建用户

    1. 配置 > 权限 > 用户 > 右上角
      SonarQube 安装及使用
  3. 添加用户到 PHP 群组
    SonarQube 安装及使用

  4. 配置 PHP 群组对 test 项目的权限

    • 项目 -> test 项目 -> 配置 -> 权限
      SonarQube 安装及使用
      权限页面可以设置当前项目是 公开私有 项目
      可以分配给 PHP 群组六个具体权限
  5. 具体的权限分类

    • 浏览:访问一个项目,浏览它的指标,创建 / 编辑它的问题。
    • 查看源码:查看项目的源代码。(用户也需要 “浏览” 权限)
    • 问题管理员:对问题进行额外编辑:设置误判 / 不会修复,修改问题严重级别。(用户也需要 “浏览” 权限)
    • 管理安全热点:通过” 安全热点” 检测漏洞。驳回,清理,接受,重开” 安全热点”(用户也需要” 浏览” 权限)
    • 管理员:查看项目配置,执行管理任务。(用户也需要 “浏览” 权限)
    • 执行分析:可以获取执行分析的所有配置(包含安全配置,比如密码),并可以将分析结果推送至 SonarQube 服务器。

质量配置#

质量配置是在分析时使用的 规则集合。每个语言都有默认配置。没有指定其他配置的项目会使用默认配置。

PHP 的质量配置安装后有三个 DrupalPSR-2Sonar way

SonarQube 安装及使用

其中 Sonar way 是系统默认使用的质量配置,可以看到规则有 111 种。

自定义质量配置#

如果系统默认的满足不了现有条件,点击右上角 创建 按钮

SonarQube 安装及使用
可根据现有的质量配置创建一个新的配置,或创建一个空的配置。

SonarQube 安装及使用

  1. 新建的配置可以分配权限给群组或个人
  2. 可以把当前配置分配给具体项目,使用此配置进行代码检测
  3. 添加更多的规则
    SonarQube 安装及使用

除此之外还有一些其它基础配置

SonarQube 安装及使用

质量阈#

质量阈相当于一个代码检测的阈值,代码问题超过阈值会出现提示,或发送邮件通知。
默认的质量阈 Sonar Way,如果一个项目没有指定质量阈,则默认使用此质量阈。

可根据项目不同,创建不同的质量阈

SonarQube 安装及使用

  1. 根据具体要求添加不同的指标
  2. 选择适用的项目

SonarQube 安装及使用
可看到 bugs 数阈值设定的 10,代码检测出来 92,此时项目状态为 错误级别(没有超阈值为 正常

邮件通知#

SonarQube 可以设置在一些事件发生时,通过邮件的方式进行提醒

开启邮箱 SMTP 服务#

在 QQ 邮箱 中开启服务
SonarQube 安装及使用

  1. 开启 IMAP/SMTP 服务
  2. 生成授权码

SonarQube 邮箱配置#

可以使用有修改配置权限的账号,或管理员账号进行邮件信息配置

SonarQube 安装及使用

SonarQube 安装及使用

SonarQube 邮件通知配置#

可以在 我的账号 -> 提醒 选择需要开启的通知

SonarQube 安装及使用

当有新的问题分配时,会进行邮件提醒

SonarQube 安装及使用

可以看到邮件下面有个问题的连接,跳转的前缀域名可以在 配置 里面进行配置

SonarQube 安装及使用

配置后发送邮件

SonarQube 安装及使用

分支扫描#

SonarQube Community 版本不支持多分支扫描,所以可以使用 github 的 sonarqube-community-branch-plugin 插件

根据 SonarQube 版本选择插件版本

SonarQube 安装及使用

  1. 下载合适的 jar 包,并放置在你安装 SonarQube 的目录下 sonarqube/extensions/plugins

  2. 重启 SonarQube Service 服务
    SonarQube 安装及使用

  3. 切换你需要分析的分支并修改扫描项目下的 sonar-project.properties 文件

     sonar.projectKey=test
    
      # --- optional properties ---
    
      # defaults to project key
      sonar.projectName=test
      # defaults to 'not provided'
      sonar.projectVersion=1.0
    
      # Path is relative to the sonar-project.properties file. Defaults to .
      sonar.sources=./app,./config
    
      # Encoding of the source code. Default is default system encoding
      sonar.sourceEncoding=UTF-8
      #这个具体作用目前不太清除,官网也没写
      sonar.java.binaries=.
      # SonarQube 创建项目生成的令牌
      sonar.login=7eee3f6b73b5cab929c30f5bca7bc0a8bf84ec25
      # 项目所处分支(一般和 jenkins 结合,通过变量动态修改分支名)
      sonar.branch.name=release-1
  4. sonar-scanner 重新扫描

  5. 可在 SonarQube Web 页面看到新的分支信息
    SonarQube 安装及使用

多分支#

SonarQube 的分支可分为

  1. 主分支:一般为 master
  2. 短期分支:短期分支的问题和长期分支相比是 增量 的数据
  3. 长期分支:长期维护的分支,如 release 和 develop 分支,问题数据 单独 存储

主分支如果不为 master,可修改主分支名字

SonarQube 安装及使用

同时可修改 长期分支 的分支匹配规则

SonarQube 安装及使用

Jenkins 使用 SonarQube#

自行百度安装 Jenkins

安装 SonarQube Scanner 插件#

Manage Jenkins -> Manage Plugins -> Sonarqube Scanner
SonarQube 安装及使用
安装完后重启 Jenkins

配置 SonarQube servers#

Manage Jenkins -> Configure System -> SonarQube servers
SonarQube 安装及使用
填写自己的 SonarQube Web 地址,并创建一个 凭证

凭证添加#

  1. SonarQube Web 使用管理员账户生成一个令牌 我的账户 -> 安全
    SonarQube 安装及使用

  2. 在 Jenkins 添加凭证
    SonarQube 安装及使用

配置 SonarQube Scanner#

Manage Jenkins -> Global Tool Configuration -> SonarQube Scanner

SonarQube 安装及使用

创建 Jenkins 项目#

  1. 新建一个 Item
    SonarQube 安装及使用
    选择一个自由风格的类型创建

  2. 创建构建信息
    基础信息
    SonarQube 安装及使用
    基础信息-git参数

    源码管理
    构建
    构建-参数

      sonar.projectKey=${JOB_BASE_NAME}
      sonar.projectName=${JOB_BASE_NAME}
      sonar.projectVersion=1.0
      sonar.sources=./app
      sonar.sourceEncoding=UTF-8
      sonar.java.binaries=.
      sonar.branch.name=${Branch}

    构建后操作
    构建后删除工作区,本案例只是单一的进行代码检测,不进行后续的操作,所以可以选择删除工作区

运行项目#

SonarQube 安装及使用
SonarQube 安装及使用
如果是第一次运行,请务必选择 master 分支,不然会失败,因为 SonarQube Web 默认第一个分支就是 master
SonarQube 安装及使用
SonarQube 安装及使用

参考#

www.cnblogs.com/ycyzharry/p/116890...
www.cnblogs.com/wangxu01/articles/...

本作品采用《CC 协议》,转载必须注明作者和本文链接