iOS 通過社區(qū)版SonarQube實現(xiàn)代碼質(zhì)量掃描踩坑記

上車前言

SonarQube是一個開源的代碼質(zhì)量分析工具傻铣,分為四個版本玫锋,分別為Community卵渴、Developer兑障、Enterprise李命、Data Center登淘,其中Community社區(qū)版免費開源,其他三個版本都是收費版封字,一般來說黔州,社區(qū)版就符合大多數(shù)開發(fā)者的需求耍鬓,針對很多語言都可以免費掃描。不過對于iOS流妻,社區(qū)版不支持Objective-CSwift的掃描牲蜀,只有開發(fā)版以上才支持,所以我們不得不借助開源插件Sonar-swift來實現(xiàn)我們iOS工程的代碼掃描分析绅这。涣达。。

后續(xù)還需要做代碼上架審核掃描功能证薇,有經(jīng)驗的大佬可以提供一下思路或者參考文章嗎度苔?需求大概就是掃描關(guān)鍵詞,例如UIWebview浑度,alipay林螃,wechat等特殊字符,還有掃描私有api或者觸及蘋果審核任何相關(guān)項俺泣,跪求了。完残。伏钠。

所需環(huán)境配置和軟件安裝

1.安裝SonarQube

注意點:不要使用最新的SonarQube版本,因為有同學(xué)說Sonar-swiftjar包并不支持最新版本谨设,我這邊使用的是官方長期支持和維護的版本SonarQube 8.9.7,下載后熟掂,放到你想要的目錄,最好是一個掃描工具的單獨目錄!

2.安裝Java 11

注意點:為什么需要安裝Java 11 而不是Java 8或者其它版本的扎拣。因為有同學(xué)說SonarQube scannerSonarQube 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

sonar主界面

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

接著配置環(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é)果

項目問題.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疏日,一起剝皮案震驚了整個濱河市偿洁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沟优,老刑警劉巖涕滋,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挠阁,居然都是意外死亡宾肺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門侵俗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锨用,“玉大人,你說我怎么就攤上這事隘谣∏郑” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵洪橘,是天一觀的道長跪者。 經(jīng)常有香客問我,道長熄求,這世上最難降的妖魔是什么渣玲? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮弟晚,結(jié)果婚禮上忘衍,老公的妹妹穿的比我還像新娘逾苫。我一直安慰自己,他們只是感情好枚钓,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布铅搓。 她就那樣靜靜地躺著,像睡著了一般搀捷。 火紅的嫁衣襯著肌膚如雪星掰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天嫩舟,我揣著相機與錄音氢烘,去河邊找鬼。 笑死家厌,一個胖子當(dāng)著我的面吹牛播玖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饭于,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蜀踏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掰吕?” 一聲冷哼從身側(cè)響起脓斩,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畴栖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體八千,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡吗讶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恋捆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片照皆。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沸停,靈堂內(nèi)的尸體忽然破棺而出膜毁,到底是詐尸還是另有隱情,我是刑警寧澤愤钾,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布瘟滨,位于F島的核電站,受9級特大地震影響能颁,放射性物質(zhì)發(fā)生泄漏杂瘸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一伙菊、第九天 我趴在偏房一處隱蔽的房頂上張望败玉。 院中可真熱鬧敌土,春花似錦、人聲如沸运翼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽血淌。三九已至矩欠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間六剥,已是汗流浹背晚顷。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疗疟,地道東北人该默。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像策彤,于是被迫代替她去往敵國和親栓袖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容