天天看點

Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題

背景

随着代碼量的增多,服務子產品的拆分,代碼越來越難進行管理,品質與效率這一對沖突體将凸顯出來,就希望将代碼品質管理的模式由原來人為主動控制轉變成為由自動化工具檢測,人被動接收通知,并且相關資料沉澱下來。

Jenkins

大家都熟知是用來自動化單元測試、編譯、打包及部署的,挺好用的。

基于另外一個出發點,針對代碼規範,相信大家或多或少的了解過阿裡巴巴開源的編碼規範,看過就忘記了,在開發過程中,常常由于時間進度緊沒能很好的執行,但程式真正運作起來出現問題往往都是這些潛在的問題與壞味道導緻的,如果有一種工具能夠将這些規則固化到日常開發流程中去,利用工具倒逼着自己提前考慮這些問題,那将大大的提高軟體品質,也充當了一部分代碼走讀的功能,另一方面也能夠将自己的知識結構更加系統化的鍛煉,

Sonar

就是為這個而生的,業界也提供了這兩者的內建方式,友善的将流程集中在一起了,這也是持續內建中的部分概念。

本文檔描述不清晰或者關于這兩款工具軟體其它功能的最佳實踐,還望各位指正。

依賴及版本說明

  • Jenkins

    版本

    2.107.3

    下載下傳位址,我這裡是下載下傳的

    .war

    包形式
  • Sonar

    版本

    7.1

    下載下傳位址,我這裡下載下傳的是

    Latest Release

    版本
  • JDK 1.8+

    Mysql 5.6+

    這就不多說
  • Maven 3.2.1

Jenkins

因為下載下傳的是

.war

包形式,也不存在其它的安裝步驟,直接運作指令

java -jar jenkins.war

即可将其跑起來,它将所有需要的資源檔案都放在了這裡,好友善,預設運作的端口是8080,多數情況下這個端口都會被占用,具體改法下面會講到。大家可能都知道

jenkins

是基于插件化的架構,是以安裝完後,需要裝一些基礎的插件,像

Maven Integration plugin

,

Cobertura Plugin

,

SonarQube Scanner for Jenkins

等等,如果公司的機器能夠上網,安裝這些插件都不是問題,本公司的網絡環境有限,隻有少部分機器能夠上網,在這過程中遇到不少麻煩,因為如果将

war

包轉移到另外一台新的機器上時,它又是重新初始化,必須初步了解它的運作機制與目錄結構,解決方法見下。

目錄結構

  • jenkins.war

    包相當于它的運作主體程式,放在任意目錄都可以
  • /root/.jenkins

    目錄相當于它的運作時目錄,包括配置、插件、工作空間、日志、節點、任務等重要資訊目錄,基本上看這個目錄就夠了,

    /root

    是指使用者目錄,如果你使用的是

    alice

    使用者,那目錄将變成

    /alice/.jenkins

Jenkins使用

程式運作起來後,浏覽器通路

http://IP:8080

進入初台化界面如下,首先會出現一個解鎖的頁面,按照提示的密碼檔案路徑擷取密碼,将密碼填入後下一步進入系統,進入後進行admin初始密碼的修改。

Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題

成功進入主界面如下,具體相關的功能不再一一介紹,關于系統的配置功能均在

系統管理

中。

Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題

相關技巧

  1. 如何進行離線安裝

離線安裝一般有如下兩種方式

  • 下載下傳插件檔案

    xxx.hpi

    ,從插件官網下載下傳對應的插件檔案,然後在

    系統管理

    ->

    插件管理

    ->

    進階

    中手動上傳插件,如下圖所示
    Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題
  • 利用能夠上網的機器将所需要的插件線上安裝好,然後将

    /root/.jenkins

    目錄下全部打包至不能上網的機器對應目錄下,重新開機

    jenkins

    服務
    Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題
    1. 如何修改預設啟動端口8080

執行指令

java -jar jenkins.war --httpPort=8090

可對目前啟動生效,但如果機器重新開機或将

jenkins

做成系統服務怎麼辦,因為它本身沒有提供配置檔案修改,需要自己将端口寫入環境變量,然後讀取環境變量進行實作。

Sonar

介紹

Sonar

是一個用于代碼品質管理的開源平台,用于管理

Java

源代碼的品質。通過插件機制,它 可以內建不同的測試工具,代碼分析工具,以及持續內建工具,比如

checkstyle

findbugs

Jenkins

。通過不同的插件對這些結果進行再加工處理,通過量化的方式度量代碼品質的變化,進而可以友善地對不同規模和種類的工程進行代碼品質管理。同時它還對大量的持續內建工具提供了接口支援,可以很友善地在持續內建中使用它。此外,它的插件還可以對

Java

以外的其他程式設計語言提供支援,對國際化以及報告文檔化也有良好的支援。可以說是目前最強大的代碼品質管理工具之一。

它的主要作用如下:

  • 檢查代碼是否遵循程式設計标準:如命名規範,編寫的規範等
  • 檢查設計存在的潛在缺陷:

    SonarQube

    通過插件

    Findbugs

    Checkstyle

    等工具檢測代碼存在的缺陷
  • 檢測代碼的重複代碼量:

    SonarQube

    可以展示項目中存在大量複制粘貼的代碼
  • 檢測代碼中注釋的程度:源碼注釋過多或者太少都不好,影響程式的可讀可了解性
  • 檢測代碼中包、類之間的關系:分析類之間的關系是否合理,複雜度情況

