全部文章目录:http://my.oschina.net/ChenTF/blog/677112html
本篇文章地址: http://my.oschina.net/ChenTF/blog/708646java
对您有帮助的话, 还请"赞" 一下哦, 有问题可留言或加QQ群:323276186ios
关于XCode8的兼容方案, 请看个人这篇文章:https://my.oschina.net/ChenTF/blog/806565git
行业内提到"代码质量管理, 自动化质量管理", 通常指的都是经过Sonar来实现。本文的目标是实如今Sonar上显示出iOS项目, 先看张最终的效果图:github
用Sonar可以实现什么?objective-c
问题1: "规则"指的是什么? xcode
在Sonar工具中配置检测工具(规则), 而后sonar根据规则检测"质量报告文件", 得出问题数目。 好比本文配置的规则是OCLintbash
问题2: 技术债务的天数怎么得出?服务器
每一个规则都有对应的处理时间, 最后:问题类型1数目 * 对应时间 + 问题类型2数目 * 对应时间 +... 获得时间。运维
Sonar原生并不支持iOS, 因此就须要咱们本身按照Sonar原理来安装各个工具, 并将各个工具链接起来, 生成质量结果, 并由Jenkins来实现自动化执行。
但因为涉及到的知识范围很广, 不只须要iOS开发技术, 还须要运维知识和各个命令工具的使用方法。 并且国内外的资料少的至关可怜, 没有最佳实践, 没有专门的第三方平台, 形成不少东西都是一步步试错出来的, 一步一坎, 因此用了很长时间。
不过最后都将每一个工具, 每一个步骤打通, 将各个工具链接起来, 整理成.sh脚本 和 .properties配置文件, 这样在后续新添项目时会很轻松。
其实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
“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工具
此工具是用来代替XCode在服务器上执行Build, Test等命令, 相似xcodebuild。
安装方法:$brew install xctool
详细介绍: https://github.com/facebook/xctool
OCLint是一个静态分析工具, 能够检测OC代码, 发现语法漏洞。用该工具来生成代码质量报告(技术债务)。
安装方式:
$ brew install Caskroom/cask/oclint
或
$ brew tap oclint/formulae
$ brew install oclint (不走上面的命令直接install oclint的话, 下载的版本不是最新版, 文档将不能正常生成)
该工具是用来生成单元测试覆盖率的文档的
安装方式: $brew install gcovr
教程: http://jingyan.baidu.com/article/ce09321b7c111f2bff858fea.html
Jenkins通常被称为"构建器", 说简单点就是 "定时触发 + 配置任务"。Jenkins能够经过协同不少别的工具工做, 本文就是经过.sh(脚本)来协同SVN/Git 与 各个工具, 来生成文件并传给Sonar服务器。
更多Jenkins的知识具体看这两篇教程。
http://www.cnblogs.com/zz0412/p/jenkins02.html
http://www.cnblogs.com/horizonli/p/5330073.html
关于credential:
Jenkins检测到当前服务器访问不了代码仓库时, 会提示你设置权限, 进入Credential, 设置帐号密码就能够了。
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
Jenkins支持经过脚本构建, 通常再次设置一些环境与变量, 而后执行脚本。通常此处的设置要结合具体的脚本调用方式来决定, 因此再第六节再详细介绍。
我当前的设置是这样的:
能够指定天天几点执行一次, 或每周五执行一次, 固然也能够点击左上角的"当即构建"当即执行。
例: 设置为周一到周五的9点30~9点45之间进行
本项目的配置指导来源于"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文件里面获取的。
run-sonar.sh在第一个github连接里面, 在6.4中将.sh修改了, 同窗们请注意; .properties下载第二个连接里面的。
附:
Sonar官网: http://www.javatips.net/blog/sonarqube-tutorial
Sonar安装: http://www.uml.org.cn/jchgj/201307251.asp
按照教程的指导, 将run-sonar.sh和sonar-project.properties放到根目录下, 修改.properties文件的内容, 而后执行run-sonar.sh就能够了。文件下载地址:https://github.com/mjdetullio/sonar-objective-c
我是将.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 // 修改文件权限, 使其为可读可写可执行
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环节没有问题, 这个报告就没问题。
由于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:sonar-reports/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.3 重复
检测到类似的代码片断,提醒将经常使用的功能封装起来,提升重用性。
项目的文件结构
在XCode8以后, XCTool已不支持了, 对这点我用xcodebuild+xcpretty来进行了替换, 具体详情看个人这篇文章: https://my.oschina.net/ChenTF/blog/806565