天天看點

Jenkins+Sonar內建對代碼進行持續檢測

介紹

SonarQube(曾用名Sonar(聲納)[1])是一個開源的代碼品質管理系統。

特征

  • 支援超過25種程式設計語言[2]:Java、C/C++、C#、PHP、Flex、Groovy、JavaScript、Python、PL/SQL、COBOL等。(不過有些是商業軟體插件)
  • 可以在Android開發中使用
  • 提供重複代碼、編碼标準、單元測試、代碼覆寫率、代碼複雜度、潛在Bug、注釋和軟體設計報告[3][4]
  • 提供了名額曆史記錄、計劃圖(“時間機器”)和微分檢視
  • 提供了完全自動化的分析:與Maven、Ant、Gradle和持續內建工具(Atlassian Bamboo、Jenkins、Hudson等)[5][6][7]
  • 與Eclipse開發環境內建
  • 與JIRA、Mantis、LDAP、Fortify等外部工具集
  • 支援擴充插件[8][9]
  • 利用SQALE計算技術債務[10]
  • 支援Tomcat。不過計劃從SonarQube 4.1起終止對Tomcat的支援[11]。

【以上來自維基百科】

SonarQube 平台是 由 4 個 部分組成:

  • SonarQube Server
  • SonarQube Database (這次并沒有關注這塊)
  • SonarQube Plugins
  • SonarQube Scanner

功能介紹:

SonarQube Scanner在項目代碼的本地去掃描代碼最後發送到SonarQube Server

SonarQube Plugins這次我了解的應該是IDE的插件,我們這次也用了Jenkins的SonarQube Plugins但是我了解這的這個應該單純的去封裝了掃描代碼執行的指令。

SonarQube Database是用來做資料持久化的,本次沒有關注這塊,使用的sonar内置的預設資料庫。

SonarQube Server是sonar的伺服器端會把SonarQube Scanner發送的資料進行分析最後顯示在web頁面上。

架構

Jenkins+Sonar內建對代碼進行持續檢測

上圖是理想狀态下的架構,我們這次比較簡單,思路是在Jenkins上配置源碼管理git,給Jenkins安裝SonarQube Plugins的插件,使用我們組的一個伺服器當節點安裝了SonarQube Scanner的環境,最後通過Jenkins手動選擇分支觸發,Jenkins會調用節點伺服器去gitlab拉取我們的代碼,使用SonarQube Scanner進行掃描之後,發送到SonarQube Server。後期打算做成在merge回dev分支的時候(PR)自動去建構這個過程,并添加gitlab的一些代碼品質分析之類的操作.........

部署

1.安裝jdk

不管是SonarQube Scanner還是SonarQube Server都是依賴于jdk的,是以需要安裝jdk,這裡安裝的是openJDK(JDK應該會更好,後面說),解壓之後直接把到bin的路徑複制下來添加到環境變量path裡即可。(我這塊是這樣D:\openjdk-11.0.2_windows-x64_bin\jdk-11.0.2\bin;)

Jenkins+Sonar內建對代碼進行持續檢測

2.安裝SonarQube Scanner

因為我們的組的伺服器是windows server 2008R2 SP1伺服器,是以這塊隻說明Windows的。 

我們組有API(.net)和nc3.0(angular)的項目需要掃描,而掃描.net的sonar比較特殊是基于MSbuild的,是以要安裝SonarQube Scanner for MSBuild。

SonarQube Scanner for MSBuild

https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+MSBuild

一般的SonarQube Scanner

https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

下載下傳下來之後解壓,配置環境變量path

Jenkins+Sonar內建對代碼進行持續檢測
Jenkins+Sonar內建對代碼進行持續檢測

就是這兩個路徑,其實如果隻是和Jenkins去內建這裡可以不用配置環境變量,因為Jenkins裡配置SonarQube Plugins的時候會讓你配置SonarQube Scanner 的路徑。(親測)

3.安裝代碼編譯的環境

.Net framework 4.6以上版本

