iOS Sonar 集成流程

https://gold.xitu.io/entry/5781e6872e958a0054c93368

所有文章目录:http://my.oschina.net/ChenTF/blog/677112

转载请注明出处, 有用的话请赞一下哦。

1. Sonar介绍

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

查看图片

     用Sonar能够实现什么?

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

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

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

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

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

2. 概述

    Sonar原生并不支持iOS, 所以就需要我们自己按照Sonar原理来安装各个工具, 并将各个工具连接起来, 生成质量结果, 并由Jenkins来实现自动化执行。

    但由于涉及到的知识范围很广, 不仅需要iOS开发技术, 还需要运维知识和各个命令工具的使用方法。 而且国内外的资料少的相当可怜, 没有最佳实践, 没有专门的第三方平台, 造成很多东西都是一步步试错出来的, 一步一坎, 所以用了很长时间。

     不过最后都将每个工具, 每个步骤打通, 将各个工具连接起来, 整理成.sh脚本 和 .properties配置文件, 这样在后续新添项目时会很轻松。

3. 宏观介绍

3.1 配置关系图

查看图片

3.2 涉及到的知识点

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

3.3 关系逻辑讲解

  1. 每个项目添加一个配置文件(.properties), 为了在Jenkins上调用命令时能自动填充项目设置;
  2. 在Jenkins上安装各个工具(XCTool, OCLint, gcovr, sonar-runner) 与 .sh脚本, Jenkins服务器可以从代码仓库clone下代码, 然后通过.sh脚本与.properties配置文件来调用各个“工具”, 然后每个项目生成对应的“文件”;
  3. 在 .sh脚本 最后会通过sonar-runner将生成的 ”文件” 传给Sonar服务器, Sonar服务器以图形化的形式显示出对应的结果。
  4. 具体传递给哪个sonar服务器与项目名, 都是在.properties中进行配置

4.环境配置

4.1 基础知识

     其实Sonar的展示是将一系列的报告文件转换得到的, 文件又是通过各个工具生成的, 所以需要先安装工具。

     涉及到的工具包括(1.xctool 2.oclint, 3.gcovr, 4.sonar-runner), 虽然涉及的工具比较多, 每个用法都可详细的单独讲, 但不建议在开始时就深入了解这些, 本文会将用到的地方进行讲解, 后续深入了解请看给出的推荐资料。

     在接下来的步骤中, 需要具备基础的Linuxl知识与Shell知识, 建议有空的话先学学。

     Linux教程: http://c.biancheng.net/cpp/html/2726.html

     Shell教程: http://c.biancheng.net/cpp/view/6994.html

4.2 工具-HomeBrew

    “gem管理器”, 通过该工具可以安装别的gem工具, 类似cocoapods。

     安装方法: http://brew.sh/index_zh-cn.html

     详细介绍: https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/README.md#readme

     有了此工具后, 以下的工具都可通过该工具来安装, 正确的使用方式是先search 工具, 再install工具    

4.3 工具-XCTool

     此工具是用来代替XCode在服务器上执行Build, Test等命令, 类似xcodebuild。

     安装方法:$brew install xctool

     详细介绍: https://github.com/facebook/xctool

4.4  工具-OCLint

     OCLint是一个静态分析工具, 可以检测OC代码, 发现语法漏洞。用该工具来生成代码质量报告(技术债务)。

     安装方式:

     $ brew install Caskroom/cask/oclint

     $ brew tap oclint/formulae

     $ brew install oclint  (不走上面的命令直接install oclint的话, 下载的版本不是最新版, 文档将不能正常生成)

4.5 工具-Gcovr

     该工具是用来生成单元测试覆盖率的文档的

     安装方式: $brew install gcovr

4.6 环境-JDK

     教程: http://jingyan.baidu.com/article/ce09321b7c111f2bff858fea.html

5.Jenkins

     Jenkins一般被称为"构建器", 说简单点就是 "定时触发 + 配置任务"。Jenkins可以通过协同很多别的工具工作, 本文就是通过.sh(脚本)来协同SVN/Git 与 各个工具, 来生成文件并传给Sonar服务器。

     更多Jenkins的知识具体看这两篇教程。

     http://www.cnblogs.com/zz0412/p/jenkins02.html

     http://www.cnblogs.com/horizonli/p/5330073.html

5.1 新建一个工程

查看图片

5.2 代码仓库设置

5.2.1 SVN

查看图片

关于credential:

          Jenkins检测到当前服务器访问不了代码仓库时, 会提示你设置权限, 进入Credential, 设置账号密码就可以了。

5.2.2 Git方式

查看图片

git的Credentials设置:

查看图片

设置好username与private key(能访问git电脑的私钥)就可以了, Passphrase会自动生成。

关于公钥私钥的介绍:

     一般的SSH方式是在git服务器的SSH设置里面添加自己当前电脑的公钥(id_rsa.pub)。然后当前电脑访问Git服务器时就能直接访问了。

     但Jenkins需要在Git上设置好当前电脑的私钥后, 还需要将当前电脑的私钥(id_rsa)保存在Jenkins配置中。猜测是访问git时是以别的电脑来访问的。

Git教程 :http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

5.3 构建设置

     Jenkins支持通过脚本构建, 一般再次设置一些环境与变量, 然后执行脚本。一般此处的设置要结合具体的脚本调用方式来决定, 所以再第六节再详细介绍。

查看图片

我当前的设置是这样的:

  1. 先设置环境变量
  2. 跳转到工程根目录下
  3. 把脚本copy到当前目录下
  4. 执行脚本

5.4 定时构建

     可以指定每天几点执行一次, 或每周五执行一次, 当然也可以点击左上角的"立即构建"立即执行。

例: 设置为周一到周五的9点30~9点45之间进行

查看图片

6.更多说明

6.1 Sonar配置

     本项目的配置指导来源于"https://github.com/octo-technology/sonar-objective-c", 后发现教程中的配置不好用, 最后找到这篇Fork的文章"https://github.com/mjdetullio/sonar-objective-c", 最后是按照第二篇的设置进行的。sonar的配置具体看第二篇文章

     其实我对Sonar的配置不是很清楚, 先留个坑吧。 只知道最后通过runner-sonar工具将生成的文件传给了Sonar服务器, 至于Sonar的配置参数, 则是从.sonar-project.properties文件里面获取的。

     Sonar官网: http://www.javatips.net/blog/sonarqube-tutorial

     Sonar安装: http://www.uml.org.cn/jchgj/201307251.asp

6.2 工程配置

     按照教程的指导, 将run-sonar.sh和sonar-project.properties放到根目录下, 修改.properties文件的内容, 然后执行run-sonar.sh就可以了。

     我是将.properties随项目走, 因为每个项目的配置不一样, 而run-sonar.sh是固定不变的, 所以放在了Jenkins服务器上, 再执行构建时将其拷贝到当前目录下。

介绍些配置过程中用到的命令, 方便大家:

$ ssh 用户名@服务器地址     // 通过bash访问远程服务器

$ scp /Users/xxx/Documents/svn/run-sonar.sh pmo-mini@111.222.2.444:~/opt/iosShell/run-sonar.sh  // 将本地的sh文件copy到远程服务器对应的位置

$ chmod u=rxw run-sonar.sh // 修改文件权限, 使其为可读可写可执行

6.3 脚本执行流程与生成物介绍

     clear 

     build

     test        :     TEST-report.xml

     gcovr     :     coverage-xxx.xml

     oclint     :      oclint.xml

     TEST-report.xml 是通过xctool的test命令生成的, 如果生成失败会有2, 3行的默认文本, 这时就可以证明是执行到test时失败了, 建议先用xcode执行测试, 把环境调通了, 更多单元测试文章, 请看我的 "iOS单元测试入门与配置"篇;

     coverage-XiangMu.xml 是单测覆盖率报告, 如果你的单测覆盖率有误, 看这个文档。走完test后, 在XCode的路径文件下, 会生成项目的覆盖率报告, 然后gcovr命令根据这些报告生成覆盖率报告。 一般覆盖率报告有问题都是test环节有问题

     oclint.xml 是技术债务报告, 一般build环节没有问题, 这个报告就没问题。

6.4 脚本分享

    因为github上的脚本执行时到test命令就错误了, 所以将我修改后的分享出来。

    没有找到能上次文件的地方, 把脚本所以内容全贴出来太浪费地方了, 就分享修改的地方吧, 大家从github上下载, 然后修改吧..

else

	echo -n 'Running tests using xctool'	
	# runCommand sonar-reports/TEST-report.xml $xctoolCmdPrefix -scheme "$testScheme" -reporter junit GCC_GENERATE_TEST_COVERAGE_FILES=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES test
	# ctf:这个命令出错, 用下面的命令代替
	$xctoolCmdPrefix -scheme "$testScheme" -reporter junit:TEST-report.xml GCC_GENERATE_TEST_COVERAGE_FILES=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES test

	echo -n 'Computing coverage report'

	# We do it for every xcodeproject (in case of workspaces)

7.成果

7.1 技术债务

查看图片

          不仅可以显示出有多少不符合”规则”的代码片段,还能根据代码仓库的提交历史对应到时谁的问题

7.2 覆盖率

查看图片

    可以检测到单元测试的覆盖范围,监督单元测试覆盖范围。

7.3 重复

查看图片

          检测到相似的代码片段,提醒将常用的功能封装起来,提高重用性。

7.4 结构

查看图片

      项目的文件结构    

7.5 代码

查看图片

7.6 问题

查看图片

8.未来接入方式与成本

  1. 项目中添加.properties配置文件, 修改配置项;
  2. 在Jenkins添加对应的项目;
  3. 然后? 没有然后了。

posted on 2016-12-27 11:23  沉淀2014  阅读(164)  评论(0编辑  收藏  举报

导航