此文已由作者杨晓授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

在Mac OS系统上,采用Xcodebuild Analyze命令和OClint工具,对iOS项目进行静态代码检查,输出可视化结果。然后将项目持续集成至CI平台,并使用PMD插件进行错误统计的展示。对此,本文由以下4个要点来阐述。

  1. 背景

  2. Xcodebuild命令行指令

  3. oclint工具获取可视化结果

  4. 持续集成

1.背景

AR家装是感知与智能中心的一个新项目,通过AR和VR技术,在iOS平台上可以很好地展现样板间设计和家具的实时场景。场景展示的功能是由Unity来完成,iOS主要负责UI和前后台交互的功能,比如登录、权限管理、下载等。由于项目成立不久,开发进度比较赶,代码以实现功能为主导,因此会对后续的代码管理和程序设计带来较大的隐患。对此,QA希望通过对项目进行定期静态代码检查,来实现iOS端代码质量控制,以降低项目风险。

OC的静态代码检查工具比较常见的有Clang-Analyzer、 OClint等,qablog上有一篇关于Clang-Analyzer的介绍 iOS静态代码检查工具Clang Static Analyzer介绍。本人采用Clang-Analyzer方法在Terminal中尝试,发现项目中引用的一些第三方库,对一些版本号限制的编译平台会编译失败,尝试解决无果后转而使用OClint。

本项目采用Xcode自带命令行Xcodebuild的Analyze功能,结合OClint工具,在Jenkins上集成静态代码检查。在实战的过程中遇到了一些问题,绕了一些弯路,记录下来希望对其他项目有所帮助。

环境配置:

  • Mac OS: 10.10.5(包括slave节点)

  • Souce Control: Git

  • Xcode Version: 7.3.1

  • OClint Version: 0.10.3

  • xcpretty

2.Xcodebuild命令行指令

其实,Xcode工具包含了静态代码分析的功能,打开项目程序,点击菜单的Product->Analyze即可对代码进行扫描。

入口如图1所示:

经过长时间地解析后,最终得到结果如图2所示:

这种检查方法的好处在于方便,直接在Xcode中运行,能按不同的方式查看检查结果,并能准确地定位出错位置。

但对于QA来说,不足之处也是显而易见的,整个过程需要定期执行静态代码检查,分类统计的结果虽适合开发自查,但并不适用于QA对代码质量把控。

对于命令行执行静态代码检查,可以利用Xcodebuild指令在命令行中执行Build、Analyze和Clean等功能,以下简单介绍下Analyze和Clean的用法。

Xcodebuild Analyze

Xcodebuild功能非常强大,具体的用法可以通过man xcodebuild来查看。本项目主要用到的是clean、analyze操作和一些配置信息。

Xcodebuild指令基本用法介绍如下,需要进入到当前项目所在的目录(projectName.xcproj或workspaceName.xcworkspace文件所在目录),然后执行相应指令,如下图3所示。

xcodebuild [-project projectname][-target targetname ...] 
[configuration configurationname][-sdk [sdkfullpath | sdkname]]
[buildaction ...] [setting=value ...][-userdefault=value ...]

由于AR项目包含了iOS项目和Unity项目,两个project在同一个workspace下,因此需要加入-workspace workspaceName.xcworkspace和-scheme schemeName。如果不加入参数,在xcodebuild执行过程中,可能会出现类似ld: library not found for -lxxxx的错误。

总结一下,其实到这一步就已经完成了最重要的静态代码检查工作了:xcodebuild -workspace workspaceName.xcworkspace -scheme schemeName analyze

Xcodebuild Clean

静态代码检查会生成.o链接文件,执行过一次xcodebuild analyze后,如果此文件没有变化就不会再次编译。而可视化结果的输出其实是依赖命令行的输出结果,如果跳过了编译过程,log中就不会有warning的记录,就会默认当前文件是没有错误的。因此每次编译前都需要清空项目一些中间过程的生成文件,以确保每次检查都是重新生成的链接库。对此,简单执行xcodebuild clean即可。

Xctool工具

Xctool工具是Xcodebuild命令行的一个替代产品。包含了xcpretty的功能。上述步骤也可用Xctool来执行

安装配置Xctool,如下图4所示。

brew install xctool

安装完成后Xctool位于/usr/local/bin目录下,执行如下命令行可以生成文中将提到的OClint可以解析的文件格式,如下图5所示。

shellxctool -workspace workspaceName.xcworkspace -scheme schemeName cleanxctool -workspace workspaceName.xcworkspace -scheme schemeName -reporter json-compilation-database:compile_commands.json

3.OClint工具

-
OClint在本项目中的作用是对Xcodebuild产生的log进行分析,获取相关数据后生成html文件或pmd文件。

OClint安装及配置

