一、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/
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 参数,如下图所示:
方法2: 在Jenkins中下载sonar插件,目前插件为 SonarQube Scanner for Jenkins。安装完成后,在 系统管理->系统设置中,找到SonarQube servers模块,填写服务器信息,如下所示:
上图中的token 是从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