上車前言
SonarQube是一個開源的代碼質(zhì)量分析工具傻铣,分為四個版本玫锋,分別為Community卵渴、Developer兑障、Enterprise李命、Data Center登淘,其中Community社區(qū)版免費開源,其他三個版本都是收費版封字,一般來說黔州,社區(qū)版就符合大多數(shù)開發(fā)者的需求耍鬓,針對很多語言都可以免費掃描。不過對于iOS
流妻,社區(qū)版不支持Objective-C
和Swift
的掃描牲蜀,只有開發(fā)版以上才支持,所以我們不得不借助開源插件Sonar-swift來實現(xiàn)我們iOS
工程的代碼掃描分析绅这。涣达。。
后續(xù)還需要做代碼上架審核掃描功能证薇,有經(jīng)驗的大佬可以提供一下思路或者參考文章嗎度苔?需求大概就是掃描關(guān)鍵詞,例如UIWebview浑度,alipay林螃,wechat等特殊字符,還有掃描私有api或者觸及蘋果審核任何相關(guān)項俺泣,跪求了。完残。伏钠。
所需環(huán)境配置和軟件安裝
1.安裝SonarQube
注意點:不要使用最新的SonarQube
版本,因為有同學(xué)說Sonar-swift
的jar
包并不支持最新版本谨设,我這邊使用的是官方長期支持和維護的版本SonarQube 8.9.7,下載后熟掂,放到你想要的目錄,最好是一個掃描工具的單獨目錄!
2.安裝Java 11
注意點:為什么需要安裝Java 11
而不是Java 8
或者其它版本的扎拣。因為有同學(xué)說SonarQube scanner
和 SonarQube server
支持Java 11
赴肚,其它版本的Java
版本不被SonarQube
官方支持!
下載Java 11
, 前往官網(wǎng)下載Java SE Development Kit 11.0.16,這個要注冊Oracle
的賬號之類的...安裝手冊可以查看 Installation of the JDK on macOS
安裝完之后執(zhí)行以下查看是否成功:
java 11.0.16 2022-03-15 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.16+9-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.16+9-LTS, mixed mode)
在沒安裝Java 11
之前我使用的Java 8
導(dǎo)致打開 http://localhost:9000打開不開6丁S!
3.安裝Sonar-scranner
使用Homebrew
安裝
brew install sonar-scanner
查看是否安裝成功還有版本
% sonar-scanner --version
INFO: Scanner configuration file: /opt/homebrew/Cellar/sonar-scanner/4.7.0.2747/libexec/conf/sonar-scanner.properties
INFO: Project root configuration file: NONE
INFO: SonarScanner 4.7.0.2747
INFO: Java 11.0.15 Homebrew (64-bit)
INFO: Mac OS X 12.4 aarch64
4.安裝PostgreSQL
數(shù)據(jù)庫
使用Homebrew
安裝
brew install postgresql
安裝完成后初始化數(shù)據(jù)庫
initdb /usr/local/var/postgres
啟動服務(wù)
pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
創(chuàng)建數(shù)據(jù)庫和賬戶
Mac安裝Postgresql
后不會創(chuàng)建用戶名數(shù)據(jù)庫刊愚,執(zhí)行命令:
createdb
接著輸入下面命令登錄Postgresql
控制臺:
psql
數(shù)據(jù)庫安裝好之后踊跟,我們要提供一個數(shù)據(jù)庫和賬號給SonarQube
使用
CREATE USER sonarqube WITH PASSWORD 'sonarqube';//創(chuàng)建用戶
CREATE DATABASE sonar OWNER sonarqube;//創(chuàng)建屬于該用戶的數(shù)據(jù)庫
然后我們?nèi)?code>sonarqube-8.9.7/conf目錄下編輯sonar.properties
,將數(shù)據(jù)庫的相關(guān)配置改為如下:
sonar.jdbc.username=sonarqube
sonar.jdbc.password=sonarqube
sonar.jdbc.url=jdbc:postgresql://localhost/sonar
編輯完之后,我們打開終端到sonarqube-8.9.7.52159/bin/macosx-universal-64
下執(zhí)行以下指令:
% ./sonar.sh restart
Gracefully stopping SonarQube...
Waiting for SonarQube to exit...
Stopped SonarQube.
Starting SonarQube...
Started SonarQube.
之后我們在瀏覽器打開:http://localhost:9000
5.SonarQube
插件包安裝
- 下載sonar-swift-0.4.6 , 從已下載的sonar-swift-0.4.6中鸥诽,拷貝
backelite-sonar-swift-plugin-0.4.6.jar
文件到sonarqube-8.9.7/extensions/plugins
里商玫。 - 下載漢化 sonar-l10n-zh-plugin-1.28,拷貝
sonar-l10n-zh-plugin-1.28.jar
文件到sonarqube-8.9.7/extensions/plugins
里。 - 下載sonar-cnes-report,最新的版本跟
SonarQube 8.9.7
不適配,所以選擇3.3.1
版本即可牡借,把下載的sonar-cnes-report-3.3.1.jar
拷貝到sonarqube-8.9.7/extensions/plugins
里拳昌。
6.下載其它插件
1. 安裝xcpretty
使用
sudo gem install -n /usr/local/bin xcpretty
,這樣會有安裝風(fēng)險。使用
sonar-swift
官方推薦安裝
git clone https://github.com/Backelite/xcpretty.git
cd xcpretty
git checkout fix/duration_of_failed_tests_workaround
gem build xcpretty.gemspec
sudo gem install --both xcpretty-0.3.0.gem
2.安裝swiftlint
brew install swiftlint
查看安裝版本:
%swiftlint --version
0.47.1
3. 安裝lizard
sudo pip3 install lizard
4.安裝Tailor
brew install tailor
查看安裝版本:
% tailor --version
0.12.0
5.安裝slather
sudo gem install -n /usr/local/bin slather
查看安裝版本:
% slather version
slather 2.7.2
6.安裝OCLint
- 使用
homebrew
安裝钠龙,但是有可能OCLint
的版本不匹配你的Xcode
版本導(dǎo)致檢查出錯
brew tap oclint/formulae
brew install oclint
- 前往 OCLint Releases 下載支持你當(dāng)前
Xcode
版本的OCLint
版本炬藤,放到任意你想放的目錄下御铃。可以和SonarQube
同級刻像。
由于我們打包機使用的是Xcode 13.0
畅买,所以我們選擇下載`oclint-21.10-llvm-13.0.0-x86_64-darwin-macos-monterey-12.0-xcode-13.1.tar.gz
接著配置環(huán)境變量,根目錄下打開vim .zshrc
OCLint_PATH=$HOME/XXXX/oclint-21.10
export PATH=$OCLint_PATH/bin:$PATH
保存退出后執(zhí)行source .zshrc
查看安裝版本:
% oclint --version
OCLint (http://oclint.org/):
OCLint version 21.10.
Built Oct 26 2021 (10:19:05).
具體可以查看的OCLint使用手冊
7.新建測試項目和配置sonar文件
- 復(fù)制 sonar-project.properties到你要代碼掃描的根目錄细睡,跟
.xcodeproj
同級,然后編輯sonar-project.properties
文件
# Swift
sonar.swift.project=xxxxDemo.xcodeproj
sonar.swift.workspace=xxxxxDemo.xcworkspace
sonar.swift.appScheme=xxxxxDemo
sonar.swift.excludedPathsFromCoverage=.*Tests.*,.*Specs.*
#這個可以通過xcodebuild -showsdks查看本地的sdk
sonar.swift.simulator=platform=iOS Simulator,name=iPhone 13,OS=15.2
sonar.swift.tailor.config=--no-color --max-line-length=100 --max-file-length=500 --max-name-length=40 --max-name-length=40 --min-name-length=4
sonar.swift.skipTests=xxxxxDemoUITests
# OC
sonar.objectivec.project=xxxxxDemo.xcodeproj
sonar.objectivec.workspace=xxxxxDemo.xcworkspace
sonar.objectivec.appScheme=xxxxxDemo
sonar.objectivec.excludedPathsFromCoverage=.*Tests.*,.*Specs.*
sonar.objectivec.simulator=platform=iOS Simulator,name=iPhone 13,OS=15.2
sonar.objectivec.tailor.config=--no-color --max-line-length=100 --max-file-length=500 --max-name-length=40 --max-name-length=40 --min-name-length=4
# Common
#這個通過在本地的SonarQube主頁上生成項目的時候獲得
sonar.projectKey= xxxxxDemoProjKey
sonar.projectName=xxxxxDemo
# Be careful! If you'd like to upload source files that contains Pods directory,
# you must remove Pods from .gitignore file. Otherwise nothing will be uploaded.
sonar.sources=OCSwiftDemo
sonar.projectDescription="Scanning code smells and upload to SonarQube."
sonar.sourceEncoding=UTF-8
# Comment if you have a project with mixed ObjC / Swift
sonar.language= Swift
# SonarQube
sonar.host.url=http://localhost:9000
#這個login通過本地的SonarQube主頁生成的口令
sonar.login=dbe0f3944f65563094e86a81bf041a4edfbee873
#這個初始賬號和密碼都是admin谷羞,后面可以改成你自己的的
sonar.password=your sonar password
- 下載run-sonar-swift.sh到你要代碼掃描的根目錄,跟
.xcodeproj
同級溜徙。
8.掃描
- 通過
run-sonar-swift.sh
掃描,在掃描的工程根目錄執(zhí)行以下命令湃缎,即可在在SonarQube
網(wǎng)頁上瀏覽結(jié)果
bash run-sonar-swift.sh -nounittests -v
- 通過
SonarQube
推薦的指令集
sonar-scanner \
-Dsonar.projectKey=TestPod \
-Dsonar.sources=. \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login=生成的口令,你創(chuàng)建掃描工程的時候會自動生成此條命令
打開http://localhost:9000找到項目查看結(jié)果
9.可能遇到的問題
-
OCLint
版本和Xcode
版本對不上產(chǎn)生的腳本報錯
ERROR - Command 'oclint-json-compilation-database -v --include ../TestPod/TestPod/ -- -rc
LONG_LINE=250 -max-priority-1 10000 -max-priority-2 10000 -max-priority-3 10000 -report-type pmd
-o sonar-reports/TestPod_-oclint.xml' failed with error code: 6
-
slather coverage
報錯
Computing coverage report
slather coverage --input-format profdata --cobertura-xml --output-directory
sonar-reports --scheme xxxxxDemo xxxxxxDemo.xcodeproj
.....
.....
ERROR - Command 'slather coverage --input-format profdata --cobertura-xml --output-directory
sonar-reports --scheme xxxxxDemo xxxxxDemo.xcodeproj' failed with error code: 1
解決: Product -> Scheme -> Edit Scheme -> Test -> Options -> Code Coverage打勾蠢壹。
10.設(shè)置成開機啟動
- 配置
sonar
開機自啟嗓违,在/Users/xxx/Document下創(chuàng)建Config文件夾,在Config下創(chuàng)建startup.sh
文件图贸,添加以下腳本
# PostgreSQL開機啟動
ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
# Sonar開機啟動,sonar的位置
sh /usr/lxxxx/sonarqube-8.9.7/bin/macosx-universal-64/sonar.sh start
# Jenkins開機自啟 并做外網(wǎng)端口映射蹂季,jenkins的位置
java -jar /usr/local/Cellar/jenkins/2.271/libexec/jenkins.war --httpPort=8080
- 將
run startup.sh
加入到登錄啟動項
打開 系統(tǒng)偏好設(shè)置-> 用戶和群組 -> 登錄項 -> + -> 導(dǎo)入寫好的startup.sh
腳本
參考
iOS 用sonar-swift實現(xiàn)SonarQube代碼質(zhì)量掃描
iOS 靜態(tài)代碼分析(SonarQube + Objective-C、Swift)
sonarqube進行iOS靜態(tài)代碼分析
Mac安裝PostgreSQL
sonar-swift