从OClint的GitHub项目链接中下载安装包oclint-0.10.3-x86_64-darwin-15.5.0.tar.gz.

解压后,在当前用户的.bashrc目录下配置环境变量,如下图6所示

OCLINT_HOME=/pathexport PATH=$PATH:OCLINT_HOME/bin

然后执行source .bashrc即可

运行OClint确认环境配置是否正确,如下图7所示。

$ oclintoclint: Not enough positional command line arguments specified!
Must specify at least 1 positional arguments: See: oclint -help

Xcodebuild 与 OClint结合

根据OClint官网的教程,执行如下:

xcodebuild analyze | tee xcodebuild.log将xcodebuild analyze的输出信息记录在xcodebuild.log中。

oclint-xcodebuild xcodebuild.log 对log进行解析,生成compile_command.json。进行到这一步后命令行提示,如下图8所示:

This binary is no longer under maintenance by OCLint team.Please consider using xcpretty (https://github.com/supermarin/xcpretty) instead!

对此,我们采用xcpretty,xcpretty可以用gem install xcpretty来下载安装。根据教程,xcpretty可以通过--report json-compilation-database来生成OClint所需的json文件。因此合并前两步,如下图9所示:

xcodebuild analyze | tee xcodebuild.log | xcpretty --report json-compilation-database

需要注意的是,这一步生成的json文件在build/reports目录下,并且名为compilation_db.json,和OClint默认生成的文件命名和路径均不同,因此需要移动至根目录并重命名为compile_command.json。

若采用Xctool可以按照前文中给出的命令直接生成正确的compile_command.json文件。

最后一步生成html或pmd文件,如下图10所示

oclint-json-compilation-database -e Pods-- -report-type pmd -o report.html

其中 -e Pods为去掉第三方库的静态代码检查错误。 -report-type pmd可以选择为pmd格式输出,方便在Jenkins中通过PMD插件查看结果。-o report.html为指定输出文件名称。

参数配置,第一次运行的时候OClint会报错,需要进行参数配置,如下图11所示。

violation exceed threshold
P0=0[0], P1=41[10], P2=200[20]

查了一些资料发现,P1=41[10]是说P1(Normal级别 Warning)发现41个,但是限制为10个,超过10个则失败。因此通过-max-priority-2=9999修改阈值。另外,还可以通过-disable-rule=LongLine来根据需要过滤一些warning的类型,具体的可以查阅文档或生成结果。

4.持续集成至Jenkins平台

在集成到Jenkins平台的过程中,由于是第一次使用Mac OS作为slave机器,在用户权限上遇到些问题。

在运行|xcpretty --report json-compilation-database的时候提示 xcpretty:command not found.

再三验证命令行和xcpretty安装正确后怀疑是账号权限问题。不像Linux和Windows的slave节点,Jenkins有一个独立的账号来运行shell脚本。在Mac OS上,Jenkins运行的账户,是运行Jenkins中slave脚本的账户。确认了机器上所有的用户都可以执行xcpretty命令以后,我开始质疑是否是Jenkins运行在不可见的账户上。为了确认这个问题,查阅了一些资料后,发现可以通过Jenkins管理网站节点的System Info来确认,如下图12所示。

从图中,我们可以看到所用账号的确是常用的netease账号,但是netease账号却是可以执行xcpretty指令的。接着往下看,发现PATH变量与Terminal中查看到的PATH变量不同,感觉找到了问题所在。在执行脚本中加入如下语句即可,如图13所示。

export PATH=$PATH:/Users/netease/.rvm/gems/ruby-2.1.1/bin
OCLINT_HOME=/Users/netease/Downloads/oclint-0.10.3export PATH=$PATH:$OCLINT_HOME/bin

至此Job配置完成,在配置中,加入Add Post-build Actions中的Publish PMD analysis results即可完成配置。PMD文件的生成结果如下图15所示。

 

不过截止我写完这篇文章,似乎OClint的PMD报告不支持编译错误和警告的数据展示。考虑到数据的完整性,也可采用Html报告的格式。只需要将上一部中的Publish PMD analysis result改为Publish HTML Reports即可。

免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 快速登录机器&数据库
【推荐】 MongoDB的正确使用姿势
【推荐】 MySQL多线程备份工具mydumper 之 RDS外部实例迁移平台

OC静态代码检查实战的更多相关文章

  1. [原创]Java静态代码检查工具介绍

    [原创]Java静态代码检查工具介绍 一  什么是静态代码检查? 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数 ...

  2. 静态代码检查工具 cppcheck 的使用

      CppCheck是一个C/C++代码缺陷静态检查工具.不同于C/C++编译器及其它分析工具,CppCheck只检查编译器检查不出来的bug,不检查语法错误.所谓静态代码检查就是使用一个工具检查我们 ...

  3. 静态代码检查工具 cppcheck 的使用(可分别集成到VS和QT Creator里)

    CppCheck是一个C/C++代码缺陷静态检查工具.不同于C/C++编译器及其它分析工具,CppCheck只检查编译器检查不出来的bug,不检查语法错误.所谓静态代码检查就是使用一个工具检查我们写的 ...

  4. 在Jenkins中使用sonar进行静态代码检查

    要解决的问题 jenkins自动构建完成后,希望能通过sonar静态代码检查生成一份报告,给与开发人员对当前代码的做一个质量评估和修改意见 1.安装并配置sonar服务器 懒得说,跟着官方文档走就行, ...

  5. C#静态代码检查工具StyleCode

    C#静态代码检查工具StyleCode -- 初探 最近我们Advent Data Service (ADS) 在项目上需要按照代码规范进行代码的编写工作,以方便将来代码的阅读与维护. 但是人工检查起 ...

  6. jenkins+findbugs+checkstyle+PMD静态代码检查(二)

    可以根据自己的需求选中对应的插件进行配置(不一定非要同时配置三个插件) jenkins:持续集成的工具 fundbugs:检测代码静态错误的插件  例如:定义了没有用到的对象,string类型的比较使 ...

  7. FindBugs:Java 静态代码检查

    在使用 Jenkins 构建 Java Web 项目时候,有一项叫做静态代码检查,是用内置的 findBugs 插件,对程序源代码进行检查,以分析程序行为的技术,应用于程序的正确性检查. 安全缺陷检测 ...

  8. Python静态代码检查工具Flake8

    简介 Flake8 是由Python官方发布的一款辅助检测Python代码是否规范的工具,相对于目前热度比较高的Pylint来说,Flake8检查规则灵活,支持集成额外插件,扩展性强.Flake8是对 ...

  9. Nodejs + Jshint自动化静态代码检查

    1.   目的 提交代码前能够自动化静态代码检查,提高代码质量 2.   准备 1.    Nodejs安装: 官方地址:http://nodejs.org/ 安装说明:根据电脑配置下载对应的版本进行 ...

随机推荐

  1. [转]gzip,bzip2,tar,zip命令使用方法详解

    原文:http://blog.chinaunix.net/uid-20779720-id-2547669.html 1 gzipgzip(1) 是GNU的压缩程序.它只对单个文件进行压缩.基本用法如下 ...

  2. 安卓开发懒鬼最爱之ButterKnife,依赖注入第三方是库,进一步加速开发速度

    转载请注明出处:王亟亟的大牛之路 还在烦躁一大堆findById的控件操作而烦恼么? 平时,我们的那一系列findById是一个"浩大的project"样比例如以下 这是以前一个项 ...

  3. Xcode 技巧充电篇

    作为project师,我们最重要的事情就是熟悉我们每天使用的日常工具,但不能仅限于此.仅仅要有可能,我们应该试着掌握和定制能使我们更快.更轻松地实现终于目标的工具.以下是一些小提示和技巧,都是我在 X ...

  4. Json实现异步请求(提交评论)

    主要将代码粘贴,通过阅读代码理解当中的相关逻辑. html代码: <form id="form1" runat="server"> <p> ...

  5. SQLDMO注冊

    在维护人事系统时.师姐给我们提出一个功能上有问题. 备份数据库时.报黄页.然后须要我们寻找原因,作出解决方式. 一開始我从原先在本机上公布的系统入手,发现没有出现故障.可是.当对程序进行调试时,就出现 ...

  6. ScrollView白边问题

    在Android开发所使用的ScrollView中..兼容比較低的版本号的时候(比方14)会出现难看的白边.这时假设使用的是xml布局文件话设置ScrollView的android:fadingEdg ...

  7. 三张图教你生成一个Android jar 库。

    我看到非常多教人使用第三方开源组件的Android教程.都是在教基于源代码project的库导入,个人觉得非常不妥,觉得最恰当的方式是把源代码project生成一个jar再导入到目标project上使 ...

  8. Android 上的 制表符(tab) —— 一个奇妙的字符 (cocos2dx crash)

    今天測试发现了游戏的一个问题,系统邮件,假设发了tab,在android上一打开邮件内容就会crash.并且他们非常确定是tab的问题. 凭我多个月的经验(确实没多年. . .)来看.从来没听说在an ...

  9. const& 的东西

    class_name ( class_name const & source ); 是拷贝构造函数的标准声明. 它和如下声明是一个意思 class_name ( const class_nam ...

  10. 区分虚拟机和machine simulator

    1 虚拟机和machine simulator的不同 虚拟机是让多个操作系统同时共用现有的硬件架构,它不会模拟新的硬件架构.qemu这样的模拟器是模拟新的硬件架构,这个架构和host不同.