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

本篇详细的介绍了 Sonar 的接入流程, 国内外相关文章稀少, 难能可贵 —— 由 每个人丶都是自己的传奇 分享

所有文章目录: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. 然后? 没有然后了。

iOS Sonar 集成流程的更多相关文章

  1. iOS app集成支付宝支付流程及后台php订单签名处理

    iOS app集成支付宝支付流程 1: 开通支付宝商户 由公司去支付宝 https://b.alipay.com/order/serviceIndex.htm 签约支付宝开通支付宝商家: 2:商户支付 ...

  2. iOS 持续集成

    iOS 持续集成系列 - 开篇 前言 iOS 开发在经过这几年的野蛮生长之后,慢慢地趋于稳定.无论开发语言是 Objective-C 还是 Swift,工程类型是 Hybird 还是原生,开发思想是 ...

  3. 20个可以帮你简化iOS app开发流程的工具

    这里推荐20个可以帮你简化iOS app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是 ...

  4. CI Weekly #21 | iOS 持续集成快速入门指南

    搭建 iOS 持续集成环境要多久?每个 iOSer 都有不同的答案.这次我们整理了 flow.ci 的 iOS 持续集成的相关文档和最佳实践,希望帮你更快地完成构建.更新文档见: flow.ci iO ...

  5. 使用Jenkins+Calabash+Cocoapods搭建iOS持续集成环境

    使用jenkins+calabash+cocoapods搭建ios持续集成环境 持续集成 持续集成到底是什么呢?依据敏捷大师Martin Fowler的定义: 持续集成是一种软件开发实践. 在持续集成 ...

  6. 一步一步构建iOS持续集成:Jenkins+GitLab+蒲公英+FTP

    什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...

  7. iOS App上架流程(2016详细版)

    iOS App上架流程(2016详细版) 原文地址:http://www.jianshu.com/p/b1b77d804254 感谢大神整理的这么详细 一.前言: 作为一名iOSer,把开发出来的Ap ...

  8. 现有iOS项目集成React Native过程记录

    在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...

  9. fir.im Weekly - 暖心的 iOS 持续集成,你值得拥有

    一则利好消息,flow.ci 支持 iOS 项目持续集成,想试试的伙伴去 Gitter群 问问.首批尝鲜用户@阿米amoy 已经用 flow.ci 实现了基本的 iOS 持续集成,并详细记录整个 Bu ...

随机推荐

  1. ios10 no route to host

    IdTCPClient1 ios10 no route to host IOS 9 正常 IOS10 出错,参考下面的设置解决问题 http://www.sh-huhe.com/solution/14 ...

  2. php开发环境

    php一般使用xampp(apache+mysql+php+perl)部署,下载地址https://www.apachefriends.org/zh_cn/index.html.本文不用集成包,搭建P ...

  3. 关于context:component-scan配置中use-default-filters参数的作用

    参考了多篇文章都说明了use-default-filters参数的基本用途,但有些主要点没有说到,这里补充记录下: <context:component-scan base-package=&q ...

  4. loadrunner --global schedule设置

  5. robot framework 安装配置

    robot framework 是一款专门用作自动化测试的框架,提供了丰富的内置库,与第三方库,也支持用户自己编写的库,robot framework +library 可以 用来做ui的自动化测试, ...

  6. android_demo之自动生成动态表格

    今天我们学习了如何更好的利用Android 的 layout 布局. 接下来是个简单的栗子去了解这个自动生成的动态的控件(自动生成表格) 这是我们的layout 页面 <?xml version ...

  7. alhpa阶段回顾

    说明:本次课程,大家按照我下面列出来的问题进行回顾和反思,总结alhpa阶段以来的得失.每个组都要回答这些问题.由组长或者组员来回答都可以.目的依然是让大家养成软工的一些习惯和思维方式. 1.最初的需 ...

  8. SecureCRT和SecureFx设置中文乱码

    SecureCRT和SecureFx设置中文乱码 SecureCRT和SecureFx连接服务器时中文显示乱码,找了好多资料好久都没整出来,后来整出来了,因此把个人的解决办法提供出来,已变帮助更多的人 ...

  9. DOS命令(可查看本机IP地址各个网卡号)

    网卡号指的是网卡的编号,也就是网卡的物理地址.查看方法:(以win7为例)打开开始 输入cmd 回车后进入dos命令行模式,然后输入ipconfig /all 回车查看结果找到"无线局域网适 ...

  10. JSP开发模式2(计算器)

    CalculatorBean———————————————————————————————————————————— public class CalculatorBean {    private ...