前言
特别鸣谢:Haiyi(独门秘籍)、LV(实践修改Objective-C插件源码)、YONG(处理打包脚本)
本文主要阐述在事业部使用SonarQube构建iOS:Objective-C、Swift静态代码分析,分享遇到的坑,文章内容有限,一些细节不能到位的,请各位脑补下,谢谢。
SonarQube简介
旧版Sonar展示维度如下:
新版SonarQube已经改变了关注维度,推出质量模型:
- Bugs:是出现了明显错误或是高度近似期望之外行为的代码。
- 漏洞:是指代码中可能出现被黑客利用的潜在风险点。
- 坏味道:代码异味会困扰代码的维护者并降低他们的开发效率。主要的衡量标准是修复它们所需的时间。
建议根据团队需要更新到新版本:至少5.6+以上。
SonarQube架构
SonarQube平台的组成:
- 数据库:存放SoanrQube的配置数据,代码质量的快照数据
- Web服务:用于查看SonarQube配置数据,代码质量的快照数据
- 分析器:对项目代码进行分析,生成质量结果数据并存于数据库中
- 插件:各种语言支持的插件
不要忽略了CI
虽然SonarQube具备分析器,可以对多种编程语言进行构建分析,但是依然建议使用CI工具,例如Jenkins来管理日常构建,让SonarQube仅仅展示最终数据即可。
iOS静态代码分析
目前iOS核心开发语言:Objective-C,也有不少项目采用了Swift语言,逐步过渡,因此项目的组成有两种模式:
- 单一语言使用:Objective-C、Swift
- 混合语言使用:Objective-C+Swift
下面通过实战分析两种模式的构建。
iOS静态代码分析的计划
Objective-C原以为就跟Java构建一样,如此简单,
实际遇到的坑是很大的,而且很受伤,
踩过坑的路才踏实
捅一万刀也不过分
iOS静态代码分析:Objective-C实战
工欲善其事必先利其器,工具如下:
- 环境工具:XCode 8.2+、Xcpretty 0.2.8、OCLint 0.12、xctool、gcovr
- 构建静态分析插件
- SonarCFamily:
官方插件太贵了,找开源吧
- 开源SonarQube Plugin for Objective C(传送门)
插件安装参考网上教程,下载jar拷贝到SonarQube项目目录下:extensions/plugins
安装成功的示例
构建脚本
- run-sonar.sh
在Jenkins的Execute shell配置脚本如下,也可以按照项目要求重名更好格式
1 | cd $WORKSPACE |
- 构建结果
独门绝技介绍(感谢事业部:haiyi大神倾亲奉献)
构建错误errors generated
1 | 3 errors generated. |
检查OCLint,升级到0.12版本,与XCode8.2+配合
构建错误does not exist
1 | The rule 'OCLint:use number literal' does not exist. |
主要原因是sonar-objective-c-plugin-0.5.0-SNAPSHOT.jar中未包含此规则,可以通过修改源码添加规则解决(网上有一堆教程),比较繁琐的是,不同项目遇到不同错误,需要添加多次,则多次打包jar,再导入SonarQube,开销大,haiyi大大给的秘籍是:用sed替换构建的oclint.xml文件
1 | sed "s#missing hash method#must override hash with isEqual#g" |
将缺失规则:missing hash method,替换为:must override hash with isEqual,每次遇到有缺失的新规则,脚本替换即可,至于怎么准确匹配,去看看质量配置的具体含义再替换。
Objective-C实战总结
- 安装构建工具所需版本号
- xcodebuild构建项目生成compile_commands.json
- oclint-json-compilation-database构建compile_commands.json生成oclint.xml
- sed替换oclint.xml缺失规则
- sonar-project.properties配置oclint.xml文件路径
- /bin/sh sonar-scanner -X 增加-X输出debug日志跟踪
iOS静态代码分析:Swift实战
工欲善其事必先利其器,工具如下:
环境工具
1 | brew install Swiftlint |
构建静态分析插件
SonarSwifty:
官方插件太贵了,找开源吧
开源sonar-swift(传送门)
插件安装参考网上教程(backelite-sonar-swift-plugin-0.3.4.jar SonarQube5.4/5/6/6/3测试通过),下载jar拷贝到SonarQube项目目录下:extensions/plugins
安装成功的示例
构建脚本
- run-sonar.sh
在Jenkins的Execute shell配置脚本如下,也可以按照项目要求重名更好格式
1 | cd $WORKSPACE |
构建结果
- 注意事项
1 | The structure of the plugin is based on the sonar-objective-c plugin. |
如果不设置,关联规则有问题
目前暂无遇到缺失规则问题
Swift实战总结
- 安装构建工具所需版本号
- swiftlint生成xxx-swiftlint.txt
- sonar-project.properties配置xxx-swiftlint.txt文件路径
- /bin/sh sonar-scanner -X 增加-X输出debug
iOS静态代码分析:Objective-C+Swift实战
这里不详细介绍实战过程,直接说总结
- Objective-C+Swift:分开构建,脚本如下,当做两个项目配置如上文所示
- Objective-C+Swift:一起构建,本质上他们两个的插件是不同的,但是可以利用sonar模块的概念来构建
1 | objectivec_swift目录结构 |
脚本如下
1 | sonar.projectKey=objectivec_swift |
分模块
1 | sonar.modules=objective,swift |
构建objectivec
1 | objective.sonar.projectName=objectivec |
构建swift
1 | swift.sonar.projectName=swift |
构建结果
没有看到扫描规则问题展示,估计是配置文件或者构建文件路径有问题,暂且告一段落吧,有折腾出来的小伙伴喊一下,谢谢哟,^_^
最后附上github地址,随意取: