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 关系逻辑讲解
- 每个项目添加一个配置文件(.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上下载, 然后修改吧..
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.未来接入方式与成本
- 项目中添加.properties配置文件, 修改配置项;
- 在Jenkins添加对应的项目;
- 然后? 没有然后了。
iOS Sonar 集成流程的更多相关文章
- iOS app集成支付宝支付流程及后台php订单签名处理
iOS app集成支付宝支付流程 1: 开通支付宝商户 由公司去支付宝 https://b.alipay.com/order/serviceIndex.htm 签约支付宝开通支付宝商家: 2:商户支付 ...
- iOS 持续集成
iOS 持续集成系列 - 开篇 前言 iOS 开发在经过这几年的野蛮生长之后,慢慢地趋于稳定.无论开发语言是 Objective-C 还是 Swift,工程类型是 Hybird 还是原生,开发思想是 ...
- 20个可以帮你简化iOS app开发流程的工具
这里推荐20个可以帮你简化iOS app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是 ...
- CI Weekly #21 | iOS 持续集成快速入门指南
搭建 iOS 持续集成环境要多久?每个 iOSer 都有不同的答案.这次我们整理了 flow.ci 的 iOS 持续集成的相关文档和最佳实践,希望帮你更快地完成构建.更新文档见: flow.ci iO ...
- 使用Jenkins+Calabash+Cocoapods搭建iOS持续集成环境
使用jenkins+calabash+cocoapods搭建ios持续集成环境 持续集成 持续集成到底是什么呢?依据敏捷大师Martin Fowler的定义: 持续集成是一种软件开发实践. 在持续集成 ...
- 一步一步构建iOS持续集成:Jenkins+GitLab+蒲公英+FTP
什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...
- iOS App上架流程(2016详细版)
iOS App上架流程(2016详细版) 原文地址:http://www.jianshu.com/p/b1b77d804254 感谢大神整理的这么详细 一.前言: 作为一名iOSer,把开发出来的Ap ...
- 现有iOS项目集成React Native过程记录
在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...
- fir.im Weekly - 暖心的 iOS 持续集成,你值得拥有
一则利好消息,flow.ci 支持 iOS 项目持续集成,想试试的伙伴去 Gitter群 问问.首批尝鲜用户@阿米amoy 已经用 flow.ci 实现了基本的 iOS 持续集成,并详细记录整个 Bu ...
随机推荐
- PCA降纬一步一步
import numpy as np 第一步:原始值 X1 0.9 2.4 1.2 0.5 0.3 1.8 0.5 0.3 2.5 1.3 X2 1 2.6 1.7 0.7 0.7 1.4 0.6 0 ...
- Nodejs学习(三)-安装nodejs supervisor,提高点效率吧。
安装好了express准备写项目,可是发现随便改一下js都要使用npm start重新启动才能生效,这个很不好,搜索一下发现有这么一个模块supervisor.那就安装一下吧. 1.安装,这个必须是全 ...
- python基础知识9——模块2——常见内置模块
内置模块 内置模块是Python自带的功能,在使用内置模块相应的功能时,需要[先导入]再[使用] 1.sys 用于提供对Python解释器相关的操作: sys.argv 命令行参数List,第一个元素 ...
- diary and html 文本颜色编辑,行距和其它编辑总汇
p{line-height:1.2em;}/*段落行间距为2倍.*/ 几小块文字有白色的底色很突兀,显得难看.打开html,那儿有background color的设置,值是#FFFFFF. 对照ht ...
- linux 学习3 第四讲 文件常用命令
好几天没有在网上总结了.我把ppt先誊写在本子上,这样听的时候记录就方便很多,添些东西就可以. 我想先看shell那部分,但是没有之前几章的准备,是没法跟着视频动手操作的.所以还是按部就班得学习. 虽 ...
- HTML DOM Event对象
我们通常把HTML DOM Event对象叫做Event事件 事件驱动模型 事件源:(触发事件的元素)事件源对象是指event对象 其封装了与事件相关的详细信息. 当事件发生时,只能在事件函数内部访问 ...
- Spring文件上传配置
增加依赖jar包 <dependency> <groupId>commons-fileupload</groupId> <artifactId>comm ...
- macbook 重装win7
若是第一次已经成功好了,并且把第一次的安装U盘WININSTALL内容保存完好的前提下, win7要重新安装. 先进入Boot Camp移除Windows,备份好你的WIN系统的重要文件. 把第一次的 ...
- json文本装换为JSONArray
package com.beijxing.TestMain; import java.io.File; import java.io.IOException; import org.apache.co ...
- Vue.JS入门学习随笔
PS:先说说学习Vue的缘由吧,学习完了React之后,突然发现又出了一款叫做vue的框架,而且据说可以引领又一波新框架的潮流,我容易吗我!!! Vue.js(读音 /vjuː/, 类似于view ...