SonarQube 是一套白箱掃描工具,本例使用開源免費的Community版本,有關安裝方式可參考「在KALI Linux建置黑、白箱掃描系統(Arachni及SonarQube)」一文。
本文以SonarQube提供的範例「 sonar-scanning-examples-master\sonarqube-scanner-gradle\gradle-multimodule」做示範說明,置於「C:\sonar-scanning-examples-master\sonarqube-scanner-gradle\gradle-multimodule」目錄下。若想掃描其他gradle專案,請依該專案環境、結構酌作調整,尤其工具及Java版本。
一、必要需求
(一)適合待掃專案的JDK
1.本例使用Java 13,筆者將它放置於C:\JAVA\jdk-13.0.2。
2.建立環境變數「JAVA_HOME」,讓它指向「C:\JAVA\jdk-13.0.2」。
3.在PATH環境變數中加入「%JAVA_HOME%\bin」,讓作業系統可以找到javac.exe。
(二)gradle工具(用來建立 Gradle Wrapper)
1.至Gradle官網 下載Gradle工具包,直接解壓縮到自選目錄,例如「C:\gradle\gradle-8.0.2」。
2.建立環境變數「GRADLE_HOME」,讓它指向「C:\gradle\gradle-8.0.2」。
3.在PATH環境變數中加入「%GRADLE_HOME%\bin」,讓作業系統可以找到gradle.exe。
4.執行 gradle -v 確認gradle.exe可執行。
C:\>gradle -v ------------------------------------------------------------ Gradle 8.0.2 ------------------------------------------------------------ Build time: 2023-03-03 16:41:37 UTC Revision: 7d6581558e226a580d91d399f7dfb9e3095c2b1d Kotlin: 1.8.10 Groovy: 3.0.13 Ant: Apache Ant(TM) version 1.10.11 compiled on July 10 2021 JVM: 17.0.2 (Oracle Corporation 17.0.2+8-86) OS: Windows 10 10.0 amd64 C:\>
二、修改待掃專案的build. gradle,加入sonar scanner插件:
本例使用4.3.1.3277版插件,這裡可查詢gradle可用的各版本sonar scanner插件,請選擇合適的版本。
plugins { ……其他的plugin…… // 為SonarQue加入適當版本的插件,參考建立Sonar掃描專案後,Sonar所提示的版本 id 'org.sonarqube' version '4.3.1.3277' }
三、執行掃描:
(一)啟動SonarQube Scanner Server,假設位於「 http://192.168.232.153:9000」
(二)以瀏覽器連線SonarQube Scanner Server,並建立掃描專案(如重掃描舊專案,請備妥 Project Token)
1. 由Projects頁面選擇「Create Project」->「Manually」
2.社群版只能選擇「Locally」
3.填入「Project display name」(專案名稱)及「Project key」(專案鍵名)
4.產生Project Token(專案身分代號)
5.請記下Project Token
6.選擇要被掃描的專案類型(Gradle)
(三)開啟命令提示字元,將工作目錄切換到待掃描的Gradle專案目錄,本例係位於C:\sonar-scanning-examples-master\sonarqube-scanner-gradle\gradle-multimodule,此範例已自帶「gradle wrapper」。
若您的專案目錄下沒有「gradle\wrapper」目錄,則需要於此專案目錄下執行「gradle wrapper」,完成後,會在此目錄下新增.gradle、gradle兩個目錄及gradlew、gradle.bat兩檔案。
若待掃專案已有.gradle、gradle兩個目錄及gradlew、gradle.bat兩檔案,可跳過此步驟。
(四)注意 gradle\wrapper\目錄裡gradle-wrapper.properties 檔的 distributionUrl 項目所指定之 gradle 版號(可至https://services.gradle.org/distributions/ 查看所有版號),及所使用的JDK版本。
若gradle service版號或JDK版本與待掃專案不匹配,建置過程會發生錯誤。
#Tue May 19 06:55:41 BST 2020 distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-all.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME
(五)如果已完成項一及項二的要求,便可直接複製及執行SonarQube所提供的命令。
由於此命令是Linux格式,本例是在Windows環境執行,需調整命令語句,將原始命的整理成單一列。
(六)執行過程如下所示(橘紅色部分是我所執行的命令)
> Task :sonar
SCM provider autodetection failed. Please use "sonar.scm.provider" to define SCM of your project, or disable the SCM Sensor in the project settings.
BUILD SUCCESSFUL in 39s
2 actionable tasks: 2 executed
<-------------> 0% WAITING
> IDLE
如果前面各步驟無誤,應該可以完成掃描,最後會看到「BUILD SUCCESSFUL」。如果過程出現錯誤,請仔細研讀訊息,善用Google或ChatGPT找出解答。
完成掃描後,可在SonarQube Scanner Web UI看到專案結果~~
完成掃描後,可在SonarQube Scanner Web UI看到專案結果~~
關於 dotNet Framework 專案的掃描,請參閱:以SonarQube執行.netFramework專案的源碼掃描(白箱掃描)
關於 dotNet Core 專案的掃描,請參閱:以SonarQube掃描dotNet Core專案源碼(白箱掃描)