OC静态代码检查及持续集成(xcode analyzer+oclint+xcpretty)

OC静态代码检查实战

在Mac OS系统上,采用xcodebuild analyze命令和oclint工具,对项目iOS代码进行静态代码检查,并输出可视化结果。持续集成至CI平台,并使用PMD插件进行错误统计数据的展示。

  1. 导言
  2. Xcodebuild命令行指令
  3. oclint工具获取可视化结果
  4. oclint
  5. 持续集成

导言


OC代码的静态代码检查工具比较常见的有clang-analyzer, oclint等。笔者在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

Xcodebuild命令行指令


Xcode工具其实包含了静态代码分析的功能,打开项目后,可以通过菜单的Product->Analyze来对代码进行扫描。

入口如图所示:


OC静态代码检查及持续集成(xcode analyzer+oclint+xcpretty)_第1张图片
Xcode Analyzer IDE 入口

经过长时间的解析后,最终得到结果如图:

Xcode Analyzer 结果示意图

这种检查方式好处是方便,直接在xcode中运行,并且可以按不同的方式查看静态代码的错误,点击左侧的代码可以直接跳转至有问题的代码。

但是不足之处也是显而易见的。对于QA来说,需要定期执行静态代码检查,势必要加入到持续集成系统中,最好是可以通过命令行执行;并且我们需要的是一个分类统计的结果,逐条列出便于跳转的结果方便开发自查,但不方便QA对代码质量进行把控。

不过Xcode自带有命令行工具,可以利用xcodebuild指令在命令行中执行build,analyze,clean等功能。

xcodebuild analyze

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

xcodebuild指令用法的基本介绍如下,需要进入到项目所在目录(projectName.xcproj或workspaceName.xcworkspace文件所在目录)执行。

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即可。

oclint工具


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

oclint安装及配置

  1. 从oclint的github项目链接中下载安装包oclint-0.10.3-x86_64-darwin-15.5.0.tar.gz.
  2. 解压后在当前用户的.bashrc中配置环境变量
OCLINT_HOME=/path
export PATH=$PATH:OCLINT_HOME/bin

然后source .bashrc即可

  1. 运行oclint确认环境配置正确
$ oclint
oclint: Not enough positional command line arguments specified!
Must specify at least 1 positional arguments: See: oclint -help

xcodebuild 与 oclint结合

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

  1. xcodebuild analyze | tee xcodebuild.log将xcodebuild analyze的输出信息记录在xcodebuild.log中。
  2. oclint-xcodebuild xcodebuild.log 对log进行解析,生成compile_command.json。进行到这一步后命令行提示:
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文件。因此合并前两步:

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

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

  1. 最后一步生成html或pmd文件
oclint-json-compilation-database -- -report-type pmd -o report.html
  1. 参数配置
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的类型,具体的可以查阅文档或生成结果。

持续集成至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来确认。

Mac OS的slave节点信息查阅发现,所用账号的确是常用的user账号,但是user账号却是可以执行xcpretty指令的。接着往下看,发现PATH变量与terminal中查看到的PATH变量不同,感觉找到了问题所在。在执行脚本中加入如下语句即可。

export PATH=$PATH:/Users/xxx/.rvm/gems/ruby-2.1.1/bin

oclint的系统配置也可以同理搞定。

OCLINT_HOME=/Users/xxx/Downloads/oclint-0.10.3
export PATH=$PATH:$OCLINT_HOME/bin

至此Job配置完成,在配置中,加入Add Post-build Actions中的Publish PMD analysis results即可完成配置。

你可能感兴趣的:(OC静态代码检查及持续集成(xcode analyzer+oclint+xcpretty))