在第四個關卡中(Test and Scan),除了自動測試,另一個需要持續整合的就是程式碼檢查了。除了常用的程式碼風格(StypeCop)、收集程式碼警告(Warnings) 到程式碼度量(SourceMonitor)、程式碼行數(SLOCCount)及未完成工作的plugin(Task Scanner)外,通常可能會加上源碼檢測工具(Fortify SCA、Checkmarx),不過最近被老闆交代看好進行中專案的技術債(Technical debt),試用了一陣子SonarQube來把關程式碼品質,透過量化的技術債指標來盯緊品質,來筆記安裝及搭配Jenkins組態過程。
Scan開始
- SonarQube支援Windows及Linux平台在執行,如果使用到Developer或是Enterprise版本,支援的語言多達21種,連PL/SQL、T-SQL或是Cobol都能掃,想躲在預存程序裡也沒辦法。
- SonarQube在DevOps上的整合也非常完整,Jenkins, VSTS, TFS, Travis-CI都支援。
- 掃描結果也支援許多資料庫,不過我們這次還是在Windows Server上安裝,資料庫也選用微軟SQL Server 2016。
步驟分為前置條件、安裝SonarQube Web Server及Scanner、CI(Jenkins)工具整合。
*因為步驟很多,整個設定過程要2小時:(
前置條件
(1)安裝Oracle JRE 8或OpenJDK 8
(2)新增SQL Server資料庫及使用者
(3)下載SQL Server JDBC driver
安裝SonarQube Server及Scanner
(4)下載及安裝SonarQube Server
(5)下載SonarScanner MSBuild Plugin(Scanner)
與CI工具結合
(6)安裝Jenkins sonarqube plugin
(7)Config Jenkins
(8)Config Jenkins Job
(1)安裝Oracle JRE 8或OpenJDK 8
配合SonarQube server的安裝環境,這邊我們選擇windows x64的版本(不能使用IBM的JRE)
http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html
(2)新增SONARQUBE資料庫及使用者
我們選擇SQL Server作為Sonar儲存,依據Sonar官方文件,版本必須是SQL2014/2016,因此,我們先打開SSMS管理工具新增資料庫
定序限制:
官方文件說明,定序必須為Case Sensitive and Accent Sensitive,簡單的說,就是CS_AS結尾的定序
https://docs.sonarqube.org/display/SONAR/Installing+the+Server
(1)建立資料庫指令碼
CREATE DATABASE SONARQUBE
COLLATE Chinese_Taiwan_Stroke_CS_AS
(2)建立SQL登入使用者指令碼
USE [master]
GO
CREATE LOGIN [sonar] WITH PASSWORD=N'sonar', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [SONARQUBE]
GO
CREATE USER [sonar] FOR LOGIN [sonar]
GO
USE [SONARQUBE]
GO
ALTER ROLE [db_owner] ADD MEMBER [sonar]
GO
OK,儲存SonarQube掃描結果的資料庫設定完畢了!
(3)下載SQL Server JDBC driver
下載網址
https://www.microsoft.com/en-us/download/details.aspx?id=55539
解壓縮sqljdbc到sonarqube/extsnsions/jdbc-driver/mssql
(4)下載並安裝SonarQube Server:
(1)這邊我們依需要安裝適合的版本
(2)下載完成並且解壓縮
(3)設定組態
打開\conf\sonar.properties
- Windows驗證(須注意啟動SonarQube服務的帳號權限):
sonar.jdbc.url=jdbc:sqlserver://localhost;databaseName=SONARQUBE;SelectMethod=Cursor;instance=MSSQLSERVER;integratedSecurity=true
- SQL驗證:
sonar.jdbc.url=jdbc:sqlserver://localhost:1433;databaseName=SONARQUBE;SelectMethod=Cursor;instance=SQL13
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
(5)安裝sonarqube為windows服務
進到bin目錄(Program Files (x86)\sonarqube-7.2\sonarqube-7.2\bin\windows-x86-64)如下圖
依序以系統管理員身分執行InstallNTService.bat及服務啟動StartNTService.bat,然後新的SonarQube服務就會正常啟動了!
*如果不想安裝成服務,也可以手動執行StartSonar.bat,執行後會看到SonarQube is up的訊息
(6)網址列輸入http://localhost:9000 就會跳出登入頁
打開SQL資料庫,可以發現在初始化的過程,SonarQube建立好許多資料表了。
(5)下載SonarScanner MSBuild Plugin
由於我們要掃描.NET專案,目前也還沒辦法從Marketplace install,我們必須手動下載
https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+MSBuild
(1)這邊我們選擇下載.NET Framework 4.6的版本
下載解壓縮後會出現這些檔案
command line執行scan(手動)
官方語法的範例
SonarScanner.MSBuild.exe begin /k:"project-key"
MSBuild.exe /t:Rebuild
SonarScanner.MSBuild.exe end
我們簡單調整如下
set SCA="C:\sonarQube\sonar-scanner-msbuild-4.3.1.1372-net46\SonarQube.Scanner.MSBuild.exe"
set MSBUILD="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe"
set SONAR_SCANNER_OPTS=-Xmx8192m
CD C:\程式目錄
%SCA% begin /k:"org.sonarqube:sonarqube-scanner-msbuild" /n:"專案名稱" /v:"1.0"
%MSBUILD% /t:Rebuild
%SCA% end
Command line可以執行了,下一步要和Jenkins結合就更容易了。
(6)安裝Jenkins sonarqube plugin
管理Jenkins > 管理外掛程式
可用的 > 輸入sonar > 勾選SonarQube Scanner > 按下直接安裝按鈕
(7)Config Jenkins
管理Jenkins > Global Tool Configuation
在SonarQube Scanner for MSBuild區塊,按一下新增SonarQube Scanner for MSBuild按鈕
將Name設定為sconar Scanner,並且設定步驟(5)SonarScanner MSBuild Plugin的路徑,然後按下最下方的儲存按鈕。
管理Jenkins > 設定系統
跳到SonarQube Servers區塊後,按下Add SonarQube按鈕
依序設定Sonar Server名稱及Server URL
Server URL預設是http://localhost:9000,由於我們要提供給團隊成員查看sonarqube掃描結果,需要設定為sonarqube server所在的IP,然後申請防火牆開啟。
(8)Config CI JOB(SonarQube使用Scanner Plugin)
跳到CI JOB的建置步驟,依序新增三個步驟: Scan Begin、MSBuild及Scan End
(1)在SonarQube Scanner for MSBuild – Begin Analysis區塊
- Project key: ${JOB_NAME}
- Project name: ${JOB_NAME}
- Project version ${BUILD_NUMBER}
(2)在Build a Visual Studio project or solution using MSBuild
- MSBuild verion: MSBuild 15
- MSBuild Build File: T:\Program Files (x86)\Jenkins\workspace\專案名稱\專案.sln
(3) SonarQube Scanner for MSBuild – End Analysis
執行建置後
按一下SonarQube的連結,網頁就會導到SonarQube Server對應專案的網頁上。
pipeline設定
也可以都用command line,這樣就可以用pipeline設定。
node {
stage('參數確認'){
echo "JOB_NAME: ${env.JOB_NAME}"
echo "Build Number: ${env.BUILD_NUMBER}"
}
stage('Stage Scanner Begin'){
bat '''CD T:\\Program Files (x86)\\Jenkins\\workspace\\專案
set SCA="E:\\Program Files (x86)\\sonar-scanner-msbuild-4.3.1.1372-net46\\SonarQube.Scanner.MSBuild.exe"
%SCA% begin /k:"env.JOB_NAME" /n:"env.JOB_NAME" /v:"env.BUILD_NUMBER"'''
sleep 5
}
stage('MSBuild '){
bat '''CD T:\\Program Files (x86)\\Jenkins\\workspace\\專案
set MSBUILD="E:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise\\MSBuild\\15.0\\Bin\\MSBuild.exe"
%MSBUILD% /t:Clean;Rebuild /m'''
sleep 5
}
stage('Stage Scanner End'){
bat '''set SCA="E:\\Program Files (x86)\\sonar-scanner-msbuild-4.3.1.1372-net46\\SonarQube.Scanner.MSBuild.exe"
set SONAR_SCANNER_OPTS=-Xmx8192m
%SCA% end'''
}
}
執行結果:
十字路口的紅燈和黃燈
2018.06 台北.內湖瑞光路
參考:
SonorQube Installing the Server
Microsoft JDBC Driver 6.2 for SQL Server
Analyzing with SonarQube Scanner
Install the SonarScanner for MSBuild
GC overhead Limit exceeded while running sonar runner