Jenkins 集成sonar 可以提供一个dashboard给项目成员和管理者,提供一个一目了然的项目分析情况,Sonar在代码分析是非常有用的工具。下面就具体说说如何进行集成。

一、实践目标

     1、安装和配置sonar

             2、与Jenkins 集成

             3、通过某个具体工程项目来呈现sonar分析结果

       二、环境准备

     1、Jenkins 环境:  部署在192.168.136.144  centos6.5  

             2、mysql: 5.6.33: 部署在 192.168.136.144

            3、 sonargube 和 sonar scanner  部署在192.168.136.144

            4、 jdk:  1.8 (因为高版本的jenkins和sonar 都要求1.8)

      三、安装sonar

       1、下载sonar

       通过sonar的下载链接,我们可以下载最新的sonar 6.5版本,下载url为:https://www.sonarqube.org/downloads/

       下载的版本为:sonarqube-6.5.zip,并把它部署到192.168.136.144 的  /opt 目录下。

       2、mysql中创建数据库

       在mysql中创建sonar的数据库:

       MySQL> CREATE USER 'sonar'@'%' IDENTIFIED BY 'sonar123';
       MySQL> CREATE DATABASE sonar CHARACTER SET UTF8;
       MySQL> GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'%';

       上面主要做的事情就是:为sonar 创建一个数据库和使用这个数据库的用户,并进行授权

       

       3、修改sonar 的相关配置

        首先修改:/opt/sonarqube-6.5/conf/sonar.properties 中的java启动参数和数据库连接信息

       

sonar.web.javaOpts=-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar123
sonar.jdbc.url=jdbc:mysql://192.168.136.144:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.context=/sonar
sonar.web.host=0.0.0.0
sonar.web.port=9000
      

       4、启动和停止命令

        由于sonar部署包里面为了各种系统准备了启动脚本,所以我们可以根据系统情况,做一个软链接到sonar的根目录:

        通过  ln -s  bin/linux-x86-64/sonar.sh  sonar.sh 建立一个软链接

[root@cwqsolo sonarqube-6.5]# ln  -s   bin/linux-x86-64/sonar.sh  sonar.sh
[root@cwqsolo sonarqube-6.5]# ls  -ltr
total 40
-rw-r--r--  1 root root 7651 Jul 31 21:00 COPYING
drwxr-xr-x  8 root root 4096 Oct  4 06:44 bin
drwxr-xr-x  2 root root 4096 Oct  4 06:44 data
drwxr-xr-x  4 root root 4096 Oct  4 06:44 extensions
drwxr-xr-x 10 root root 4096 Oct  4 06:44 lib
drwxr-xr-x  2 root root 4096 Oct  4 06:44 logs
drwxr-xr-x  2 root root 4096 Oct  4 06:44 temp
drwxr-xr-x  9 root root 4096 Oct  4 06:44 web
drwxr-xr-x  2 root root 4096 Oct  4 06:56 conf
lrwxrwxrwx  1 root root   25 Oct  4 07:00 sonar.sh -> bin/linux-x86-64/sonar.sh
[root@cwqsolo sonarqube-6.5]# 
        通过上述部署, 在sonar部署目录下,启动和停止简化为:      

sonar.sh stop
sonar.sh start 
sonar.sh restart
#控制台启动
sonar.sh console
## 查看日志
tail -f ./logs/sonar.log
     sonar 6需要java 1.8 版本的支持,否则会报告如下错误


         在部署了java 1.8 之后,日志打印正常。说明如果环境中有多个java版本,并且缺省java 不是 jdk 1.8 怎么办呢? 可以通过修改  conf/wrapper.conf 中的属性

    wrapper.conf:wrapper.java.command=java 

    通过修改“java”来设置1.8版本的jdk,如通过下面方式:

   wrapper.conf:wrapper.java.command=/usr/java/jdk1.8.0_112/jre/bin/java


        5、启动sonar

         通过命令(  ./sonar.sh  start),就可以用url:   http://192.168.136.144:9000/sonar/ 来访问sonargube服务了。 缺省账号密码 admin / admin


