1. 程式人生 > 程式設計 >原創|sonar+Jenkins 構建程式碼質量自動化分析平臺

原創|sonar+Jenkins 構建程式碼質量自動化分析平臺

1.Sonar 介紹

Sonar 是一個用於管理程式碼質量的開源工具,可以分析程式碼中的bug和漏洞以及Code Smells,支援20多種程式語言的檢測,如java,c/c++,python,php等語言,當前有超過85000家組織在使用sonar。Sonar可以與DevOps工具鏈完全整合,可以與大多數構建工具進行內建整合,與Jenkins,TFS / VSTS,TeamCity,Bamboo等持續整合引擎輕鬆整合,支援眾多原始碼管理配置工具,如git,svn,cvs等。 官方地址:https://www.sonarqube.org/ 早在2007年,當建立第一行程式碼時,Sonar的創始人就夢想有一天能夠為每個開發人員提供測量其專案程式碼質量的能力。他的座右銘:“持續檢測必須成為持續整合的主流”。 本文的目的就是安裝一個sonar,並整合到Jenkins中,實現程式碼的一個持續質量監測。

2.Sonar 安裝

2.1.安裝環境介紹

注意:sonar伺服器至少需要2G的記憶體才能有效執行,而作業系統則需要1GB的可用記憶體。
  • Centos 7.2
  • 安裝JDK 1.8
  • 安裝Jenkins 2.89
  • 安裝 maven 3.5.2(非必需,用於編譯一些外掛)
  • 安裝mysql 5.6 資料庫 (要求版本,不低於5.6)
安裝完mysql後建立sonar資料庫和賬號,方式如下:
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'localhost'
IDENTIFIED BY '123456' WITH GRANT OPTION; FLUSH PRIVILEGES;複製程式碼



2.2.SonarQube安裝

cd /data/package/
wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.6.zip
mkdir /data/service/sonar/
unzip sonarqube-6.6.zip -d /data/service/sonar/複製程式碼


配置啟動指令碼:
[root@c7-node1 ~]# cat /etc/init.d/sonar
#!/bin/sh
# # rc file for SonarQube # # chkconfig: 345 96 10 # description: SonarQube system (www.sonarsource.org) # ### BEGIN INIT INFO # Provides: sonar # Required-Start: $network # Required-Stop: $network # Default-Start: 3 4 5 # Default-Stop: 0 1 2 6 # Short-Description: SonarQube system (www.sonarsource.org) # Description: SonarQube system (www.sonarsource.org) ### END INIT INFO /usr/bin/sonar $*複製程式碼


授權啟動指令碼執行許可權,並配置路徑
chmod +x /etc/init.d/sonar
ln -s /data/service/sonar/sonarqube-6.6/bin/linux-x86-64/sonar.sh /usr/bin/sonar
chkconfig sonar on複製程式碼


修改配置檔案
[root@c7-node1 ~]# cd /data/service/sonar/sonarqube-6.6/conf/
[root@c7-node1 conf]# cp sonar.properties{,.bak}
sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false複製程式碼

2.3.sonarQube Scanner 安裝

cd /data/package/
wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.8.zip
unzip sonar-scanner-2.8.zip -d /data/service/sonar/
ln -s /data/service/sonar/sonar-scanner-2.8/bin/sonar-scanner /usr/bin/sonar-scanner複製程式碼


修改配置檔案
[root@c7-node1 ~]# cd /data/service/sonar/sonar-scanner-2.8/conf/
[root@c7-node1 conf]# cp sonar-scanner.properties{,.bak}
[root@c7-node1 conf]# vim sonar-scanner.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8複製程式碼


2.4.sonarQube runner 安裝

cd /data/service/
wget http://repo1.maven.org/maven2/org/codehaus/sonar/runner/sonar-runner-dist/2.4/sonar-runner-dist-2.4.zip
unzip sonar-runner-dist-2.4.zip -d /data/service/sonar/
ln -s /data/service/sonar/sonar-runner-2.4/bin/sonar-runner /usr/bin/sonar-runner複製程式碼


