Sonar 是一個用於管理代碼質量的開源工具,能夠分析代碼中的bug和漏洞以及Code Smells,支持20多種編程語言的檢測,如java,c/c++,python,php等語言,當前有超過85000家組織在使用sonar。Sonar能夠與DevOps工具鏈徹底整合,能夠與大多數構建工具進行內置集成,與Jenkins,TFS / VSTS,TeamCity,Bamboo等持續整合引擎輕鬆集成,支持衆多源代碼管理配置工具,如git,svn,cvs等。php
官方地址:https://www.sonarqube.org/java
早在2007年,當建立第一行代碼時,Sonar的創始人就夢想有一天可以爲每一個開發人員提供測量其項目代碼質量的能力。他的座右銘:「持續檢測必須成爲持續整合的主流」。node
本文的目的就是安裝一個sonar,並集成到Jenkins中,實現代碼的一個持續質量監測。python
注意:sonar服務器至少須要2G的內存纔能有效運行,而操做系統則須要1GB的可用內存。mysql
安裝完mysql後建立sonar數據庫和帳號,方式以下:linux
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安裝c++
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/
配置啓動腳本:git
[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 $*
受權啓動腳本執行權限,並配置路徑github
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
修改配置文件web
[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
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.propertiessonar.jdbc.username=sonarsonar.jdbc.password=123456sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
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.propertiessonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8sonar.jdbc.username=sonarsonar.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
注意: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安裝失敗,則根據日誌報錯內容進行排查便可。
Sonar能夠經過安裝插件的方式來擴展本身的功能,具體信息能夠訪問sonar的插件庫,裏面提供了衆多代碼分析插件,認證受權插件,外部分析插件,語言插件,可視化/報告插件等。下面咱們就經過安裝sonar等中文插件來演示sonar插件的安裝。
sonar的插件庫:https://docs.sonarqube.org/display/PLUG/Plugin+Library
登錄sonar後,在Administration–>System–>Update Center–>Available中搜索Chinese就能夠看到中文插件包,點擊install便可安裝。可是安裝時間很是慢,甚至還會失敗,建議仍是手動安裝。
中文插件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驗證效果,能夠看到漢化成功了
這樣咱們的中文插件就完成安裝了,若是須要安裝其它的插件,能夠直接訪問官方插件庫進行尋找安裝。
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 = 'bigdata_monitor@xueleyun.com' 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使用
用 admin 用戶登錄 sonarQube,【配置】–>【權限】 –>【用戶】
安裝紅框中的兩個插件便可
點擊【系統管理】 –> 【系統設置】 配置 Sonar認證信息,設置完保存
點擊【系統管理】 –> 【全局工具配置】,配置sonar掃描器信息
爲了操做方便我這裏就不把剛纔的代碼放到git中進行拉取了,並且直接配置工做目錄爲剛纔的python_test目錄,生產環境你能夠根據公司實際狀況,選擇是從svn或者git獲取須要分析的代碼
增長一個構建步驟,選擇Execute SonarQube Scanner,選擇一個用於分析的jdk,並填入Analysis properties爲剛纔手動掃描的sonar-project.properties配置文件便可
這樣咱們Jenkins中sonar的部分就配置完了,咱們能夠保存job進行構建,構建完成,能夠經過構建歷史,直接跳轉到sonar到分析頁面,以下圖所示,並附Jenkins job 完整內容及構建視頻。
本文到這裏就結束了,雖然sonar的一些內容,好比項目管理,安全,監控,郵件通知等內容文章中並無說起,但我認爲漢化後的sonar管理仍是比較方便易操做的,這裏你們能夠本身登陸到後臺進行摸索。
還有就是sonar+Jenkins的這個job並非很全面,缺乏代碼自動獲取和發佈的配置,可是sonar的配置仍是正確的,你只須要把他加入到你代碼獲取後的第一個操做,或者編譯以前的操做都可。