1. 程式人生 > >Jenkins 整合 Sonar

Jenkins 整合 Sonar

通常,單一的 Jenkins 對於專案的持續整合夠用了。本文總結另外一種流行方案,Jenkins 與 Sonar 整合:Sonar 是 Jenkins 之外獨立執行的一個服務。Jenkins 中安裝外掛 SonarQube(並配置其 Sonar Server 的 URL / AccessToken 等資訊),構建完畢後,該外掛把報告資料提交給 Sonar Server 解析,Sonar Server 最終以量化圖形方式展示程式碼質量變化。 

作者:王克鋒 
出處:https://kefeng.wang/2017/01/10/jenkins-sonar/ 
版權:自由轉載-非商用-非衍生-保持署名,轉載請標明作者和出處。

1 Sonar 伺服器的安裝

1.1 系統需求

  • JDK8+
  • 記憶體 2GB+
  • MySQL 5.6+

1.2 安裝 MySQL Server

準備 sonar 資料庫(sonar)和使用者(sonar/Sonar6.2):

## mysql -A -uroot -pMySQL5.7
MySQL> CREATE USER 'sonar'@'localhost' IDENTIFIED BY 'Sonar6.2';
MySQL> CREATE DATABASE sonar CHARACTER SET UTF8;
MySQL> GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'localhost';
## mysql -A -usonar -pSonar6.2 -Dsonar -e "SHOW CREATE DATABASE sonar"
  • 1
  • 2
  • 3
  • 4
  • 5

1.3 下載 SonarQube(V6.2)

## https://www.sonarqube.org/downloads/
## wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.2.zip ## 下載失敗
wget https://fossies.org/linux/misc/sonarqube-6.2.zip ## 125M, MD5=f13464a4a4c32f5fa4b075f2247f3d67
sudo unzip -q sonarqube-6.2.zip -d /opt/
sudo ls -l /opt/sonarqube-6.2/
  • 1
  • 2
  • 3
  • 4
  • 5

1.4 修改 SonarQube 配置

## sudo vim /opt/sonarqube-6.2/conf/sonar.properties
sonar.web.javaOpts=-server -Xms256m -Xmx768m -XX:+HeapDumpOnOutOfMemoryError
sonar.jdbc.username=sonar
sonar.jdbc.password=Sonar6.2
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

## 下面設定訪問網址為 http://centos:9000/sonar
sonar.web.host=0.0.0.0
sonar.web.port=9000
sonar.web.context=/sonar
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

1.5 啟動服務

sudo /opt/sonarqube-6.2/bin/linux-x86-64/sonar.sh stop ## 停止服務
sudo /opt/sonarqube-6.2/bin/linux-x86-64/sonar.sh start ## 啟動服務
sudo /opt/sonarqube-6.2/bin/linux-x86-64/sonar.sh restart ## 重啟服務
sudo /opt/sonarqube-6.2/bin/linux-x86-64/sonar.sh console ## 控制檯啟動
sudo tail -f /opt/sonarqube-6.2/logs/sonar.log ## 檢視日誌
  • 1
  • 2
  • 3
  • 4
  • 5

1.6 防火牆放行

### sudo vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT
### 重啟生效: sudo systemctl restart iptables
  • 1
  • 2
  • 3

1.7 安裝外掛 SonarQube

瀏覽器訪問 http://centos:9000/sonar,用預設的管理員賬號(admin/admin)登陸; 
線上安裝:進入外掛中心 (Administration / System / Update Center / Available Plugins) 找到所需的外掛,點選右側的 “Install” 開始安裝; 
jenkins sonar-plugins
離線安裝:線上安裝容易失敗,可嘗試離線安裝,下載外掛 jar 檔案至外掛目錄下,並重啟 SonarQube 生效; 
外掛 jar 檔案的下載地址,可以到線上安裝頁找到外掛的 Homepage 再找 releases,如下:

  • Git: 已自帶安裝;
  • SVN: 已自帶安裝;
  • Java: 已自帶安裝,Java 原始碼解析,計算指標等;
  • JavaScript: 已自帶安裝;
  • PMD

外掛的離線安裝指令碼如下:

cd /opt/sonarqube-6.2/extensions/plugins/
sudo rm -rf sonar-csharp-plugin-*.jar
sudo wget https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-1.13/sonar-l10n-zh-plugin-1.13.jar
sudo wget https://github.com/SonarQubeCommunity/sonar-findbugs/releases/download/3.4.4/sonar-findbugs-plugin-3.4.4.jar
sudo wget https://github.com/SonarQubeCommunity/sonar-checkstyle/releases/download/2.4/sonar-checkstyle-plugin-2.4.jar
sudo wget https://github.com/SonarQubeCommunity/sonar-pmd/releases/download/2.6/sonar-pmd-plugin-2.6.jar
sudo wget https://github.com/SonarQubeCommunity/sonar-sonargraph/releases/download/sonar-sonargraph-plugin-3.5/sonar-sonargraph-plugin-3.5.jar
sudo /opt/sonarqube-6.2/bin/linux-x86-64/sonar.sh restart ## 重啟服務
## 注意:不完整的 wget 下載檔案必須刪掉,否則會導致 SonarQube 啟動失敗!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

1.8 生成認證令牌(Token)

外部系統(比如 Jenkins)訪問 SonarQube 時要用到; 
進入:Administration(配置) / Security(許可權) / User(使用者),找到使用者 admin,點選 “Tokens” 一列; 
彈出介面裡:輸入 TokenName=”admin”, 點選 “Generate”, 生成 “8687b74188c446f2e02ec6eb5ee9d80b88048406”

1.9 部署至 Tomcat

上面是 Sonar 以獨立 server 方式執行,也可以改為整合至 Tomcat:

## 注意修改 $TOMCAT_HOME/bin/catalina.sh 初始記憶體 1G+
sudo /opt/sonarqube-6.2/war/build-war.sh ## 將sonar達成一個war包
sudo cp /opt/sonarqube-6.2/war/sonar.war %TOMCAT_BASE/web-apps/
  • 1
  • 2
  • 3

2 Jenkins 接入 Sonar

2.1 Jenkins 外掛的安裝與設定

安裝完畢後,進入:系統管理 / 系統設定 / SonarQube servers, 點選 “Add SonarQube” 按鈕:

  • Name: SonarQube-6.2
  • Server version: 5.3 or higher
  • Server authentication token: 8687b74188c446f2e02ec6eb5ee9d80b88048406(前面 SonarQube 生成的)

Jenkins 會把構建結果通過 URL和認證令牌傳送給 SonarQube 
sonar jenkins-config

2.2 調整 Jenkins 構建設定

構建設定 Build 中,指定 Maven goals: “sonar:sonar” 
專案構建時就會自動上報構建報告給 Sonar

2.3 構建錯誤排查

構建如有報錯,可檢視 SonarQube 日誌來分析:

## cat /opt/sonarqube-6.2/logs/web.log
Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (6428688 > 4194304). 
You can change this value on the server by setting the 'max_allowed_packet' variable.
  • 1
  • 2
  • 3

含義是 MySQL Server 的引數值設定過小,調整並重啟 mysqld:

## sudo vim /etc/my.cnf
## sudo systemctl restart mysqld
[mysqld]
max_allowed_packet=64M ## default 4M
  • 1
  • 2
  • 3
  • 4

2.4 檢視報告

進入登陸 SonarQube 檢視: 
http://centos:9000/sonar 
下圖展示的只是專案報告首頁,每個連結進去能看到詳情: 
jenkins sonar-report