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
。