| 编辑推荐: | 
                                   
                                   
                                    | 本文来自于testerhome.com,本文主要目的是详细介绍一下sonar环境的搭建,网上有很多的资料介绍环境配置,笔者在Linux和Mac环境搭建过程中都踩过坑,便记录一二。 | 
                                   
                                  | 
                             
                           
                        引文 
                          sonar是业界开源的代码质量监控的开源平台,之前在jenkins mac slave上配置了oclint,但是报表在jenkins内显示不是很友好,为了真正让开发小伙伴用的顺手,需要配置sonar平台。 
                      目录 
                          1、简单介绍原理 
                          2、sonar环境配置 
                          3、sonar-runner环境配置 
                          4、集成执行生成可视化报表 
                          5、参考 
                      1、介绍原理 
                          开题提过,我之前的oclint是通过jenkins 调度执行在我们配置的几台mac slave上的,oclint生成的报告是pmd格式,通过jenkins的插件Pbulish 
                            PMD analysis results解析和展示。 
                            但是当开发想看哪些issue的时候,就会很麻烦,不是很直观,需要点击到jenkins的job里面去查找。为了方便开发小伙伴,查阅资料知道了sonar。 
                            网上对sonar有非常详细的介绍,我就不赘述,我理解的sonar就是类似于我用flask写的一个服务端,可以用来存储数据和展示数据,sonar-runner就类似于requests的一个post请求,它将oclint检查生成的PMD格式的XML文件发送给sonar,然后sonar将接收的数据存入 
                            mysql或者其他类型的数据库,并且展示。 
                            
                          sonar简单原理 
                          对于jenkins触发的job我是通过jenkins 中gerrit的触发机制,当开发change-merge到开发分支的时候触发job执行。 
                        2、sonar环境配置 
                          sonar环境配置分两步,sonar和mysql. 
                            【1】sonar 
                            在这里我在mac和linux环境都尝试搭建了sonar。 
                          sonar下载地址为:https://www.sonarqube.org/downloads/ 
                          下载好之后,是一个.tgz压缩文件,解压之后,这里linux和mac配置环境是一致的没有什么不同,放在任意文件夹位置都可以。加入放在/opt/sonar/下面。 
                          启动sonar服务命令为: 
                           
                               ## linux启动 
                                ./bin/linux-x86-4/sonar.sh start
                                ## mac启动 
                                  ./bin/macosx-universal-64/sonar.sh start  | 
                           
                         
                         
                          
                            启动之前,我更改了conf/sonar.properties,由于我在linux上启动了几个flask服务已经占用了很多端口。 
                            我更改了这些项目: 
                           
                              |  sonar.web.host=0.0.0.0
                                 sonar.web.port=9007 
                                sonar.search.port=9011  | 
                           
                         
                        
                          
                            然后分别执行启动命令,打开http://127.0.0.1:9007,就可以正常进入sonar界面。但是在最下面有红字提示那是因为没有连接数据库。 
                          这里我更改sonar.search.port是因为,我发现默认端口9001已经被占用,服务启动不起来,报错提示在logs/ce.log看出来的。 
                            【2】mysql 
                            这里mac和linux有稍微的区别。 
                            安装命令: 
                           
                              |  ## linux 我推荐rpm格式安装,且安装mysql 
                                5.7版本
                                 1、https://dev.mysql.com/downloads/repo/apt/ 
                                  下载dev包 
                                  2、转存linux,然后执行 
                                  sudo dpkg -i mysql-apt-config_0.8.3-1_all.deb 
                                  groupadd mysql 
                                  useradd -r -g mysql mysql 
                                  sudo apt-get install libaio-dev 
                                ## mac安装mysql 
                                  brew install mysql  | 
                           
                         
                          
                          
                            mysql安装好之后,启动命令: 
                           
                               ## linux 
                                sudo /etc/init.d/mysql start
                                ## mac 
                                  mysql.server start  | 
                           
                         
                          
                          
                            通过默认root用户登录mysql,mysql -uroot -proot,登录之后。 
                            需要新增sonar database以及sonar用户。 
                           
                               CREATE DATABASE 
                                sonar CHARACTER SET utf8 COLLATE utf8_general_ci; 
                                CREATE USER 'sonar' IDENTIFIED BY 'sonar'; 
                                GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED 
                                BY 'sonar'; 
                                GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED 
                                BY 'sonar'; 
                                FLUSH PRIVILEGES; | 
                           
                         
                        
                          
                            成功之后,重启一下mysql服务。 
                          更改conf/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  | 
                           
                         
                    
                          
                            再重启一下sonar服务,然后重新登录http://127.0.0.1:9007,正常启动,则可以看到页面最底端的红字预警提示已经没有了,其实也可以通过logs文件夹下,日志查看。 
                          小贴士,这里我为什么强调使用mysql 5.7的版本,是因为我在linux下安装第一次是用sudo 
                            apt-get install mysql-server,导致安装的5.5的版本,和sonar 6.2不匹配。 
                         3、sonar-runner配置 
                          sonar-runner类似于一个发请求的命令,它应该放置于执行oclint的mac slave上。 
                          sonar-runner下载路径 
                          解压缩之后,环境变量可配置可不配置,我建议不要配置bash_profile,因为要使得bash_profile生效,jenkins需要跟slave断开一下再重连,才能生效。这对于持续集成集群服务来说,是不合理的。 
                          要使得sonar-runner能有效使用,需要配置sonar-runner/conf/sonar-runner.properties 
                           
                               sonar.host.url=http://localhost:9007 
                                sonar.sourceEncoding=UTF-8 
                                sonar.login=admin  
                                sonar.password=admin | 
                           
                         
                         
                          
                            这个时候需要在命令行验证一下,假设sonar-runner放置于opt下,opt/sonar-runner/bin/sonar-runner,提示: 
                        
                           
                               SonarQube Runner 
                                2.4 
                                Java 1.8.0_111 Oracle Corporation (64-bit) 
                                Mac OS X 10.12.3 x86_64 
                                INFO: Runner configuration file: /Users/huami/opt/sonar-runner/conf/sonar-runner.properties 
                                INFO: Project configuration file: NONE 
                                INFO: Default locale: "zh_CN", source 
                                code encoding: "UTF-8" | 
                           
                          
                          
                          
                            说明sonar-runner已经配置好。 
                        4、集成执行生成可视化报表 
                          【1】在执行sonar-runner之前,需要在服务端sonar/extensions/plugins/下加载一个oc检查jar包插件。 
                            sonar-objective-c-plugin-0.5.0-SNAPSHOT.jar插件下载地址 
                          下载好之后,将其转存到sonar/extensions/plugins/,并重启一下sonar服务。 
                          【2】需要新建生成或者在下载的包里面,将sonar-project.properties放入iOS项目主目录,最后我的sonar-project.properties为: 
                           
                               ########################## 
                                # Required configuration # 
                                ##########################
                                sonar.projectKey=MiFit 
                                  sonar.projectName=MiFit 
                                  sonar.projectVersion=1.0 
                                  sonar.language=objectivec 
                                # Project description 
                                  sonar.projectDescription= Fake description 
                                # Path to source directories  工程文件目录 
                                  sonar.sources=MiFit 
                                # Xcode project configuration  (.xcodeproj or 
                                  .xcworkspace) 
                                  # -> If you have a project:  configure only 
                                  sonar.objectivec.project 
                                  # -> If you have a workspace:   configure sonar.objectivec.workspace 
                                  and sonar.objectivec.project 
                                  # and use the later to specify  which project(s) 
                                   to include in the analysis   (comma separated 
                                  list) 
                                  sonar.objectivec.project= MiFit.xcodeproj 
                                  sonar.objectivec.workspace= MiFit.xcworkspace 
                                # Scheme to build your application 
                                  sonar.objectivec.appScheme= MiFit 
                                  # Scheme to build and run your tests  (comment 
                                  following line of you don't have any tests) 
                                 
                                  ########################## 
                                  # Optional configuration # 
                                  ########################## 
                                # Encoding of the source code 
                                  sonar.sourceEncoding=UTF-8 
                                 
                                  sonar.objectivec.oclint.reportPath=lint.xml 
                                 
                                  sonar.scm.enabled=false 
                                sonar.host.url=http://x.x.x.x:9007  | 
                           
                         
                          
                          万事俱备,只欠东风。 
                          【3】我已经在iOS项目目录下生成了oclint执行之后的PMD格式的lint.xml。 
                            为了验证sonar搭建的没有问题,直接cd到项目根目录下去执行sonar-runner将lint.xml结果信息发送到sonar服务。 
                          假如前面都正常配置的话,此时执行sonar-runner,log如果是这样的 
                           
                               Analysis report 
                                uploaded in 2489ms 
                                11:47:24.701 INFO - ANALYSIS SUCCESSFUL, you can 
                                browse http://x.x.x.x:9007/dashboard/index/MiFit 
                                11:47:24.702 INFO - Note that you will be able 
                                to access the updated dashboard once the server 
                                has processed the submitted analysis report 
                                11:47:24.702 INFO -  More about the report processing 
                                at http://x.x.x.x:9007/api/ce/task? id=AVrK7MT-YTb445TpRSn7 
                                11:47:25.577 INFO - Task total time: 24.425 s 
                                INFO: ------------------------------ 
                                INFO: EXECUTION SUCCESS 
                                INFO: ------------------------------ 
                                Total time: 32.521s 
                                Final Memory: 23M/777M | 
                           
                         
                          
                          可以去http://192.168.1.101:9007看看项目执行的记录有没有正确上传了。 
                   
          
                          我没有加入自己定义的规则,那才是静态代码监控平台最重要的地方,等我实践好,再分享吧,我现在只是把环境配置好了。  |