安裝時要注意.Net framework 4.6以上版本需要Windows Server 2008R2 SP1以上版本(注意是SP1)

https://www.microsoft.com/en-us/download/details.aspx?id=48130

NodeJS v6以上

google或者百度自行解決(nc3.0的環境)

https://nodejs.org

MSBuild

因為我們API代碼是在VS2017裡開發的是以MSBuild需要2017的MSBuild,安裝MSBuild具體要看.net項目的C#文法版本(或者說是vs的版本,最好按照vs版本,因為其實自我感覺我們都不是很關注C#的文法版本,可能隻知道vs那個版本支援什麼文法,是以很多公司沒有限制C#文法版本而是限制了vs的版本)。

有網直接安裝 https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=BuildTools&rel=15

沒有網需要自己去做離線包,具體文檔https://docs.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-build-tools?view=vs-2019

下載下傳線上版的.exe,在根目錄執行以下代碼。

.\vs_buildtools__1829948457.1521995183.exe --layout . --add Microsoft.VisualStudio.Workload.ManagedDesktopBuildTools --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Workload.NetCoreBuildTools --add Microsoft.VisualStudio.Workload.UniversalBuildTools --add Microsoft.VisualStudio.Workload.WebBuildTools --add Microsoft.VisualStudio.Workload.OfficeBuildTools --add Microsoft.VisualStudio.Workload.VCTools --lang en-US      

相關連接配接https://developercommunity.visualstudio.com/content/problem/303465/inability-to-install-build-tools-for-visual-studio.html

4.安裝Jenkins的插件

SonarQube Plugins和MSbuild for Jenkins

系統管理->管理插件  搜尋并且安裝下圖兩個插件

SonarQube Plugins 裡邊會包含for MSbuild的功能

Jenkins+Sonar內建對代碼進行持續檢測
Jenkins+Sonar內建對代碼進行持續檢測

這塊遇到的問題是我們的伺服器沒有網,是以這塊安裝的時候是從進階裡上傳下載下傳好的插件(.hpi)安裝的(下載下傳位址http://updates.jenkins-ci.org/download/plugins/)

Jenkins+Sonar內建對代碼進行持續檢測

坑:

什麼?聽說你們的伺服器也沒網?那太好了。

你以為這就完了嗎?

你會發現你上傳的這個插件,安裝的時候會報錯。(傻了吧!!!)

就像這樣:

這是因為你安裝的插件有别的依賴,這時候你就需要打開詳細找到截圖上類似這樣的url自己去手動下載下傳依賴的插件并且按照上圖的順序去安裝

5.配置Jenkins插件

設定MSBuild

Jenkins+Sonar內建對代碼進行持續檢測

設定SonarQube Server位址

系統管理 > 系統設定 > Add SonarQube > SonarQube servers 修改如下:

Jenkins+Sonar內建對代碼進行持續檢測

設定SonarQube Scanner插件

系統管理 >Global Tool Configuration

這塊要設定兩個SonarQube Scanner for MSBuild和SonarQube Scanner

Jenkins+Sonar內建對代碼進行持續檢測

這就是我之前說的不用在節點的機器上配置環境變量的原因

6.建構項目

建立>建構一個自由風格的軟體項目

Jenkins+Sonar內建對代碼進行持續檢測
Jenkins+Sonar內建對代碼進行持續檢測
Jenkins+Sonar內建對代碼進行持續檢測
Jenkins+Sonar內建對代碼進行持續檢測

sonar.projectKey指定sonar server上的key(唯一的)

sonar.projectName指定sonar server上的Project的名稱

sonar.sources 定義了需要分析的源代碼位置(示例中的$WORKSPACE 所訓示的是目前 Jenkins 項目的目錄)

.Net項目

Jenkins+Sonar內建對代碼進行持續檢測
Jenkins+Sonar內建對代碼進行持續檢測

可以試下效果了

轉載于:https://www.cnblogs.com/shitong/p/10763700.html