剛剛發佈 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/di…

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

在這裏插入圖片描述

3.2.手動安裝插件

中文插件github地址:https://github.com/SonarQubeC…
我們把中文插件源碼下載到我們本地,並且切換到相應的版本(我安裝的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驗證效果,可以看到漢化成功了

clipboard.png

這樣我們的中文插件就完成安裝了,如果需要安裝其它的插件,可以直接訪問官方插件庫進行尋找安裝。

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

在這裏插入圖片描述

點擊項目名稱,可以進入到項目,查看項目的詳細分析信息

clipboard.png

點擊bugs,可以看到具體的bug信息,我們可以看到bug的信息爲python print語句有問題

clipboard.png

sonar不僅可以找到bug,而且還會告訴我們我們這樣爲什麼錯誤,還會給出正確示例子;

查看bug具體信息:說print語句在python3.0中被刪除。應該使用內置函數,並且給出了正確實例。

clipboard.png

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配置文件即可

clipboard.png

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

clipboard.png

6.後記

本文到這裏就結束了,雖然sonar的一些內容,比如項目管理,安全,監控,郵件通知等內容文章中並沒有提及,但我認爲漢化後的sonar管理還是比較方便易操作的,這裏大家可以自己登錄到後臺進行摸索。
還有就是sonar+Jenkins的這個job並不是很全面,缺少代碼自動獲取和發佈的配置,但是sonar的配置還是正確的,你只需要把他加入到你代碼獲取後的第一個操作,或者編譯之前的操作均可。

文章系作者原創投稿。作者:西門飛冰,一名90後it男,一直在北京工作,熱愛運動,熱愛冒險,熱愛旅行。原文首先於微信公衆號:民工哥技術之路。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章