SonarQube

一、SonarQube簡介
Sonar 是一個用於代碼質量管理的開放平臺。通過插件機制,Sonar可以集成不同的測試工具,代碼分析工具, 以及持續集成工具。 比如pmd-cpd、checkstyle、findbugs、Jenkins。 通過不同的插件對這些結果進行再加工處理,通過量化的方式度量代碼質量的變化,從而可以方便地對不同規模和種類的工程進行代碼質量管理。同時 Sonar 還對大量的持續集成工具提供了接口支持,可以很方便地在持續集成中使用 Sonar。
此外,Sonar 的插件還可以對 Java 以外的其他編程語言(支持的語言包括:Java、PHP、C#、C、Cobol、PL/SQL、Flex等)提供支持, 對國際化以及報告文檔化也有良好的支持。 可以說Sonar是目前最強大的代碼質量管理工具之一。
SonarQube和SonarQube Runner之間的關係。SonarQube是服務器端,它主要有兩個功能:1.分析源代碼;2.因爲它內嵌了Apache模塊,所以提供Web端的界面訪問。SonarQube Runner是一個利用SonarQube服務端分析代碼的命令行工具,可以把它簡單理解爲客戶端。

二、SonarQube安裝
1、數據庫配置

mysql>  CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.11 sec)
mysql> CREATE USER 'sonar' IDENTIFIED BY '*****';
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY '*****';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY '******';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)
mysql> \q
Bye

2、配置sonar

[root@vm1 ~]# wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.7.3.zip
[root@vm1 ~]# mv sonarqube-6.7.3.zip /usr/local/
[root@vm1 ~]# cd /usr/local/
[root@vm1 local]# unzip sonarqube-6.7.3.zip
[root@vm1 local]# ln -s sonarqube-6.7.3 sonar
[root@vm1 ~]# cd /usr/local/sonar/conf/
[root@vm1 conf]# vim sonar.properties 
[root@vm1 conf]# grep -Pv "^(#|$)" sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=*****
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.host=0.0.0.0
sonar.web.port=9000

Sonar-scanner 下載址:
wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.1.0.1141-linux.zip
https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
https://docs.sonarqube.org/display/SCAN

2、配置SonarQube Runner
下載地址:http://repo1.maven.org/maven2/org/codehaus/sonar/runner/sonar-runner-dist/2.4/sonar-runner-dist-2.4.zip

[root@vm1 ~]# mv sonar-runner-dist-2.4.zip /usr/local/
[root@vm1 ~]# cd /usr/local/
[root@vm1 local]# unzip sonar-runner-dist-2.4.zip 
Archive:  sonar-runner-dist-2.4.zip
   creating: sonar-runner-2.4/
   creating: sonar-runner-2.4/bin/
  inflating: sonar-runner-2.4/bin/sonar-runner.bat  
  inflating: sonar-runner-2.4/bin/sonar-runner  
   creating: sonar-runner-2.4/conf/
  inflating: sonar-runner-2.4/conf/sonar-runner.properties  
   creating: sonar-runner-2.4/lib/
 extracting: sonar-runner-2.4/lib/sonar-runner-dist-2.4.jar  
[root@vm1 local]# ln -s ln -s sonar-runner-2.4 sonar-runner
[root@vm1 local]# cd sonar-runner/conf/
[root@vm1 conf]# vim sonar-runner.properties 
[root@vm1 conf]# grep -Pv "^(#|$)" sonar-runner.properties
sonar.host.url=http://localhost:9000
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
sonar.jdbc.username=sonar
sonar.jdbc.password=*****
sonar.login=admin
sonar.password=admin
[root@vm1 conf]#

[root@vm1 ~]# vim /etc/profile
JAVA_HOME=/usr/java/latest
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export TIME_STYLE='+%Y/%m/%d %H:%M:%S'
export SONAR_HOME=/usr/local/sonar
export SONAR_RUNNER_HOME=/usr/local/sonar-runner
PATH=$SONAR_HOME/bin:$SONAR_RUNNER_HOME/bin:$JAVA_HOME/bin:$PATH
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL JAVA_HOME

[root@vm1 conf]# source /etc/profile

3、啓動SonarQube
用root無法啓動lSonarQube,需要另外新建普通用戶來啓動

