sonar是一款開源的代碼質量靜態檢查工具,可以支持很多種語言。使用sonar可以檢查測試覆蓋率,代碼復雜度,重復代碼,以及違反某些規則的不良的編程風格,等等。看一張截圖:
通過這樣的一張圖表,就可以清楚看出來當前項目的健康狀況。記錄下你的技術債務。除了簡單的記錄下各個指標的值,還可以自定義一些alert,用以當某項指標低於或者高於某個閾值的時候給出報警。如上圖就有一個例子,我設置了測試覆蓋率不能小於50%,否則就會顯示這樣的紅色的警告。
不但每次構建會有一次這樣的snapshot,而且可以跟過去的指標對比,來發現代碼質量是提升了還是下降了。
當然上面看到的只是sonar功能九牛之一毛。等到自己裝好了sonar之后可以再慢慢摸索。下面的部分我就講解一下如何安裝sonar,以及如何運行sonar來分析項目。
安裝sonar服務器
首先要安裝的是sonar的服務器,它提供了主要的代碼分析,分析結果存儲,分析結果展示的功能。從這里下載sonar服務器,目前最新的版本是3.2.1。解壓完成之后就是一個sonar-3.2.1的文件夾。
因為sonar需要使用數據庫來存儲代碼分析的結果。因此我們需要告訴sonar數據存到哪里。打開sonar-3.2.1/conf/sonar.properties。該文件中已經預設了幾種數據庫的配置了,比如h2,mysql,oracle,postgresql等等。你可以使用任何一種,然后保持其他的配置是注釋掉的。除了數據庫地址的配置,還需要配置用戶名密碼,這個是不分數據庫的,單獨列出。我使用的是mysql,配好之后的樣子是這樣的:
sonar.jdbc.username: root sonar.jdbc.password:
..... sonar.jdbc.url: jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
關於其他的配置項,可以自己參考sonar.properties文件。
我使用的數據庫名字是sonar,所以需要先在mysql中創建該數據庫,然后運行bin目錄下適合你機器的那個文件夾里的sh文件即可。我使用的mac,我的啟動命令如下:
bin/macosx-universal-64/sonar.sh console
啟動之后,可以在命令行中看到它會自動做一些DB migration,把該建的表建好。然后就可以訪問http://localhost:9000/了,sonar已經在那里等着你了:)
使用sonar分析你的代碼庫
好了,現在我們有一個運行着的sonar服務器了,如何用它來檢測我的代碼呢?
Native Way
一個答案是你還需要下載一個叫做sonar-runner的東西。從這里下載。解壓后得到一個sonar-runner的文件夾。然后把bin/sonar-runner這個可執行文件添加到PATH里面,這樣就可以在任何一個代碼庫下面運行sonar分析了。要分析一個代碼庫,首先需要在你的代碼庫根目錄創建一個sonar-project.properties文件,比如這樣:
# required metadata sonar.projectKey=my:project sonar.projectName=My project sonar.projectVersion=1.0 # path to source directories (required) sonar.sources=srcDir1,srcDir2 # path to test source directories (optional) sonar.tests=testDir1,testDir2 # path to project binaries (optional), for example directory of Java bytecode sonar.binaries=binDir # optional comma-separated list of paths to libraries. Only path to JAR file and path to directory of classes are supported. sonar.libraries=path/to/library.jar,path/to/classes/dir # Uncomment this line to analyse a project which is not a java project. # The value of the property must be the key of the language. sonar.language=cobol # Additional parameters sonar.my.property=value
然后在項目的根目錄運行sonar-runner即可。運行完之后就可以在http://localhost:9000/上面看到分析的結果了。
與其他構建工具的集成
sonar對代碼庫的分析可以很好的被集成到例如ant,maven這些常見的構建工具中。具體的用法可以參考該頁面進行配置。這里就不在贅述了。
如果你看了上面的鏈接,你就知道在maven中只要使用mvn sonar:sonar這樣的命令就可以對當前工程進行分析了,非常方便。更方便的是,在持續集成服務器中使用該命令同樣可以進行代碼分析,如果你在sonar中配置了某些alert,而且這些alert被觸發了,那么mvn sonar:sonar這條任務就會失敗,進而導致構建失敗。這樣你的CI也就可以很容易的和sonar結合在一起的。
至此我們已經配置好了sonar服務器和sonar-runner,並且可以使用maven的plugin來運行sonar分析,甚至還可以和持續集成服務器很容易的集成在一起。看起來已經很有用了。但是sonar真正有用之處在於其可擴展性。你可以很方便的定制化你的sonar分析過程,加入新的指標,加入自定義的失敗條件等等。我會在下一篇文章中做一些講解。