SonarQube 是一套 程式碼品質檢查工具 ,可以幫我們檢查 code 的 bugs、 vulenrability、code smell 與 duplication,也屬於 持續整合 重要的一環。
SonarQube 已經內建 SonarJava,可以直接對 Java 進行檢查,本文將以 Java + Gradle 為例,並在 Eclipse 中使用 SonarLint 對 Java 專案進行檢查。
macOS High Sierra 10.13.4
SonarQube 7.1
SonarQube Scanner 3.1.0.1141
Eclipse Oxygen.3a (4.7 3a)
Java SE 1.8.0_171
https://github.com/oomusou/javasonarqube $ brew install gradle
Gradle 類似 JavaScript 世界的 Webpack,負責整個專案的編譯管理,使用 Homebrew 安裝。
~/MyProject $gradle init --type java-application
下載範例後,進入專案目錄,使用 Gradle 對專案初始化。
~/MyProject $ ./gradlew build
使用 Gradle 第一次 build 專案。
請安裝以下兩個套件:
Next 繼續
Next 繼續
Finish 結束 /*
* This file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java project to get you started.
* For more details take a look at the Java Quickstart chapter in the Gradle
* user guide available at https://docs.gradle.org/4.7/userguide/tutorial_java_projects.html
*/
plugins {
// Apply the java plugin to add support for Java
id 'java'
// Gradle plugin to help analyzing projects with SonarQube
id 'org.sonarqube' version '2.6.2'
// Apply the application plugin to add support for building an application
id 'application'
}
// Define the main class for the application
mainClassName = 'App'
dependencies {
// This dependency is found on compile classpath of this component and consumers.
compile 'com.google.guava:guava:23.0'
// Use JUnit test framework
testCompile 'junit:junit:4.12'
}
// In this section you declare where to find the dependencies of your project
repositories {
// Use jcenter for resolving your dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
}
13 行
// Gradle plugin to help analyzing projects with SonarQube id 'org.sonarqube' version '2.6.2'
在 Gradle 新增 SonarQube plugin,將來可透過 Gradle 執行 SonarQube。
build.gradle 檔案
Gradle Tasks build 展開,執行 build BUILD SUCCESSFUL 表示建置成功 目前為止,Gradle 在 Eclipse 已經正常執行,接下來要設定 SonarQube
$ brew install sonarqube
使用 Homebrew 安裝 SonarQube。
$ sonar console
使用 sonar console 自行啟動 SonarQube。
localhost:9000 ,若看到 SonarQube 首頁,則表示安裝成功 Log in 可登入管理設定 SonarQube,預設為 admin/admin SonarQube 雖然已經包含 SonarJava,但必須靠 SonarQube Scanner 才能執行,預設 SonarQube 並沒有包含 Scanner,必須自行安裝。
$ brew install sonar-scanner
#Configure here general information about the environment, such as SonarQube server connection details for example #No information about specific project should appear here #----- Default SonarQube server sonar.host.url=http://localhost:9000 #----- Default source code encoding #sonar.sourceEncoding=UTF-8
將第 5 行的 # 拿掉,設定 SonarQube server 的 URL 位址。
/usr/local/Cellar/sonar-scanner/3.1.0.1141/libexec/conf sonar-scanner.properties vim 開啟 sonar-scanner.properties
~/MyProject $ gradle sonarqube
使用 Gradle 執行 SonarQube 檢查。
進入 SonarQube 網頁,就可看到 JavaSonarQube 專案已經出現 SonarQube。
目前為止,SonarQube 已經可以正常透過 Gradle 執行,實務上可以透過 Jenkins 執行 Gradle,就可透過 CI 自動執行 SonarQube,但這種方式較被動,若發現有任何 issue,還要開 ticket 要求修改,一來一回可能好幾天,若能在開發階段就即時 SonarQube 檢查,就能「及早發現,及早治療」。
在 Code Smell 部分,SonarQube 已經檢查出:
若能在 Eclipse 也能顯示這些警告訊息,那就太好了。
SonarLint Bind to a SonarQube project…
Connect to a SonarQube server…
sonarqube Next 繼續
Next 繼續
Username + Password Next 繼續
Next 繼續
Next 繼續
Finish 完成設定
No 或 Yes 都可以
Finish 完成連接 SonarQube server 動作
SonarLint Analyze
完整的範例可以在我的 GitHub 上找到
JAVA_HOME
~/.bash_profile
export JAVA_HOME=$(/usr/libexec/java_home)
這裡在執行 Gradle 時遇到一個雷,由於 Gradle 與 Eclipse 都會依賴系統變數 $JAVA_HOME ,必須在 bash_profile 設定 $JAVA_HOME 才會讓 Gradle 與 Eclipse 順利抓到,而不能只設定在 .zshrc ,所以不要覺得在 iTerm 2 能 echo $JAVA_HOME 就沒事,畢竟 Gradle 與 Eclipse 不是吃 .zshrc ,而是吃 .bash_profile 。