Jenkins+oclint集成iOS代码静态分析

OCLint
fastlane
xcpretty

这里主要介绍jenkins+fastlane+oclint实现iOS的代码静态分析并生成PMB报告

集成

1.环境

系统: os 10.14
Xcode版本:Xcode 10

2.安装oclint

使用brew安装
brew tap oclint/formulae
brew install oclint

安装完成之后可以在终端oclint --version看下是否安装成功

3.编写oclint脚本

OCLint大概的执行流程就是:

  1. Clean工程
  2. Clang编译工程生成log

xcodebuild.log

  1. xcpretty转化log为json文件

xcpretty -r json-compilation-database -o compile_commands.json

  1. oclint-json-compilation-database根据设置的规则分析生成报告
    脚本如下:
#!/bin/bash -il
source ~/.bashrc
myworkspace=xxx.xcworkspace
myscheme=xxx

# clean cache
rm -rf ~/Library/Developer/Xcode/DerivedData/;
rm compile_commands.json;
rm oclint_result.xml;

# clean -- build -- OCLint analyse
echo 'start analyse';
xcodebuild -workspace $myworkspace -scheme $myscheme clean&&
xcodebuild -workspace $myworkspace -scheme $myscheme \
-configuration Debug GCC_PRECOMPILE_PREFIX_HEADER=YES CLANG_ENABLE_MODULE_DEBUGGING=NO COMPILER_INDEX_STORE_ENABLE=NO \
-destination 'platform=iOS Simulator,name=iPhone X' \
| xcpretty -r json-compilation-database -o compile_commands.json&&
oclint-json-compilation-database -e Pods -e node_modules -- \
-report-type pmd \
-rc LONG_LINE=300 \
-rc LONG_METHOD=200 \
-rc LONG_VARIABLE_NAME=40 \
-rc LONG_CLASS=3000 \
-max-priority-1=1000 \
-max-priority-2=1000 \
-max-priority-3=2000 \
-disable-rule=UnusedMethodParameter \
-disable-rule=AvoidPrivateStaticMembers \
-disable-rule=ShortVariableName \
-allow-duplicated-violations=false >> oclint_result.xml; \
echo 'end analyse';

# echo result
if [ -f ./oclint_result.xml ]; 
then echo 'done';
else echo 'failed';
fi

脚本分析

  • -e
    需要忽略分析的文件,这些文件的警告不会出现在报告中
  • -rc
    需要覆盖的规则的阀值,这里可以自定义项目的阀值,默认阀值
  • -enable-rule
    支持的规则,默认是oclint提供的都支持,可以组合-disable-rule来过滤掉一些规则
    规则列表
  • -disable-rule
    需要忽略的规则,根据项目需求设置
  • -report-type
    分析的报告的类型,支持[text、html、xml、json、pmd],差异可见对应Sample
    一般会选择可读性好的html或者pmd;这里我们选取pmd类型,用于结合PMD analysis生成PMD warnings,能比较友好的在Jenkins的看板中展示出来。

执行分析

打开终端,cd到oclint.sh所在的目录,执行

chmod 777 oclint.sh && ./oclint.sh

最终在同级目录下会生成compile_commands.jsonoclint_result.xml

  • compile_commands.json -- xcpretty将原始的xcodebuild.log转为json格式的json-compilation-database
  • oclint_result.xml--oclint生成的分析报告

4.集成到Jenkins

具体步骤如下:

  1. 创建一个job

可创建一个自由风格的任务或者是Pipline

  1. 从远端仓库拉取代码
    1552554585306.png
  2. 配置构建规则

    设置定时构建
    1552546242878.png
  3. 执行构建脚本


    1552546337365.png

添加一个执行shell的流程,将执行分析的脚本执行

  1. 构建完成生成pmd报告


    1552546801279.png

    1552553745900.png

需要在Jenkins插件管理中安装PMD,这里提示废弃,Jenkins推荐使用`Warnings Next Generation Plugin;使用起来稍微麻烦点


1552553776586.png
  1. 构建完成之后,发送通知
    根据需要选择邮件、钉钉或者其他的通知
  2. 执行立即构建
    构建成功后,在Jenkins面板的左侧选择PMD Warnings就能看到结果了
    使用PMD analysis
    1552553860546.png

使用Warnings Next Generation Plugin

1552553936208.png

5.Q&A

  1. oclint: error: cannot open report output file

在使用-o 输出oclint分析结果的时候,项目报以上错误
这时候可以采用 >> 的方式将结果输出到文件中
参照文档:https://github.com/oclint/oclint/issues/302

  1. oclint: error: one compiler command contains multiple jobs:

在xcodebuild配置中加上编译选项 COMPILER_INDEX_STORE_ENABLE=NO

  1. warning: unable to open file xxx for serializing diagnostics (Too many open files in system) [-Wserialized-diagnostics]

这个是由于mac系统默认一个用户同时打开的文件是256个,当我们分析的文件过多的时候就会报以上错误!
参照文档:https://superuser.com/questions/433746/is-there-a-fix-for-the-too-many-open-files-in-system-error-on-os-x-10-7-1

  • 首先 修改 /etc/sysctl.conf,在其中写入以下参数【没有就新建一个,最好是在其他地方新建一个然后拷贝到这个目录,可能会有权限问题】
    kern.maxfiles:65536
    kern.maxfilesperproc:65536
  • 重启电脑,使其生效。【要重启,否则会提示-bash: ulimit: open files: cannot modify limit: Invalid argument
  • 在用户目录下的.bashrc中的末尾加入ulimit -n 65535
  • source ~/.bashrc 大功告成
  1. oclint: Not enough positional command line arguments specified
    Must specify at least 1 positional argument: See: /usr/local/bin/oclint -help
  • 确定oclint的环境路径是否是/usr/local/bin/oclint
  • 环境路径没有问题,那可能就是Xcode的缓存,在执行lint分析前删除掉DerivedData
    rm -rf ~/Library/Developer/Xcode/DerivedData/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351