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” 開始安裝;
離線安裝:線上安裝容易失敗,可嘗試離線安裝,下載外掛 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
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
下圖展示的只是專案報告首頁,每個連結進去能看到詳情: