经过Sonar 初步构建代码持续审查

SonarQube

介绍篇

SonarQube 介绍

SonarQube 是一款领先的持续代码质量监控平台,开源在github 上,如今已更新到6.2 版本,star 数量超过 1400+,能够轻松配置在内网服务器,实时监控代码,帮助了解提高提高团队项目代码质量。经过插件机制,SonarQube能够继承不一样的测试工具,代码分析工具,以及持续集成工具。javascript

与持续集成工具(例如 Hudson/Jenkins 等)不一样,SonarQube 并非简单地把不一样的代码检查工具结果(例如 FindBugs,PMD 等)直接显示在 Web 页面上,而是经过不一样的插件对这些结果进行再加工处理,经过量化的方式度量代码质量的变化,从而能够方便地对不一样规模和种类的工程进行代码质量管理。html

在对其余工具的支持方面,Sonar 不只提供了对 IDE 的支持,能够在 Eclipse 和 IntelliJ IDEA 这些工具里联机查看结果;同时 SonarQube 还对大量的持续集成工具提供了接口支持,能够很方便地在持续集成中使用 SonarQube。java

此外,SonarQube 的插件还能够对 Java 之外的其余编程语言提供支持,对国际化以及报告文档化也有良好的支持。python

行业内提到"代码质量管理, 自动化质量管理", 通常指的都是经过Sonar来实现。本文的目标是实如今Sonar上显示出iOS项目, 先看张最终的效果图:mysql

SonarQube

用Sonar可以实现什么?git

  • 技术债务(sonar根据"规则"扫描出不符合规则的代码)
  • 覆盖率(单元测试覆盖率)
  • 重复(重复的代码, 有利于提醒封装)
  • 结构

问题1: "规则"指的是什么? github

在Sonar工具中配置检测工具(规则), 而后sonar根据规则检测"质量报告文件", 得出问题数目。 好比本文配置的规则是OCLint复制代码

问题2: 技术债务的天数怎么得出?web

每一个规则都有对应的处理时间, 最后:问题类型1数目 * 对应时间 + 问题类型2数目 * 对应时间 +... 获得时间。复制代码

SonarQube 工做流程

SonarQube 并非简单地将各类质量检测工具的结果(例如 FindBugs,PMD 等)直接展示给客户,而是经过不一样的插件算法来对这些结果进行再加工,最终以量化的方式来衡量代码质量,从而方便地对不一样规模和种类的工程进行相应的代码质量管理。objective-c

SonarQube 在进行代码质量管理时,会从图 1 所示的七个纬度来分析项目的质量。算法

图 1

SonarQube 不是那种安装便可用的工具,他须要数据库的支持,用于存储检测项目后的分析数据,同时为了实现可持续监测,还须要项目持续集成工具(如Jenkins)的支持,在构建版本前,经过Jenkins+Sonar 插件执行项目分析指令,最终的结果会经过SonarQube 服务器的Web 页面展现。

网络图

下面咱们就经过mysql+Jenkins+SonarQube 实现项目代码质量的可持续监测

安装篇

SonarQube 的安装

涉及到的知识点

  • XCTool工具
  • OClint工具
  • Gcovr工具
  • Git, SVN命令
  • Linux 命令
  • mysql 操做
  • Jenkins工具
  • Sonar工具
  • Shell语法
  • Sonar-runner工具

软件及硬件的要求

SonarQube 的安装一般须要知足必定的软硬件条件,具体要求以下所示:

  1. Server 要求

    Web server 最少须要 500MB 的内存空间,推荐内存空间大小 2GB。Sonar 在进行代码质量分析时,一般大约每 1 KLOC 须要存储 350KB 左右的数据,因此要尽可能为 SonarQube 的 web server 提供大的内存。

  2. Database 要求

    尽管 SonarQube 自己自带嵌入的 Derby 数据库,可是因为 Derby 比较简单,因此在生产环境中强烈推荐安装相应的企业版数据库,SonarQube 支持的数据库包括: MySQL 5.x+、Oracle10g+、PostgreSQL 9.x 和 MS SQLServer 2005 and 2008,推荐使用 MySQL。

  3. Browser 要求

    SonarQube 支持大多数的浏览器,包括 Firefox、Internet Explorer 7.x and 8.x and chromed 等,推荐使用 chromed。

    目前官方最新的版本是6.2,可是对于部分插件会存在不兼容的问题,致使Sonar 服务启动失败,因此为了使用和演示,我采用了旧版本4.5.7,由于此版本兼容 sonar-objective-c-plugin-0.3.1 插件。

    更新:

    关于XCode8的兼容方案, 请看这篇文章

