簡單使用SonarQube掃描Android專案

雪曼 2020/12/24 15:02:54
3993

一. 使用環境:
使用電腦:MacBook Pro 2015
SonarQube版本:8.5.1.38104
Java版本 : 11.0.3

 


二.  簡介:
由於SonarQube為開源軟體 , 有些客戶會喜歡使用這個軟體檢驗專案的質量 , 所以在這裡做個簡單的安裝與使用的介紹 , 以及在中途我碰到的一些問題 . SonarQube其實不只一種用法 , 在這邊介紹的是直接在Android  Studio跑Task , 然後到網頁介面上觀看結果的方式 . 其他還有以mvn指令產生報告或是用jenkins觸發等的方式 , 在這篇文章就先不討論 . 

 


三.  安裝與過程中碰到的問題:
接下來就依照安裝的步驟介紹


1.  至官網取得SonarQube
這個步驟就沒什麼需要說的了 , 由於SonarQube本身不需要安裝 , 所以只要下載即可 , 這裡使用的是免費的Community版本 . 
官方下載點:https://www.sonarqube.org/downloads/
下載完的檔案解壓縮完裡面的資料夾如下


2.  設定wrapper.conf檔案
啟動SonarQube的方式不難 , 只要開啟終端機 , 切換路徑至剛剛下載的檔案解壓縮後的位置裡的bin資料夾下 , 並執行指令"./sonar.sh console"即可 .
這裡推薦使用console而不是start , 是因為這樣在啟動服務時有錯誤的話 , 才看得到出了什麼錯 . 
在沒有設定wrapper.conf的情況下執行指令會產生如下的錯誤 . 

這裡可以看到它說找不到JVM , 我們需要去conf資料夾下用文字編輯器打開wrapper.conf , 並設定其中的wrapper.java.command , 將其指向你電腦中的JDK路徑 . 

這裡的最上方就是wrapper.java.command , 會看到我使用的JDK是11.0.3 , 會使用這麼舊的版本是因為SonarQube就support這版本 . 以下是官網的資料 .


我用了較新的版本怎樣都沒辦法正常開啟服務 , 找了資料最後發現版本支援的問題  , 還刻意去找舊版本安裝並卸除本來較新的版本 , 才成功啟動服務  . 這邊並不確定能不能讓不同版本共存 , 有興趣的人可以試試看 .

3.  啟動服務
再次開啟終端機前往bin資料夾 , 執行指令"./sonar.sh console" , 即可成功啟動服務 .
以下是成功啟動服務的畫面


然後你就可以到電腦的瀏覽器中 , http://localhost:9000/
應該就可以看到SonarQube的介面了

 


四. 測試專案並顯示覆蓋率:

這裡需要一個測試專案 , 至於test內容怎麼寫就不多做敘述 , 端看案子需要 . 

最簡單用SonarQube的測試方法是在要測試的專案加入下方程式碼
1. Project層級的build.gradle中的dependencies加入

2.app層級的build.gradle中加入

3.app層級的build.gradle中的底層撰寫


然後打開android  studio右邊的Gradle視窗 , 在其中的project/app/Tasks/other下找到sonarqube , 點兩下執行 , 並等它執行完即可 . 

執行完回到SonarQube的console , 就可在project的分類下找到剛剛測試的專案以及測試的結果  . 由於沒有給任何property , 所以全部的內容基本上都採用預設 . 

看想要看什麼樣的內容就可以點擊觀看 , 如果要對console裡面的內容做一些管理(像是刪除不必要的專案...etc)就會需要登入 .  右上角有Log  in功能 , 預設的帳號與密碼都是"admin"  .
這裡會看到覆蓋率都是0% , 所以接下來就是要處理這個問題 . 覆蓋率需要jacoco的配合 . 
這裡最簡易的方式就是在app層級的build.gradle中的android/buildTypes下加入"testCoverageEnabled true"(這裡我是寫在debug環境下)

然後去執行android的測試task  , 由於我將demo專案的測項寫在androidTest , 所以我是執行connectedAndroidTest.

執行完成之後可以到專案下的app/build/reports/coverage/debug路徑下找到剛剛產生的jacoco報告.
其中index.html是可以直接用瀏覽器打開的報告 . 

而SonarQube需要的則是report.xml這個檔案 .

接下來我們需要的是去設定剛剛寫作的sonarqube這個task , 藉由給予property的方式來讓console中顯示我們需要的內容.
以下是我所使用的內容:

由於都有寫註解 , 相信不難理解 . 若需要更多的參數可以參考下面兩個頁面:
https://docs.sonarqube.org/latest/analysis/analysis-parameters/
https://docs.sonarqube.org/latest/analysis/languages/java/

而依照此設定執行的結果如下:

可以看出這裡已經產生了覆蓋率的數值 , 至於為什麼與jacoco報告上的不同  , 是由於掃描的範圍  , 排除的內容以及計算的方式不同 . 對此有興趣的人可以至兩邊的官方網站查詢  . 在這裏 , SonarQube沒有掃描databinding相關的檔案 , 而我也為了測試sonar.exclusions這個property而讓其排除了其中的MathUtil.java . 


五.  結語
由於SonarQube本身為開源軟體且可以與jenkins整合  , 讓包版 , 測試 , 產生報告自動化 , 所以不少人客戶會使用它 . 這裡提供了最基礎的使用方法 , 讓大家在有需要的時候可以自己寫個樣本出來比對  , 希望對需要使用這項工具卻不知從何入手的人有點幫助 .

雪曼
還在跟Android搏鬥的蔡逼八工程師