美文网首页自动化测试/CI测试iOS开发经验🔧
OC静态代码检查及持续集成(xcode analyzer+ocl

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

作者: 骆天涯 | 来源:发表于2016-09-14 15:47 被阅读4949次

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来对代码进行扫描。

入口如图所示:


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即可完成配置。

相关文章

网友评论

  • 十一岁的加重:/Library/Ruby/Site/2.0.0/rubygems.rb:271:in `find_spec_for_exe': can't find gem xcpretty (>= 0.a) (Gem::GemNotFoundException)
    from /Library/Ruby/Site/2.0.0/rubygems.rb:299:in `activate_bin_path'
    from /Users/mac/.rvm/gems/ruby-2.4.0/bin/xcpretty:22:in `<main>'
    from /Users/mac/.rvm/gems/ruby-2.4.0/bin/ruby_executable_hooks:15:in `eval'
    from /Users/mac/.rvm/gems/ruby-2.4.0/bin/ruby_executable_hooks:15:in `<main>'
  • 十一岁的加重:export PATH=$PATH:/Users/mac/.rvm/gems/ruby-2.3.0/bin 处理中
  • 烛风小糊涂:请问 OCLint 能够在一张报表里面显示 Xcode Analyze 的结果和 OCLint 自己检查出来的结果吗?
    骆天涯:@烛风小糊涂 时间长了记得不是很清楚,按照文章步骤最后生成的html文件里应该是包含了你说的这两种错误的吧?不过如果有编译错误是不会执行oclint的检查的。
  • 2b1ed5b649ed:oclint从github下载下来解压,然后是做什么,放到某个目录下吗?:joy:
    骆天涯:解压好就好了。直接cd进去就可以执行的
  • fuadam1982:加了-e Pods,还是对pods下代码进行分析,楼主有遇到过吗
  • 灰烬之心:OCLint的0.1oclint-json-compilation-database -e Pods -- -rc=LONG_LINE=200 -rc=NCSS_METHOD=100 -o=report.html
    执行这个总是报错
    Skipping [path] .Compile command not found
    Xcode 和OCLint都是最新的版本
    a637237315f9:我也是同样的错误,你解决了么?
  • wuyangLi:需要注意的是,这一步生成的json文件在build/reports下,并且名字为compilation_db.json,和oclint默认生成的文件命名和路径均不同,因此需要移动至根目录并重命名为compile_command.json

    这句话什么意思 我移动到reports目录,运行oclint-json-compilation-database -- -report-type pmd -o report.html 得到的report.html是空的
    岁月无痕2046:@骆天涯 我搞不定啊 OCLint report not found at /Users/changkong/Desktop/HC_1_New 12 29 2/oclint.xml
    骆天涯:是用xcpretty生成的文件在build/reports下,文件名为compilation_db.json.而oclint默认解析的文件是在项目工程的根目录,并且名称为compile_command.json。所以如果和我一样用xcpretty来做的话,需要用mv指令将文件移动到oclint默认的解析位置,并重命名。
  • ldldlkdldld:请问xcode 8.1还能用吗?我在xcode 8.1下报错
    ldldlkdldld:@骆天涯 没事,Xcode每次更新都问题一堆
    骆天涯:@周永强 :flushed: 暂时还没转移到Xcode 8呢,抱歉不能帮上忙
    advancer_chen:@周永强 对于该问题我也正在研究, 欢迎加群一起来讨论. QQ群:323276186
  • Joyinter:运行oclint-json-compilation-database -- -report-type pmd -o report.html命令时,
    单独在slave服务器运行oclint脚本不报错,通过jenkins调用脚本,统计结果出现后就报错,不是环境变量的问题。博主有遇到过吗
    Joyinter:@骆天涯 是jenkins主从服务器环境变量不一致导致的,已解决 谢
    骆天涯:@Joyinter 能说下报了什么错误信息吗?我有遇到过json文件不见了的问题,后来调整成xctools以后跑着跑着就一切正常了

本文标题:OC静态代码检查及持续集成(xcode analyzer+ocl

本文链接:https://www.haomeiwen.com/subject/tnvvettx.html