安装步骤

  1. 数据库配置

    进入数据库命令模式或者直接使用GUI 工具,建立Sonar-Qube 服务所需的数据库

    mysql -u root -p
     mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; 
     mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
     mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
     mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
     mysql> FLUSH PRIVILEGES;复制代码

    建立数据库

    完成之后测试一下链接是否正确

  2. 安装SonarQube 与SonarQube-Runner

    SonarQube Runner 2.4 下载地址

    从官网下载 SonarQube 的最新版本并解压到/usr/local/文件夹

    SonarQube

    添加SONAR_HOME、SONAR_RUNNER_HOME 环境变量,并将SONAR_RUNNER_HOME 加入PATH

  3. 修改Sonar-Qube 配置文件

    配置文件路径在 ./conf/sonar.properties

    # 设置数据库的帐户密码
     sonar.jdbc.username=ua
     sonar.jdbc.password=pwd
    
     sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
    
     # By default, ports will be used on all IP addresses associated with the server.
     sonar.web.host=0.0.0.0
    
     # The default value is root context (empty value).
     sonar.web.context=/
     # TCP port for incoming HTTP connections. Default value is 9000.
     sonar.web.port=9003复制代码
  4. 运行以下命令启动 Sonar-Qube,根据操做系统选择

    Last login: Wed Feb 15 18:15:05 on ttys000
     localhost:~ tianyi$ /usr/local/sonarqube-6.2/bin/macosx-universal-64/sonar.sh start
    
     localhost:~ tianyi$ /usr/local/sonarqube-6.2/bin/macosx-universal-64/sonar.sh start
     Starting SonarQube...
     Started SonarQube.复制代码
  5. 建立一个简单的工程

    默认密码是admin:admin,登录管理员帐号之后,配置系统参数

    建立一个Demo 工程

    建立一个工程

    Demo 工程简介

    Demo 工程简介

    由于尚未进行过度析,因此Demo 暂时只能配置,在使用篇咱们会详细介绍若是经过指令或自动化执行分析审查。

  6. 安装一些必备插件,均可以从官网或者github 上搜索到

    Sonar支持多种插件,插件的下载地址为:docs.codehaus.org/display/SON…

    将下载后的插件上传到${SONAR_HOME}extensions\plugins目录下,从新启动sonar。

经常使用插件

(注意版本号兼容性问题)

个人资源

使用篇

使用SonarQube Runner分析源码

预置条件

已安装SonarQube Runner且环境变量已配置,即sonar-runner命令可在任意目录下执行

如何配置环境变量,参考这篇文章

如何分析

1. 在项目源码的根目录下建立sonar-project.properties配置文件

以iOS 项目为例

# Required metadata
sonar.projectKey=iOS::Demo
sonar.projectName=iOS::Demo
sonar.projectVersion=1.0

# Comma-separated paths to directories with sources (required)
sonar.sources=Demo

# Language
sonar.language=objectivec

# Encoding of the source files
sonar.sourceEncoding=UTF-8复制代码

注意:sonar.language 和安装的代码审查插件有关,须要安装 sonar-objective-c 插件,不然运行时会提示没法找到这个语言

2. 执行分析

在项目的根目录执行分析指令

/usr/local/sonar-runner-2.4/bin/sonar-runner复制代码

执行分析指令

查看Sonar 分析的结果

分析结果

以上是建立Demo 工程后,经过手动执行分析指令完成代码审查分析。

与Jenkins 持续集成

构建前操做

在jenkins的插件管理中选择安装SonarQube-Scanner,该插件可使项目每次构建都调用sonar进行代码度量。

进入配置页面对sonar插件进行配置,以下图:

新增构建前操做

以上配置可使项目在构建前,自动执行代码审查和分析,结果会自动保存并上传到数据库,经过Sonar 服务器展现给开发者。

设置触发器

每5分钟检查一次仓库,如有上库,则自动执行代码检测

设置触发器

至此,经过Sonar 初步构建代码持续审查的工做完成。

问题篇

安装中的问题

  1. 资源找寻的问题

    文中提到的资源文件,网上谷歌百度都用上,也找了好久,包括一些插件的问题,必须安装的就是 Sonar-Qube,Runner 其实没必要要安装,由于Jenkins 里有插件,能够直接使用。

  2. 环境配置问题

    若是不经常使用指令的话,能够不配置,直接经过绝对路径作操做,环境配置的方法参考这篇文章

  3. 初始化时遇到Sorry 的问题

    遇到这种问题能够去根目录 /log/xx.log 中查看日志,具体问题具体解决

    sorry

  4. 汉化包的问题

    若是你不习惯英文的使用,想作一作汉化的事情时,汉化包必定要对,若是有问题会致使服务启动失败。

    附上:汉化包下载地址

SonarQube 实际使用中遇到的问题及解决方案

在使用 SonarQube6.2 分析代码质量时,可能会遇到的问题:

  1. Xcode 8 兼容性问题

    原有的xctool已不支持XCode8, 改用xcodebuild + xcpretty 来替代xctool环节生成对应的产出物。

    关于XCode8的兼容方案, 请看这篇文章

结束语

代码质量管理对提升项目质量意义重大。本文介绍了 SonarQube 的工做原理,并从项目实战的角度讲解了使用 SonarQube 进行项目代码质量管理的流程和注意事项。

代码规范贵在坚持与执行力,自动审查只是作了提醒的做用,固然根据语言的规则,不少规范在使用者来说看似不合理或者很差用,有了这个工具,参与者们能够切身感觉到团队的成长。

参考文章

[实践]iOS Sonar集成流程详解

[实践]Sonar Xcode8兼容

SonarQube代码质量管理平台安装与使用

配置sonar、jenkins进行持续审查

相关文章
相关标签/搜索