美文网首页sonar
sonarqube代码质量管理平台环境搭建及实践(一)

sonarqube代码质量管理平台环境搭建及实践(一)

作者: dancingking | 来源:发表于2017-06-16 18:26 被阅读2437次

    一、前言

    年初的时候部门各组都给出了自己的规范文档,包括部门工作规范、各语言开发规范、测试规范、数据库规范、安全规范等等,然后各项规范的监督和落实工作就落在测试组的头上。其中各个开发语言的规范检查这一项工作内容就巨多,毕竟是一个没有做个code review的部门,技术债务可想而知。根据我多年TesterHome的潜水经验,搭建一个sonar平台就很有必要了。

    二、平台搭建

    我这里用的是windows,文中用到的所有软件都会在文末给出,linux操作系统的就看看配置吧。

    基础环境

    1.JDK

    下载安装最新版JDK,并配置环境变量:

    JAVA_HOME=C:\Program Files\Java\jdk1.8.0_131
    path   %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
    CLASSPATH   .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
    

    2.Mysql

    主要是安装mysql server,但是我为了避免发生不必要的错误,选择了全部安装,但是安装过程中提示缺少microsoft visual c++ 2013 runtime,结果mysql server没装上。

    安装完成microsoft visual c++ 2013 runtime后打开MySql Notifyer,右键,actions---launch installer ---- add --- MySql Server一步一步安装直到结束。

    我局域网ip是192.183.3.11,创建了两个数据库管理员帐号:

    root       123456
    sonarqube  sonarqube
    

    最后验证数据库安装和帐号是否创建成功,使用Navicat客户端连接,使用以上帐号连接成功即可。

    sonarqube

    1.服务架构

    服务架构
    远程客户机可以通过各种不同的分析机制,将被分析的项目代码上传到 SonarQube server 并进行代码质量的管理和分析,SonarQube 还会通过 Web API 将分析的结果以可视化、可度量的方式展示给用户。
    通过插件机制,Sonar可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd、checkstyle、 findbugs、Jenkins。通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程 进行代码质量管理。
    通常可以采用三种不同的方法来发起代码分析,分别为 Analyzing with SonarQube Runner、,Analyzing with SonarQube Ant Task 和 Analyzing with Maven 方法。这三种方法的主要区别是 , 它们分别适用于不同架构和组织形式的项目,并且其相应的配置文件的写法也不尽相同。
    本文采用的是SonarQube Runner的分析方式。

    2.创建数据库

    使用Navicat连接数据库并在命令行中运行:

    create database sonarqube;
    

    3.配置sonarqube

    官网下载的windows运行包解压后修改conf\sonar.properties配置文件:

    sonar.jdbc.url=jdbc:mysql://172.16.30.228:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
    sonar.jdbc.username=sonarqube
    sonar.jdbc.password=sonarqube
    

    注:这里的ip、数据库名、数据库用户名和密码都是上面创建的。

    4.启动sonarqube

    双击\sonarqube-6.3.1\bin\windows-x86-64\StartSonar.bat启动(根据你的系统选择),访问http://192.183.3.11:9000 ,出现如下界面即成功,启动过程数据库初始化可能稍微有点慢。如果需要更换端口的在sonar.properties文件中进行修改。
    启动成功后登录,默认帐号密码都是admin,进入配置--系统--更新中心--Avaliable搜索Chinese Pack安装简体中文汉化包,安装完成重启。

    首页

    5.安装插件

    以管理员身份登录后,进入配置--系统--更新中心--Avaliable搜索你需要安装的插件。需要注意的是有写插件需要挂代理才能安装成功。

    插件 插件

    sonar-runner(sonar-scanner)

    SonarQube Runner是一个利用SonarQube服务端分析代码的命令行工具,可以把它简单理解为客户端。sonar-runner分析完成后会将数据post到sonarqube进行展示。

    1.配置

    将下载好的sonar-scanner-2.5解压编辑其中的conf\sonar-runner.properties文件:

    #----- Default SonarQube server  SonarQube 服务器ip端口
    sonar.host.url=http://192.183.3.11:9000
    #----- Default source code encoding
    sonar.sourceEncoding=UTF-8
    #----- Global database settings (not used for SonarQube 5.2+) 数据库帐号密码
    sonar.jdbc.username=sonarqube
    sonar.jdbc.password=sonarqube
    #----- MySQL  服务所在ip以及数据库名
    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8
    

    将sonar-runner配置到系统环境变量:

    新建系统环境变量SONAR_RUNNER_HOME=your\sonar\path\sonar-scanner-2.5\sonar-scanner-2.5
    在path中添加:%SONAR_RUNNER_HOME%\bin;
    

    验证环境变量配置


    sonar-runner

    2.分析本地项目

    使用sonar-runner分析项目非常方便,只要在项目工程目录下新建sonar-project.properties文件,内容大致如下:

    #key和name保持一致且在sonar下唯一
    sonar.projectKey=car_android
    sonar.projectName=car_android
    #工程版本
    sonar.projectVersion=1.0  
    #源代码目录
    sonar.sources=src 
    #分析的语言 
    sonar.language=java  
    #编码
    sonar.sourceEncoding=UTF-8
    

    之后在cmd下进入工程目录下运行:sonar-runner -X


    运行结果

    运行最终结果显示EXECUTION SUCCESS即成功。稍候片刻打开sonar查看所有项目看到刚刚分析的项目car_android。

    car_android

    三、项目实践

    (一)与jenkins集成

    考虑到下载源码,编辑sonar-project.properties配置文件,执行sonnar-runner -X这些步骤都太过反复繁琐,果断使用jenkins来完成这些工作。
    下载并运行jenkins,完成一些基础配置,这里就不细讲了,主要说与sonar集成。

    1.安装[SonarQube Scanner for Jenkins]插件

    进入系统管理,插件管理中搜索[SonarQube Scanner for Jenkins]点击安装。

    2.插件配置

    进入系统管理--[Global Tool Configuration],找到[SonarQube Scanner],点击新增,取消“自动安装”的勾选,输入系统安装的sonnar-runner工作目录,完成后保存。


    SonarQube Scanner

    进入系统管理--系统设置,找到SonarQube servers,输入SonarQube servers的相关配置。

    SonarQube servers

    这里的token需要在sonar的我的账户-安全里生成

    sonarToken

    到这里,插件配置完成。

    (二)安卓项目

    1.基础准备

    我们的安卓源码放在自己搭建的一个Gerrit私服上,我在jenkins上还安装了Gerrit Trigger插件,结果目前都是手动构建。Gerrit是基于git,所以本地需要安装Git,安装完成后在Git Bash中生成SSH key.

    ssh-keygen -t rsa -C yourAccount
    输入密码1234566
    

    并将pub key保存到Gerrit账户下,如此在下面的配置中即可通过ssh拉取项目代码。


    Gerrit

    你以为这样就可以了吗?太年轻了。。。
    Gerrit还需要额外在id_rsa所在目录下创建一个config文件,内容如下(IP隐藏掉了):

    Host 120.26.54.1xx
            KexAlgorithms +diffie-hellman-group1-sha1
    

    2.job配置

    新建一个自由风格的项目,配置如图:

    Git

    需将刚才生成的id_rsa添加到jenkins的Credentials中

    Credential

    源码管理配置完成后,选择构建步骤Execute SonarQube Scanner,

    Execute SonarQube Scanner

    注:sonar.sources需要根据系统来使用不同的引用方式。

    3.项目构建

    完成配置后,点击立即构建,查看[Console Output],直到出现

    INFO: EXECUTION SUCCESS
    

    运行分析成功,稍等片刻点击SonarQube即可查看分析结果。

    SonarQube

    (二)iOS项目

    iOS项目需要Objective-c基本环境,在windows本机sonar-runner是走不通了,需要一台mac,在网上查阅了几篇文章之后,实践步骤如下:

    1.基础准备

    ssh key

    iOS源码放在码云,码云也是基于Git,不用再次安装,只需要将本地生成的pub key上传到码云的ssh 公钥即可。

    码云

    安装OCLint

    #提示xcode需要更新到8.3,更新xcode到最新版本
    brew tap oclint/formulae
    brew install oclint    //挂代理
    brew update   //不执行
    brew upgrade oclint  //不执行
    

    安装XCtool

    #挂代理
    brew install xctool  
    

    安装gcovr

    #挂代理
    brew install gcovr  
    

    安装xcpretty

    sudo gem install xcpretty
    

    配置开发者证书

    找开发,证书安装/导入成功之后,在xcode中点击项目,在界面中编辑Identity,保证域名与Signing(release)一致,如:
    Bundle Identifyier:com.dg11185.IPostCarService
    Signing(release):zalQiyeDg11185_20161215_disv1
    注:有文章指出无需配置开发者证书,只需在后面执行的编译命令中添加 -sdk iphonesimulator 参数指明以 Debug 方式构建即可。

    配置sonar-runner

    类似windows下的配置,下载解压,运行命令:

    sudo chmod -R 777 /Users/dg11185_test/Downloads/
    

    配置环境变量

    vi /etc/profile
    

    在文件末尾添加如下内容:

    export SONAR_RUNNER_HOME=/Users/dg11185_test/Downloads/sonar-scanner-2.5/sonar-scanner-2.5
    export PATH=$SONAR_RUNNER_HOME/bin:$PATH
    

    退出terminal,运行sonar-runner -h验证。

    2.生成oclint扫描结果文件

    sonar-runner需要一个oclint的PMD格式扫描结果文件才能进行分析。
    进入工程目录下,运行下列命令:

    xcodebuild |xcpretty -r json-compilation-database
    cp ./build/reports/compilation_db.json  compile_commands.json
    oclint-json-compilation-database -e Pods -v -- -report-type pmd -o report.xml -max-priority-1=9999 -max-priority-2=9999 -max-priority-3=9999
    

    3.配置文件

    将代码clone到本地,在项目目录下新建sonar-project.properties,内容如下:

    sonar.projectKey=car_iOS
    sonar.projectName=car_iOS
    sonar.projectVersion=1.0
    sonar.language=objc
    #sonar.projectDescription=Fake description
    sonar.sources=IPostCarService
    sonar.objectivec.project=IPostCarService.xcodeproj
    #sonar.objectivec.workspace=IPostCarService.xcworkspace
    sonar.objectivec.appScheme=IPostCarService
    sonar.sourceEncoding=UTF-8
    #上面生成的文件
    sonar.objectivec.oclint.reportPath=report.xml
    sonar.scm.enabled=false
    

    4.运行sonar-runner -X

    首次运行,提示:

    com.B.A.A.B.A: No license for objc
    

    查询后发现SonarCFamily这个插件需要license,商业软件,哎穷。
    那就换个插件,将sonar-objective-c-plugin-0.5.0-SNAPSHOT.jar放在sonar的plugins文件夹下后重启服务。
    再次运行scan-runner -X


    运行结果

    片刻后打开sonar,刷新页面看到扫描结果。

    iOS

    因为mac 笔记本连接的wifi没有固定IP,所以无法使用jenkins slave的方式进行集成,暂时只能手动编译运行然后在sonar上查看结果了。

    (三)其它项目

    1.Credential配置不同

    我们的PHP和部分Java源码放在svn,因此jenkins需要安装Subversion插件,唯一不同的就是在添加Credential时,Kind选择Username with password,输入svn用户名和密码即可。

    svnCredential

    2.配置文件不同

    有些项目比如web项目,包含java、javascript、HTML、CSS等多中语言,那配置文件如下:

    sonar.projectKey=PHP_ALL
    sonar.projectName=PHP_ALL
    sonar.projectVersion=1.0  
    sonar.sources=%WORKSPACE%
    sonar.languages=web,php,js,css,less
    sonar.sourceEncoding=UTF-8
    

    这里有一个坑,我配置完成后手动构建,输出日志提示:

    Caused by: org.tmatesoft.svn.core.SVNException: svn: E210004: Malformed network data
    

    一看还以为是svn的问题,查询良久看日志、换插件版本、svn版本均无果,后来将sonar.languages=web,php,js,css,less中web和php顺序(我原来是php,web,js,css,less)调整了一下再次构建,成功,泪流满面。

    四、结语

    sonar通过集成不同插件来运行静态代码扫描确实给我们的代码找出了非常多的问题,后续还需要推动开发来针对结果中比较严重的问题进行改进和修复。
    自定义规则方面,目前暂时通过部门的开发规范来修改sonar上对应的的代码规则,后续如果有好的实践就更第二篇。
    对于文中内容如果有疑问或者错误的欢迎指正和交流。

    五、软件下载

    链接:http://pan.baidu.com/s/1o7Krtgu 密码:qc3w

    六、参考

    sonar:
    http://www.cnblogs.com/winner-0715/p/5599350.html
    http://www.linuxidc.com/Linux/2016-08/133879.htm
    https://my.oschina.net/u/2306127/blog/541285
    https://my.oschina.net/jiangbianwanghai/blog/478338 https://www.ibm.com/developerworks/cn/opensource/os-sonarqube/
    https://my.oschina.net/jiangbianwanghai/blog/478935
    https://my.oschina.net/jiangbianwanghai/blog/479285

    jenkins集成:
    http://www.cnblogs.com/mingshengling/p/5751299.html
    http://www.linuxidc.com/Linux/2016-08/133877p2.htm https://www.ibm.com/developerworks/cn/devops/1612_qusm_jenkins/index.html

    iOS:
    https://testerhome.com/topics/7927
    https://shengpan.net/auto-code-review/
    http://blog.csdn.net/itfootball/article/details/45058591
    http://ios.jobbole.com/85016/

    相关文章

      网友评论

      • 安Iris:你好,我在window上布的sonar和数据库,在mac上运行sonar-scanner,报错you must install a plugin that supports the language 'objc'
        请问这个要怎么解决
        安Iris:@dancingking 这个问题已经解决了,sonar-scanner的配置项sonar.language现在是objectivec,就是现在应该配置成,sonar.language=objectivec
        dancingking:@安Iris 你在sonar平台上看下objc有配置到插件么
      • 62b9b63e1d3b:sudo chmod -R 777 /Users/dg11185_test/Downloads/
        vi /etc/profile
        export SONAR_RUNNER_HOME=/Users/dg11185_test/Downloads/sonar-scanner-2.5/sonar-scanner-2.5
        export PATH=$SONAR_RUNNER_HOME/bin:$PATH
        关于sonar-runner的这三个配置是什么意思呢
        dancingking:@梧桐梦 所以才要配置环境变量啊。。。。。
        62b9b63e1d3b:@dancingking 我将sonar-scanner-2.4这个直接放在/usr/local下面,sonar-runner.properties文件中配置IP以及数据库,然后sonar-project.properties文件放置在我的工程的目录下,在我的工程目录下执行sonar-runner -X,提示-bash: sonar-runner: command not found,这个如何解决呢?是不是路径或者权限不合适,这个流程没弄懂,求指导!多谢
        dancingking:第一句是因为我把sonar放在Download文件夹下,非root账号没有执行权限
        第二和第三句 就是配置环境变量而已啊- -
      • 62b9b63e1d3b:能将iOS下配置sonar-runner的具体步骤详细说一下吗?谢谢!我现在已经生成了XML文件,但是不晓得怎么将期扫描以及相应的结果传送会sonarqube进行可视化显示。我们公司的sonarqube也是安装在windows下的
        dancingking:sonar-runner.properties 配置如下就可以,IP和数据库都是sonarqube所在的Windows

        #----- Default SonarQube server
        sonar.host.url=http://192.183.3.11:9000

        #----- Default source code encoding
        sonar.sourceEncoding=UTF-8

        #----- Global database settings (not used for SonarQube 5.2+)
        sonar.jdbc.username=sonarqube
        sonar.jdbc.password=sonarqube

        #----- MySQL
        sonar.jdbc.url=jdbc:mysql://192.183.3.11:3306/sonarqube?useUnicode=true&characterEncoding=utf8

      本文标题:sonarqube代码质量管理平台环境搭建及实践(一)

      本文链接:https://www.haomeiwen.com/subject/dozrqxtx.html