修改配置檔案
[root@c7-node1 ~]# cd /data/service/sonar/sonar-runner-2.4/conf/
[root@c7-node1 conf]# cp sonar-runner.properties{,.bak}
[root@c7-node1 conf]# vim sonar-runner.properties
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
sonar.jdbc.username=sonar
sonar.jdbc.password=123456複製程式碼

新增環境變數
[root@c7-node1 ~]# vim /etc/profile.d/sonar.sh
export SONAR_HOME=/data/service/sonar/sonarqube-6.6
export SONAR_RUNNER_HOME=/data/service/sonar/sonar-runner-2.4
export PATH=$SONAR_RUNNER_HOME/bin:$PATH
[root@c7-node1 ~]# source /etc/profile.d/sonar.sh複製程式碼

2.5.啟動sonar

注意:sonar預設不允許使用root使用者啟動,所以我們需要建立sonar使用者,並以sonar使用者啟動
[root@c7-node1 ~]# useradd sonar
[root@c7-node1 ~]# chown -R sonar:sonar /data/service/sonar/
[root@c7-node1 ~]# su sonar
[sonar@c7-node1 root]$ /etc/init.d/sonar start複製程式碼
sonar啟動成功後,訪問伺服器的9000埠即可開啟sonar的web介面,預設賬號和密碼為admin:admin注意:sonar預設不允許使用root使用者啟動,所以我們需要建立sonar使用者,並以sonar使用者啟動。
出現如下頁面說明sonar安裝成功,如果sonar安裝失敗,則根據日誌報錯內容進行排查即可。


3.Sonar 外掛使用及漢化

Sonar可以通過安裝外掛的方式來擴充套件自己的功能,具體資訊可以訪問sonar的外掛庫,裡面提供了眾多程式碼分析外掛,認證授權外掛,外部分析外掛,語言外掛,視覺化/報告外掛等。下面我們就通過安裝sonar等中文外掛來演示sonar外掛的安裝。 sonar的外掛庫:https://docs.sonarqube.org/display/PLUG/Plugin+Library

3.1.後臺安裝中文外掛

登陸sonar後,在Administration–>System–>Update Center–>Available中搜索Chinese就可以看到中文外掛包,點選install即可安裝。但是安裝時間非常慢,甚至還會失敗,建議還是手動安裝。

3.2.手動安裝外掛

中文外掛github地址:https://github.com/SonarQubeCommunity/sonar-l10n-zh 我們把中文外掛原始碼下載到我們本地,並且切換到相應的版本(我安裝的sonar6.6版本,需要切換到1.18tag),進行編譯
git clone https://github.com/SonarQubeCommunity/sonar-l10n-zh.git
cd sonar-l10n-zh/
git checkout sonar-l10n-zh-plugin-1.18
mvn package
cp target/sonar-l10n-zh-plugin-1.18-SNAPSHOT.jar /data/service/sonar/sonarqube-6.6/extensions/plugins/複製程式碼
複製中文外掛到sonar外掛目錄後,重啟sonar生效 重啟sonar後,訪問web驗證效果,可以看到漢化成功了 這樣我們的中文外掛就完成安裝了,如果需要安裝其它的外掛,可以直接訪問官方外掛庫進行尋找安裝。

4.Sonar 分析Python程式碼小例

Sonar 安裝漢化完成就可以用來實際的分析程式碼了,我準備了一個分析python程式碼的小例子用來演示sonar分析程式碼過程。 例:我的python專案是使用3.0版本開發,但是使用了2.0的語法,我們試試sonar能不能分析出來(sonar內建了python 3.0分析外掛,我們無須額外安裝)。演示指令碼就一個,功能為傳送郵件,其中的print為2.0語法,在3.0環境下是無法正常執行的,我們通過分析這個指令碼,來演示sonar的分析程式碼過程。
[sonar@c7-node1 ~]$ cat python_test/sendEmail.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys
import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 第三方 SMTP 服務
mail_host="xxx" #設定伺服器
mail_user="xxx" #使用者名稱
mail_pass="xxx" #口令


