[Jenkins]持續整合之路(七)程式碼檢查(SonarQube)

在第四個關卡中(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 台北.內湖瑞光路

 


參考:

SonarQube安裝需求

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

Java Process Memory

Architecture and Integration

Installing SonarQUBE on windows and SQL Server

SonarQube T-SQL Bug Rule