安裝

配置資料庫

Sonar

運作需要使用到資料庫,它會将規則、使用者、分析結果儲存在資料庫,需要執行以下語句進行資料庫的初始化,其中的相關表是在程式啟動初始化時建立的。

CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'sonar' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
FLUSH PRIVILEGES;           

配置Sonar

因為

Sonar

在運作過程中使用了

elasticsearch

資料庫,但它不能使用

root

使用者啟動,檢查目前是否為

root

使用者,如果是則切換至

sonar

使用者。

将下載下傳好的安裝包

sonarqube-7.1.zip

賦予

sonar

使用者權限,執行指令

chown sonar:sonar sonarqube-7.1.zip

,然後解壓。

解壓後進入

conf

配置目錄,修改

sonar.properties

檔案,如下配置預設均是注釋掉的。

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false           

啟動

進入

bin

啟動目錄,該目錄下根據作業系統與位數的不同而區分有不同的目錄,這裡選擇的是

linux-x86-64

,進入後執行指令

./sonar.sh start

啟動。

啟動過程的相關日志存放在與

bin

目錄平級的

logs

目錄下。

Sonar漢化

Sonar

預設的語言是英文的,看起來不是那麼友善,社群也提供了漢化版的插件下載下傳位址

下載下傳完成将插件放到

\extensions\plugins

,重新開機

sonar

即可。

Sonar使用

sonar

高版本相比低版本發生了一個變化,以前低版本與外部接口使用使用者名與密碼,高版本則使用生成的

token

,在初始化過程中會提示你輸入一個使用者名,然後生成

token

,這個值就是以後與

maven

jenkins

內建時的接口憑證,當然也可以跳過,後面再生成。

浏覽器通路

http://IP:9000

進入主界面,如下圖所示,具體相關功能不一一細講。

Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題

自定義代碼審查規則

自定義代碼審查規則是根據每個公司的編碼規範形成的,拿

java

來說預設有許多,但不一定都需要滿足,這個後續再研究。

Jenkins內建Sonar

在前面

jenkins

中該裝的插件都裝了,接下來通過建立一個任務來實作,對

svn

路徑下的項目實作編譯打包,代碼規範檢查,品質統計分析整個流程。

jenkins

sonar

內建有兩種方式,一種是在

Post Steps

過程中使用

SonarQube Scanner

分析,二是在建構後操作中使用

SonarQube analysis with Maven

,相當于調用了

maven

的插件與

sonar

內建。這裡使用的是第二種方式進行驗證實作。

  • 全局工具配置,包括

    jdk

    maven

    的配置,在

    系統管理

    ->

    全局工具配置

    ,如下圖所示
    Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題
    Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題
  • 建立任務,輸入任務名稱,選擇項目類型,這裡選擇

    maven

    項目
    Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題
  • 任務配置,任務配置如下所示,裡面提供了很多過程階段,像源碼管理、建構觸發器、建構環境、Pre Steps、Build、Post Steps、建構設定及建構後操作,這裡我使用到了源碼管理、建構觸發器、Build與建構後操作四個過程
    1. 源碼管理,主要是指定源碼下載下傳的路徑,一般為

      SVN

      ,但需要配置

      SVN

      的使用者名與密碼,在右側

      Credentials

      功能采單中添加全局的帳戶資訊
      Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題
    2. 建構觸發器,指定任務觸發的機制,視情況而定,我這裡是周期性的,規則跟

      cron

      形式一緻
      Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題
    3. Build 指定了編譯的根檔案以及編譯的指令
      Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題
    4. 建構後操作,指定了使用

      maven

      插件內建

      sonar

      ,當然前提是得先配置

      SonarQube servers

      ,在

      系統管理

      ->

      系統設定

      中進行配置,如下圖所示,其中

      Server authentication token

      就是前面提到的需要在

      sonar

      中根據使用者名生成的令牌
      Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題
      Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題

最後點選儲存任務配置資訊,你可以接下來就選擇

立即建構

功能來驗證是否正确,或者等待你設定的周期定時器規則。

結果驗證

以上步驟實作從

SVN

中拉取代碼、編譯、代碼規範檢查整個流程,我們将在

jenkins

看到編譯的結果,在

sonar

中檢視到代碼品質的統計資料,問題一目了然的反映出來了。

Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題
Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題

問題

  • maven

    執行過程權限不夠,錯誤如下,最終排查是由于我手動将

    maven

    包傳到

    linux

    機器時,

    bin

    目錄下的啟動腳本失去了可執行權限,賦權限即可
[iotstp] $ /home/mzh/CI/apache-maven-3.2.1/bin/mvn -f /root/.jenkins/workspace/iotstp/pom.xml -e -B sonar:sonar -Dsonar.host.url=http://10.10.107.104:9000 ********
FATAL: command execution failed
java.io.IOException: error=13, 權限不夠           
  • maven

    插件調用

    sonar

    接口時找不到

    SVN

    的使用者名與密碼,鑒權失敗,解決措施為關閉掉

    sonar

    中的

    scm

    開關
[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.0.905:sonar (default-cli) on project iotstp: Error when executing blame for file pom.xml: svn: E170001: Authentication required for '<http://10.10.1.15:443> VisualSVN Server' -> [Help 1]           
Jenkins與Sonar內建背景依賴及版本說明JenkinsSonarJenkins內建Sonar結果驗證問題