sender = '[email protected]'
receivers = sys.argv[1]

content=sys.argv[3]
message = MIMEText(content,'plain','utf-8')

message['From'] = Header(sender,'utf-8')
message['To'] = Header(receivers,'utf-8')

subject = sys.argv[2]
message['Subject'] = Header(subject,'utf-8')


try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host,25) # 25 為 SMTP 埠號
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender,receivers,message.as_string())
print "郵件傳送成功"
except smtplib.SMTPException:
print "Error: 無法傳送郵件"複製程式碼

在專案根目錄下建立一個配置檔案sonar-project.properties,專案如果在sonar中沒有建立,首次分析會自動根據填入到配置檔案的名稱和key自動建立
[sonar@c7-node1 ~]$ cat python_test/sonar-project.properties
sonar.projectKey=python_test
sonar.projectName=python_test
sonar.projectVersion=1.0
sonar.sources=.
sonar.sourceEncoding=UTF-8複製程式碼

在專案根目錄下執行下面的命令啟動分析

sonar-scanner複製程式碼
掃描完成之後,我們再次開啟web頁面就可以看到,我們的sonar根據配置檔案填入的內容自動建立了python_test的專案,並且分析出來了兩個bug

點選專案名稱,可以進入到專案,檢視專案的詳細分析資訊 點選bugs,可以看到具體的bug資訊,我們可以看到bug的資訊為python print語句有問題

sonar不僅可以找到bug,而且還會告訴我們我們這樣為什麼錯誤,還會給出正確示例子; 檢視bug具體資訊:說print語句在python3.0中被刪除。應該使用內建函式,並且給出了正確例項。


5.Sonar 整合Jenkins使用

5.1.設定sonar中的令牌

用 admin 使用者登陸 sonarQube,【配置】–>【許可權】 –>【使用者】

5.2.Jenkins 安裝sonar相關外掛

安裝紅框中的兩個外掛即可

5.3.Jenkins配置sonar外掛

點選【系統管理】 –> 【系統設定】 配置 Sonar認證資訊,設定完儲存

點選【系統管理】 –> 【全域性工具配置】,配置sonar掃描器資訊

5.4.Jenkins job 中配置sonar

為了操作方便我這裡就不把剛才的程式碼放到git中進行拉取了,而且直接配置工作目錄為剛才的python_test目錄,生產環境你可以根據公司實際情況,選擇是從svn或者git獲取需要分析的程式碼

增加一個構建步驟,選擇Execute SonarQube Scanner,選擇一個用於分析的jdk,並填入Analysis properties為剛才手動掃描的sonar-project.properties配置檔案即可

這樣我們Jenkins中sonar的部分就配置完了,我們可以儲存job進行構建,構建完成,可以通過構建歷史,直接跳轉到sonar到分析頁面,如下圖所示,並附Jenkins job 完整內容及構建視訊。

6.後記


本文到這裡就結束了,雖然sonar的一些內容,比如專案管理,安全,監控,郵件通知等內容文章中並沒有提及,但我認為漢化後的sonar管理還是比較方便易操作的,這裡大家可以自己登入到後臺進行摸索。 還有就是sonar+Jenkins的這個job並不是很全面,缺少程式碼自動獲取和釋出的配置,但是sonar的配置還是正確的,你只需要把他加入到你程式碼獲取後的第一個操作,或者編譯之前的操作均可。
文章系作者原創投稿。作者:西門飛冰,一名90後it男,一直在北京工作,熱愛運動,熱愛冒險,熱愛旅行。 原文地址:http://www.fblinux.com/?p=1155。

警惕!又一疑似東南亞“黑磚窯”人才輸送基地

不想起標題,只想發紅包~|讀者福利

使用 zabbix 監控 tomcat(包含jvm監控)

怎麼選?畢竟可以上網的瀏覽器只剩下四款了...

想要高可用?搞定負載均衡架構是關鍵

觸控識別,智慧分揀……看AI如何為垃圾分類賦能