前言
SonarQube是一个开源的代码质量扫码分析工具,分为四个版本,分别为Community
、Developer
、Enterprise
、Data Center
,其中Community
社区版免费开源,其他三个版本都是收费版,一般来说,社区版就符合大多数开发者的需求,针对很多语言都可以免费扫描。
但是,遗憾的是,针对iOS
,社区版是不支持Objective-C
、Swift
扫描的,只有开发版及以上收费版本才支持!
因此,要使用社区版,我们不得不寻找一些开源的插件,以实现在SonarQube
上iOS
的代码质量扫描分析。此文就是以sonar-swift插件来实现iOS
的代码扫描分析,它同时支持Objective-C
和Swift
。
安装java 11
为什么需要安装java 11
而不是java 8
或者其他java
版本?因为SonarQube scanner
和SonarQube server
支持java 11
,其他的java
版本不被SonarQube
官方支持!见 Prerequisites and Overview - Supported Platforms。
前往java
官网,下载java 11
,点击前往Java SE Development Kit 11.0.14。不知道如何安装的话,查看 Installation of the JDK on macOS。
注意:在未安装
java 11
之前,我使用的是java 8
,导致SonarQube server
启动失败。
如何确定安装成功?执行
1 | ➜ ~ java --version |
说明java 11
已经安装成功。
安装SonarQube
注意:请不要使用最新的SonarQube
版本,因为sonar-swift
的jar
包并不支持最新的版本如9.3
。因此,建议使用官方提供的长期支持和维护的版本SonarQube 8.9.7 LTS
。
- 下载
SonarQube 8.9.7
。
👉下载官方长期支持维护版本:SonarQube 8.9.7 LTS。
下载之后,将其放到你想要放的目录,这个目录可以是任何目录,比如我的就是放到用户下面的CICD
文件夹下。
- 启动
SonarQube Server
。
1 | ➜ ~ $HOME/CICD/sonarqube-8.9.7.52159/bin/macosx-universal-64/sonar.sh start |
初始账号密码都是:admin
。首次登录系统会要求你修改密码,比如你可以随便修改成admin123
。
安装sonar-scanner
强烈推荐使用brew
安装
1 | brew install sonar-scanner |
查看是否安装成功
1 | ➜ ~ sonar-scanner --version |
其他插件安装
一 安装xcpretty
查看是否安装,如果已经安装,可以跳过
1 | ➜ ~ xcpretty --version |
安装
1 | git clone https://github.com/Backelite/xcpretty.git |
注意:不要使用
sudo gem install -n /usr/local/bin xcpretty
这样安装,按照sonar-swift
官方推荐的上述安装方式,兼容SonarQube
。
二 安装swiftlint
1 | brew install swiftlint |
查看安装
1 | ➜ ~ swiftlint --version |
三 安装Tailor
1 | brew install tailor |
查看安装
1 | ➜ ~ tailor --version |
四 安装slather
slather
可能会要求相应的ruby
版本,如果失败,升级ruby
即可。使用brew
安装ruby
1 | brew install ruby |
由于系统也默认安装了ruby
,这时可能会提示如下
1 | ....................... |
按照提示,添加以上路径,如
1 | echo 'export PATH="/opt/homebrew/opt/ruby/bin:$PATH"' >> ~/.zshrc |
然后source ~/.zshrc
就可以了。查看ruby --version
,可以看到已经是最新版本。
1 | sudo gem install -n /usr/local/bin slather |
查看安装
1 | ➜ ~ slather version |
强烈建议不要使用官方的安装方式:
sudo gem install slather
,因为有可能会出现命令找不到的情况,即安装完成后执行slather version
会报错command not found: slather
。
五 安装lizard
首先查看一下是否安装了pip
1 | which pip |
如果未安装,则需要先安装pip
:
1、 依次执行以下两个命令
1 | curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py |
2、 如果遇到如下警告
1 | Installing collected packages: pip |
添加以下命令到.zshrc
并执行source ~/.zshrc
即可
1 | export PATH=$HOME/Library/Python/3.8/bin:$PATH |
3、 安装成功后,可以查看一下pip
版本
1 | ➜ ~ pip --version |
接着安装lizard
1 | sudo pip install lizard |
六 安装OCLint
前往 OCLint Releases 下载支持你当前Xcode
版本的OCLint
版本,放到任意你想放的目录下,比如我的是放到CICD
文件夹下(和SonarQube
平级)。
由于这里使用的是Xcode 13.2.1
,因此下载oclint-22.02-llvm-13.0.1-x86_64-darwin-macos-12.2-xcode-13.2.tar.gz
即可
然后打开vi .zshrc
文件
1 | OCLint_PATH=$HOME/CICD/oclint-22.02 |
保存退出后,执行source $HOME/. zshrc
。
查看安装
1 | ➜ ~ oclint --version |
注意:一定不要使用
brew
安装OCLint
,因为使用brew
安装的OCLint
可能不是最新版本,或者不兼容当前的Xcode
,导致无法扫描!比如我使用brew
安装的是20.11
,而20.11
并不支持Xcode 13.2.1
!如果你能确保使用brew
安装的OCLint
兼容Xcode
当前版本,并没有任何问题。OCLint
版本对应支持的Xcode
版本 OCLint Releases。
配置sonar-project.properties
这个文件配置很简单,根据需要按下面格式配置即可。
1 | # Swift |
配置run-sonar-swift.sh
这个文件只需要从插件官网直接下载即可,不需要修改任何配置。
扫描
执行
1 | bash run-sonar-swift.sh -nounittests -v |
即可在SonarQube
网页上浏览结果。遗憾的是,不知道是由于sonar-swift
插件的原因还是SonarQube
的原因,扫描结果都是以坏味道
的方式呈现出来。
错误处理
- 报错
1
1 | Computing coverage report |
解决: General -> Edit Scheme -> Test -> Options -> Code Coverage
打勾。
- 错误
2
1 | xcodebuild: error: Scheme OCSwiftDemo is not currently configured for the test action. |
解决:在执行脚本的时候用 bash run-sonar-swift.sh -nounittests -v
(推荐),也可以在run-sonar-swift.sh
中将 unittests="on"
改为unittests=""
。
- 错误
3
1 | oclint: error: compilation contains multiple jobs: |
解决:在xcodebuild
命令中添加COMPILER_INDEX_STORE_ENABLE=NO
参数,如下
1 | xcodebuild -scheme OCSwiftDemo -workspace OCSwiftDemo.xcworkspace clean && xcodebuild -scheme OCSwiftDemo -workspace OCSwiftDemo.xcworkspace COMPILER_INDEX_STORE_ENABLE=NO -configuration Debug -arch x86_64 -sdk iphonesimulator15.2 | xcpretty -r json-compilation-database -o compile_commands.json |
Tips1
:要使用-sdk iphonesimulator15.2
参数,但是不知道当前支持的版本,可以使用xcodebuild -showsdks
命令。
附录
个人博客。