[root@vm1 sonar]#  useradd esadmin
[root@vm1 sonar]# cd ..
[root@vm1 local]# chown -R esadmin.esadmin sonarqube-6.7.3
[root@vm1 local]# vim sonar/elasticsearch/config/elasticsearch.yml
[root@vm1 local]# grep -Pv "^(#|$)" sonar/elasticsearch/config/elasticsearch.yml 
network.host: 192.168.60.119
http.port: 9200
[root@vm1 local]#
[root@vm1 local]# su esadmin
[esadmin@vm1 local]$ cd sonar
[esadmin@vm1 sonar]$ bin/linux-x86-64/sonar.sh start
[esadmin@vm1 sonar]$ tail -f logs/sonar.log 
2018.05.21 19:51:06 INFO  app[][o.s.a.SchedulerImpl] Process[es] is up
2018.05.21 19:51:06 INFO  app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='web', ipcIndex=2, logFilenamePrefix=web]] from [/usr/local/sonarqube-6.7.3]: /usr/java/jdk1.8.0_172-amd64/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/usr/local/sonarqube-6.7.3/temp -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -cp ./lib/common/*:./lib/server/*:/usr/local/sonarqube-6.7.3/lib/jdbc/mysql/mysql-connector-java-5.1.42.jar org.sonar.server.app.WebServer /usr/local/sonarqube-6.7.3/temp/sq-process6994721675375568509properties
2018.05.21 19:51:38 INFO  app[][o.s.a.SchedulerImpl] Process[web] is up
2018.05.21 19:51:38 INFO  app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='ce', ipcIndex=3, logFilenamePrefix=ce]] from [/usr/local/sonarqube-6.7.3]: /usr/java/jdk1.8.0_172-amd64/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/usr/local/sonarqube-6.7.3/temp -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -cp ./lib/common/*:./lib/server/*:./lib/ce/*:/usr/local/sonarqube-6.7.3/lib/jdbc/mysql/mysql-connector-java-5.1.42.jar org.sonar.ce.app.CeServer /usr/local/sonarqube-6.7.3/temp/sq-process5555492575408452898properties
2018.05.21 19:51:54 INFO  app[][o.s.a.SchedulerImpl] Process[ce] is up
2018.05.21 19:51:54 INFO  app[][o.s.a.SchedulerImpl] SonarQube is up
[esadmin@vm1 sonar]$ lsof -i:9000
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    22595 esadmin  116u  IPv6 105980      0t0  TCP *:cslistener (LISTEN)
[esadmin@vm1 sonar]$
[root@vm1 local]# firewall-cmd --zone=public --add-port=9000/tcp --permanent 
success
[root@vm1 local]# firewall-cmd --reload
    success
[root@vm1 local]#

4、使用瀏覽器就可以直接登陸
在瀏覽器地址欄輸入: http://sonarqube_server_ip:9000/
SonarQube

5、SonarQube與maven結合
maven的setting.xml 配置如下:

    <pluginGroups>
        <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
    </pluginGroups>

    <profiles>

        <profile>
            <id>sonar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!-- Optional URL to server. Default value is http://localhost:9000 -->
                <sonar.host.url>
                  http://192.168.40.119:9000
                </sonar.host.url>
            </properties>
        </profile>

        ......
    </profiles>

mvn sonar:soanr

6、SonarQube與Jenkins配合
方法1:Jenkins -->調用maven --> 在maven的settings.xml文件中指定SonarQube的地址,最後在Jenkins 項目構建時 使用 maven clean deploy sonar:sonar 參數,如下圖所示:
SonarQube

方法2: 在Jenkins中下載sonar插件,目前插件爲 SonarQube Scanner for Jenkins。安裝完成後,在 系統管理->系統設置中,找到SonarQube servers模塊,填寫服務器信息,如下所示:
SonarQube
上圖中的token 是從SonarQube複製並粘貼過來的,如下所示:
SonarQube

在項目的根目錄下添加文件sonar-project.properties 文件參考:

# must be unique in a given SonarQube instance
sonar.projectKey=my:project
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=My project
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# This property is optional if sonar.modules is set. 
sonar.sources=.
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
# The value of the property must be the key of the language.
sonar.language=java
# Additional parameters
sonar.my.property=value

sonar-scanner

export SONAR_SCANNER_OPTS="-Xmx512m"

SonarLint相當於sonar的一個插件,它及時反饋給開發人員新的bug和質量問題。是常用IDE的一個擴展。如Eclipse、VS、IntelliJIDEA。

wget -c http://repo1.maven.org/maven2/org/codehaus/sonar-plugins/l10n/sonar-l10n-zh-plugin/1.8/sonar-l10n-zh-plugin-1.8.jar

[esadmin@vm1 source]$ git clone https://github.com/SonarSource/sonar-scanning-examples.git
[esadmin@vm1 source]$ cd sonar-scanning-examples/sonarqube-scanner
[esadmin@vm1 sonarqube-scanner]$ ls
copybooks  coverage-report  sonar-project.properties  src
[esadmin@vm1 sonarqube-scanner]$ /usr/local/sonar-scanner/bin/sonar-scanner

總結:其中注意的地方:
(1)安裝sonar以前必須,安裝好jdk和 mysql數據庫。
(2)jdk的版本影響着sonar版本,所以下載的時候需要注意(Sonar5.6以上版本需要JDK1.8)
(3)注意配置文件中配置信息要求。注意有三個配置文件需要去配置一下,sonar.properties,配置文件主要是配置數據庫信息。因爲,sonar產生的報告信息, 是存儲在數據庫中的。
sonar-scanner.properties,配置文件,主要是關聯服務器sonar和數據庫信息。第三個配置文件任然是上面這一樣的名字,是配置在項目中的配置文件。管理項目和客戶端的連接。
(4)那就是用到的命令、啓動sonar服務器我們直接在bin啓動就可以了,需要注意的命令。驗證客戶端是否安裝成功sonar-scanner -version 然後就是我們主要的命令。sonar-scanner 用來加載項目進入服務器sonar中。
(5)一個 輸入URL http://localhost:9000

三、補充sonarqube-7.3

[root@nexus ~]# cd /usr/local/src/
[root@nexus src]# wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.3.zip
[root@nexus src]# unzip sonarqube-7.3.zip
[root@nexus src]# ln -s sonarqube-7.3 sonarqube
[root@nexus src]# grep sonar /etc/passwd
sonar:x:1021:1022::/home/sonar:/bin/bash
[root@nexus src]# chown -R sonar.sonar sonarqube-7.3
[root@nexus src]# cd sonarqube/conf
[root@nexus conf]# vim sonar.properties
[root@nexus conf]# grep -Pv "^($|#|;)" sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.port=10000    #默認9000,由於本機9000已被佔用 本例改爲10000
[root@nexus conf]#  mysql -usonar -psonar sonar -hlocalhost  #測試連接mysql的username、password、dbName ;sonar7.3 要求 MySQL >=5.6 && <8.0
[root@nexus conf]# ln -s /usr/local/src/sonarqube-7.3/bin/linux-x86-64/sonar.sh /etc/init.d/sonar
[root@nexus conf]# vim /etc/init.d/sonar
[root@nexus conf]# grep -A 2 RUN_AS_USER=sonar /etc/init.d/sonar
RUN_AS_USER=sonar
LimitNOFILE=65536
LimitNPROC=2048
[root@nexus conf]# (添加以上三行)
[root@nexus conf]# grep SONAR_HOME /etc/profile
export SONAR_HOME=/usr/local/src/sonarqube
export PATH=$PATH:$SONAR_HOME
[root@nexus conf]#
[root@nexus conf]# service sonar start
[root@nexus conf]# lsof -i:10000
COMMAND   PID  USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
java    18831 sonar  116u  IPv4 1429389507      0t0  TCP *:ndmp (LISTEN)
[root@nexus conf]#
[root@nexus conf]# cd /etc/nginx/conf.d
[root@nexus conf.d]# cat sonar.conf
upstream sonar-node {
    server 127.0.0.1:10000;
}
server {
    listen 80;
    server_name sonar.2dupay.com;
    access_log /var/log/nginx/sonar/access.log;
    error_log /var/log/nginx/sonar/error.log;
    location / {
        proxy_pass http://sonar-node;
    }
       allow 192.168.20.0/24;
       deny all;
}
[root@nexus conf.d]# nginx -s reload
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章