我們開源了一款 SonarQube iOS 程式碼掃描外掛

mark發表於2020-11-30

背景:

我們在公司(好未來)內部開發了一套基於 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個城市。

相關文章