下面首先把sonar 中文汉化一下,从  https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases  上,下载 sonar-l10n-zh-plugin-1.17.jar,将这个插件,部署到/opt/sonarqube-6.5/extensions/plugins。 在sonar部署目录里面, 通过   ./sonar.sh  restart 重启后,就可以看到中文界面了。

        也可以通过administration-》system-》update 找到中文包,进行安装:        

           中文安装好后,重新打开sonar的界面,是这样的,清楚多了:



       6 安装 sonar-scanner

       安装完成sonargube 服务后,还需要安装一个分析工具,可以用runner 或者scanner ,本文采用scanner ,它与sonargube的关系可以大致理解为客户端和服务端。

      首先通过下面的url下载scanner2.8版本:  https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.8.zip 并解压部署到 /opt目录下,完成后如下所示:

  

[root@cwqsolo opt]# ls  -ltr
total 20
drwxr-xr-x.  2 root root 4096 Nov 22  2013 rh
drwxr-xr-x   4 root root 4096 Nov  6  2016 cloudera
drwxr-xr-x   3 root root 4096 Nov  9  2016 remi
drwxr-xr-x  10 root root 4096 Oct  4 07:23 sonarqube-6.5
drwxr-xr-x   5 root root 4096 Oct  5 00:56 sonar-scanner-2.8
[root@cwqsolo opt]# 
  进入 scanner 目录,并进入conf 目录,修改sonar-scanner.properties  文件,与sonar前面的设置一致:

sonar.host.url=http://192.168.136.144:9000
sonar.login=admin
sonar.password=admin
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar123
sonar.jdbc.url=jdbc:mysql://192.168.136.144:3306/sonar?useUnicode=true&characterEncoding=utf8

     修改系统环境变量中/etc/profile 中的设置,在文件最后添加下面内容:

PATH=$PATH:/opt/sonar-scanner-2.8/bin  
export PATH

     通过以下命令进行启动

    sonar-scanner -h

    启动正确后,可以看到如下界面:


          scanner在于jenkins 进行集成的作用是:jenkins通过scanner传入要分析的工程,scanner再将这些分析结果,传给sonargube 进行呈现

四、在jenkins中配置sonar

1、jenkins中sonar插件的安装

网页上大部分都是在插件管理里,可以找到sonarqube plugin,好吧,有点衰,我的jenkins插件管理里面找不到这个插件,于是我只好采用phi 文件安装方式:

        首先去这个url下载phi文件: http://updates.jenkins-ci.org/latest/sonar.hpi    这个是sonar最新插件,需要jenkins 2.6以上版本,可怜只好升级了一把jenkins。

        准备好hpi文件,并升级jenkins,重启后,进入jenkins:

        jenkins -》插件管理-》高级



        

        点击上传,又是小等待后,重启。

        2、配置 sonarqube server

         现在在进入jenkins-》系统管理-》系统配置后,就可以出现配置sonarqube server的地方了

         

        

      3、 配置sonar scanner

       由于上面我们已经安装了scanner,所以这里可以配置一下,不需要选择自动安装



          4、修改scanner参数

           配置完成后,进入工程,需要进行配置下面几个sonar scanner参数:

             尤其需要注意红框中的内容,低版不需要关注,但是高版本需要填写,否则scanner 会报错

          


         5、执行构建

             如果一切顺利,构建后显示本次构建为蓝色(成功),点开 sonarQube 就可以看到代码分析工具给出的结果:

         

            最后通过SonarQube 来展现分析的结果:

              

    

五、异常

最后:总结一下各种坑

1、sonar.java.binaries property 属性错误

高版本的sonar 会报告如下错误:Please provide compiled classes of your project with sonar.java.binaries property

    解决办法: 

    在jenkins构建配置中, 加入此参数如:

    sonar.java.binaries=WebRoot/WEB-INF/classes  

   如果有多个目录,用逗号隔开


2、scanner 报告  SVN错误

INFO: ------------------------------------------------------------------------
ERROR: Error during SonarQube Scanner execution
java.lang.IllegalStateException: Error when executing blame for file src/com/cyrx/webapp/action/CommonController.java
	at org.sonar.plugins.scm.svn.SvnBlameCommand.blame(SvnBlameCommand.java:86)
	at org.sonar.plugins.scm.svn.SvnBlameCommand.blame(SvnBlameCommand.java:59)
	at org.sonar.scanner.scm.ScmPublisher.publish(ScmPublisher.java:82)
	at org.sonar.scanner.phases.PublishPhaseExecutor.afterSensors(PublishPhaseExecutor.java:59)

    解决:

打开sonarqube的控制台,使用admin登录后 ,配置->SCM->菜单中,将Disabled the SCM Sensor设置为true,                 





  

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