新晋测试小白最近在研究sonarqube的静态代码检查,整理了关于sonarqube 如何在mac os x系统下的安装和应用。大家在阅读的同时如果发现有问题,欢迎拍砖、探讨。
1.安装sonar
(1)安装sonarqube
下载SonarQube安装包并且解压至待安装的文件夹,下载并解压Sonar Runner或者Sonar Scanner,并且解压至待安装的文件夹 。
添加SONAR_HOME、SONAR_RUNNER_HOME或SONAR_SCANNER_HOME环境变量,并将SONAR_SCANNER_HOME加入系统变量,如下:
export SONAR_HOME=xxx
export SONAR_SCANNER_HOME=xxx
PATH=${PATH}:${SONAR_SCANNER_HOME}/bin
(2)修改配置文件
编辑/conf/sonar.properties文件,配置数据库设置,默认已经提供了各类数据库的支持。
这里使用mysql,因此取消mysql模块的注释。在此之前确保mysql中已经创建了sonar 的数据库。
sonar.jdbc.username= sonar
sonar.jdbc.password= sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar? useUnicode=true &characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
sonar.jdbc.driverClassName=com.mysql.jdbc.Driver
修改sonar-runner.properties OR sonar-scanner.properties,切换至sonar-scanner的安装目录下,修改sonar-scanner.properties。根据实际使用数据库情况取消相应注释(后面的版本可以不用配置数据库信息)。
sonar.host.url=http://192.168.1.22:9000
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true &characterEncoding=utf8
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.sourceEncoding=UTF-8
sonar.login=admin
sonar.password=admin
打开Web Server进行外部访问,在sonar.properties文件中解除注释如下:
sonar.web.host=192.168.1.22
sonar.web.port=9000
sonar.web.context=/sonar
调整sonar的java配置参数,默认情况下,SonarQube 执行时应用的是一个简单的Java JRE,为了更好的 执行效果,可以配置自己安装Java JDK,并且解除sonar.properties的注释如下:
sonar.web.javaOpts=-server
修改SonarQube应用的Java JVM,通过修改/conf/wrapper.conf,修改内容如下:
wrapper.java.command=[my_jdk_path]/jdk/bin/java
目录切换至sonar的/bin/[OS]目录,启动服务
./sonar.sh start 启动服务
./sonar.sh stop 停止服务
./sonar.sh restart 重启服务
至此,sonar就安装好了,访问http://192.168.1.22:9000查看。
2.安装插件
sonar是一个开源的框架,通过安装不同的插件,可以实现对不同的开发语言,产生对应的检查规则。有两种安装插件的方法:
第一种:在有网络的情况下,安装了sonar server 时,如果用户有全局权限,并可以进入管理员选项卡。则可以选择在System> Update Center >Available Plugins 选择自己所需的插件,安装后重启sonar server。
第二种:在[SONAR_HOME]/extensions/plugins 中上传已经下载的插件,并重启sonar server。
如果安装了商业插件的话,需要导入证书,在Administration > Configuration > Licenses,在待安装的插件处点Update,输入License并保存,然后重启sonar server。
3. 应用sonarqube进行代码检核
根据官网提供的文档,一个简单的配置只在需要检查代码的项目根目录添加一个sonar-project.properties文件,并配置如下:
# must be unique in a given SonarQube instance
sonar.projectKey=myproject_id
# this is the name displayed in the SonarQube UI
sonar.projectName=Myproject
sonar.projectVersion=1.0
sonar.sources=.
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
在项目的根目录下执行sonar-runner 或者sonar-scanner。
通过登录http://192.168.1.22:9000默认的用户名密码均为admin,查看生成的报告。
4.针对Android Gradle 项目的代码检核
SonarQube Scanner 有一款Gradle 的插件,提供了一种更简便的方式以分析Gradle 项目。
使用SonarQube Scanner 插件的前提:SonarQube 已安装、支持SonarQube server 的最低java版本已安装、支持InnoDB 引擎的mysql。
(1)如何使用SonarQube Scanner
在~/.gradle/gradle.properties文件中进行如下配置,实现全局变量:
systemProp.sonar.host.url=http://192.168.1.22:9000
systemProp.sonar.login=admin
systemProp.sonar.password=admin
在项目根文件的build.gradle中进行如下配置(gradle2.1+的版本):
plugins {
id "org.sonarqube" version "2.2.1"
}
在项目根文件的build.gradle中进行如下配置(任何gradle版本都支持):
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.2.1"
}
}
apply plugin: "org.sonarqube"
在项目根文件的build.gradle中配置sonarqube任务
sonarqube {
properties {
property "sonar.projectName", "test"
property "sonar.projectKey", "test"
property "sonar.jdbc.driverClassName", "com.mysql.jdbc.Driver"
property "sonar.projectVersion", "1.0"
property "sonar.projectBaseDir", "."
property "sonar.modules", "app"
property "app.sonar.language", "java"
property "app.sonar.sources", "/src/main/java/"
property "sonar.showsql", "true"
property "sonar.verbose", "true"
property "sonar.scm.provider", "git"(确保插件已经安装)
property "sonar.profile", "Android Lint”(确保插件已经安装)
}
}
执行 grade sonarqube(未安装grade执行./gradlew sonarqube) ,执行成功后登录sonarqube控制台查看生成的报告。
5.问题以及解决方案
在执行sonar-scanner的时候,总是报错org.sonarqube.ws.client.HttpException:Error 500,最后在查看web.log的时候,提示“com.mysql.jdbc.PacketTooBigException: Packet for query is too large (7290627 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.”。
登录到mysql执行 show variables like ‘%max_allowed_packet%’。查看该参数的值,然后执行set GLOBAL max_allowed_packet = 134217728,重启mysql服务。