通用技术 我们开源了一款 SonarQube iOS 代码扫描插件 sonar-swift

fdeferf · 2020年11月30日 · 最后由 Kaka 回复于 2020年12月17日 · 9732 次阅读
本帖已被设为精华帖!

背景:

我们在公司 (好未来) 内部开发了一套基于 SonarQube 的静态代码扫描服务,得益于 SonarQube 开源版本本身的功能,我们可以直接复用支持主流的编程语言,但 SonarQube 的开源版本并不支持 C/C++/ObjectiveC 等语言,所以我们尝试使用其他的工具去解决这个问题,最后我们选择了 Facebook 的 Infer 来解决这个问题,那么我们在这个过程中,开发了基于社区版本的 sonar-swift 去支持了 Infer 工具结果导入。

Infer 工具支持 C/C++/Java 语言,我们目前支持了 Infer 导入 Objective-C 的扫描结果,再加上原先的 Swiftlint ,就可以 iOS 的扫描了。

同时我们为了回馈社区,也非常愿意拿出来和大家分享,所以我们将这个插件开源,希望能给大家带来收益。

介绍:

静态代码扫描是一种检测项目代码的方式,能够在不运行代码的情况下对代码进行扫描,可以扫描出代码的 Bug (例如空指针)、漏洞、坏味道 (例如方法内代码行数量过多) 等,另外可以检测仓库的代码重复率,注释率,注释行,代码行数,复杂度等信息。 静态代码扫描可以在代码上线之前执行,并且具有执行成本低等特点,被广泛应用于 CI 流水线上。

SonarQube 是一个静态代码扫描服务,https://www.sonarqube.org/,支持主流语言的代码扫描,其社区版本在 GitHub 开源,地址:https://github.com/SonarSource/sonarqube。但是对于部分语言,社区版本并不支持,例如 Objective-C 和 Swift ,本仓库希望解决的就是这两种语言的静态代码扫描分析。

SonarQube 作为一款成熟的代码扫描服务,对外提供了插件功能,支持将第三方的扫描工具的结果导入到 SonarQube 展示,本仓库基于https://github.com/Idean/sonar-swift二次开发,在原先功能的基础上新增了 Facebook Infer 扫描结果的导入。

本仓库作为 SonarQube 的 iOS 代码扫描插件,支持 Objective-C 语言和 Swift 语言,支持导入 SwiftLint、Infer、OCLint、Lizard、Fauxpas 工具的扫描分析结果。

仓库地址:sonar-swift

截图



支持的工具介绍

Infer

Infer 是由 Facebook 公司推出的静态代码扫描工具,支持 C/C++/Java 语言的扫描。

链接:https://github.com/facebook/infer

Swiftlint

Swiftlint 是检查 Swift 代码风格和规定的静态代码分析工具,基本上以 GitHub's Swift 代码风格指南为基础,报告的问题支持在 XCode 上展示,并且可以生成报告文件,我们将读取生成的报告文件,然后上传到 SonarQube 中。

链接:https://github.com/realm/SwiftLint

lizard

lizard 可以分析出 Objective-C 语言的圈复杂度,生成 xml 文件,导入到 SonarQube 的结果中。

链接:https://github.com/terryyin/lizard

OCLint

OCLint 是一个针对于 C/C++/Objective-C 语言的静态代码分析工具,它与 Infer 不同的是,它更偏向于对代码规范一类问题的扫描,所以我们将 OCLint 部分的问题归类到坏味道上面;

链接:https://github.com/oclint/oclint

Fauxpas

Faux Pas 是一款商业软件,支持对 Objective-C 语言进行扫描分析。

链接:http://fauxpasapp.com/

下载

https://github.com/tal-tech/sonar-swift/releases

安装

将 jar 文件放置到 SonarQube 的安装目录下的extensions/plugins/目录下,然后重启 SonarQube

使用方式

参考以下脚本使用

  1. build 构建 iOS 应用程序,并将 log 记录输出到文件
  2. 使用 xcpretty 将 log 日志输出为 json 格式
  3. 执行 infer 分析,配置并忽略第三方的代码目录,导入刚刚的 json 编译日志
  4. 执行 swiftlint ,并将结果输出到文件
  5. 使用 lizard 以 xml 格式输出
  6. 执行 SonarScanner ,并填写报告路径

参考执行脚本

xcodebuild clean build -workspace app.xcworkspace -scheme scheme -destination 'generic/platform=iOS' COMPILER_INDEX_STORE_ENABLE=NO | tee xcodebuild.log > /dev/null
xcpretty -r json-compilation-database -o compile_commands.json < xcodebuild.log > /dev/null
# --skip-analysis-in-path 是忽略扫描目录
infer run --skip-analysis-in-path Pods --compilation-database compile_commands.json
# 可选,如果有 swift 语言使用
swiftlint lint > swiftlint.txt
lizard --xml > lizard-report.xml
sonar-scanner -Dsonar.host.url=http://sonarqube -Dsonar.projectKey=app -Dsonar.sources=. -Dsonar.swift.swiftlint.report=swiftlint.txt -Dsonar.swift.lizard.report=lizard-report.xml -Dsonar.swift.infer.report=infer-out/report.json

要求

扫描时必须在 macOS 操作系统上运行。

公司介绍:

好未来(NYSE:TAL)(学而思)是一个以智慧教育和开放平台为主体,以素质教育和课外辅导为载体,在全球范围内服务公办教育,助力民办教育,探索未来教育新模式的科技教育公司。

目前好未来主要业务涉及智慧教育、教育开放平台,K12 课外教育及海外留学等,旗下拥有多个教育品牌。业务与投资双轮驱动,目前已披露的投资项目包括学科网、喜马拉雅等。2014 年启动未来之星项目,打造互联网教育行业的创业者平台,提供孵化、培训、投资三位一体的服务。截至 2020 年 5 月底,好未来在全国有 4 万多名员工,教学点覆盖 90 个城市。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 9 条回复 时间 点赞
xinxi iOS 代码扫描从放弃到入门 中提及了此贴 01月24日 16:27
fdeferf 重新开启了讨论 12月24日 11:31
fdeferf 关闭了讨论 12月24日 11:31
11楼 已删除

这个可以解析 infer 扫描 C 语言的报告吗?

小李 回复

你好,我整理了下我们正在使用的规则列表,针对 Infer 自带的规则有所删减

https://github.com/tal-tech/sonar-swift/blob/master/docs/rule.md

你们扫描 iOS 的规则是哪些

Elsie 回复

你指的是 Infer 可以扫 Python 还是 SonarQube 可以扫 Python ?

  • Infer 不可以扫 Python
  • SonarQube 自带 Python 的规则,可以直接扫描 Python ,同时也支持导入 pylint 的规则

参考:https://docs.sonarqube.org/latest/analysis/external-issues/

可以扫描 python 吗

陈恒捷 将本帖设为了精华贴 11月30日 23:17

赞,原来那套基于 OCLint 的扫出来的质量真的一言难尽,现在扩展支持 Infer 太赞了

fdeferf 回复

你不也是 😂

cmlanche 回复

你又摸鱼了,被我发现了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册