iOS Sonar集成流程详解

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

本篇文章地址:  http://my.oschina.net/ChenTF/blog/708646

对您有帮助的话, 还请"赞" 一下哦, 有问题可留言或加QQ群:323276186

关于XCode8的兼容方案, 请看我的这篇文章:https://my.oschina.net/ChenTF/blog/80656

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 关系逻辑讲解

每个项目添加一个配置文件(.properties), 为了在Jenkins上调用命令时能自动填充项目设置;

在Jenkins上安装各个工具(XCTool, OCLint, gcovr, sonar-runner) 与 .sh脚本, Jenkins服务器可以从代码仓库clone下代码, 然后通过.sh脚本与.properties配置文件来调用各个“工具”, 然后每个项目生成对应的“文件”;

在 .sh脚本 最后会通过sonar-runner将生成的 ”文件” 传给Sonar服务器, Sonar服务器以图形化的形式显示出对应的结果。

具体传递给哪个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支持通过脚本构建, 一般再次设置一些环境与变量, 然后执行脚本。一般此处的设置要结合具体的脚本调用方式来决定, 所以再第六节再详细介绍。

我当前的设置是这样的:

先设置环境变量

跳转到工程根目录下

把脚本copy到当前目录下

执行脚本

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上下载, 然后修改吧..

elseecho-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 

testecho-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.未来接入方式与成本

项目中添加.properties配置文件, 修改配置项;

在Jenkins添加对应的项目;

然后? 没有然后了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,653评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,321评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,833评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,472评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,306评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,274评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,658评论 3 385
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,335评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,638评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,697评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,454评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,311评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,699评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,986评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,254评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,647评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,847评论 2 335

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,680评论 6 342
  • iOS 持续集成 - 开篇 iOS 持续集成 - 自动化 Code Review [iOS 持续集成 - 自动化单...
    PPPan阅读 11,454评论 34 96
  • 前言 众所周知,现在App的竞争已经到了用户体验为王,质量为上的白热化阶段。用户们都是很挑剔的。如果一个公司的推广...
    闲云清烟阅读 2,504评论 1 4
  • 1.Sonar介绍 Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具...
    南调江南阅读 2,465评论 0 0
  • 优弹素——让我遇到更好的自己 如果说遇见是一种美的邂逅,那么我与你的相遇必定是生活对我追求美的最大馈赠。在从姐妹手...
    霸王青青阅读 294评论 0 0