配置SonarQube,Jenkins集成扫描Android项目

SonarQube是一款开源的质量管理平台, 可以从不同的维度分析项目的质量.也可以把SonarQube跟Jenkins结合起来, 从而帮助我们快递定位潜在的问题, 更好得把控项目输出的质量.SonarQube的安装分为两部分, 分别是Server和Scanner.Server是整个SonarQube平台运行基础.Scanner提供了代码扫描的功能, 以及针对Gradle的扫描配置.Jenkins的安装配置这里就不展开只介绍集成Sonar的job.接下来就把Sonar, Jenkins和Android的配置全部串起来.

##配置SonarQube Server

SonarQube平台有很多数据要存储, 像是用户信息, 代码扫描结果, issue统计等. 所以SonarQube需要安装一个数据库.从上面的SonarQube的Installing the Server文档可以看到, Sonar可以支持SQL Server, MySQL和Oracle. 这篇文章就介绍一下在Mac下使用MySQL的配置.

# 使用brew安装MySQL
brew install mysql
	
# 启动MySQL服务
mysql.server start {start|stop|restart|reload|force-reload|status}
	
# 以root身份登录进MySQL, 并重置初始密码
mysql -u root
set password for root@localhost = password('mysql');
	
# 创建一个名为sonar的数据库
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
	
# 创建一个为SonarQube服务的MySQL用户
CREATE USER 'sonar'@'localhost' 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配置完成之后去SonarQube的官网下载最新版本或者LTS版.将压缩包内部的文件压缩到/etc/sonarqube下.并开启SonarQube.

# On other operating system, execute:
/etc/sonarqube/bin/[OS]/sonar.sh { console | start | stop | restart | status | dump }

开启成功之后就可以在浏览器中访问http://localhost:9000, 默认的管理员账号密码为admin/admin.这时候虽然可以访问SonarQube的主页,但是我们还没有把它和数据库联系起来.进入SonarQube的配置路径修改sonar.properties绑定跟数据库的关系.SonarQube Server默认的端口是9000, 也可以在这个配置文件中修改.

# Config sonar.properties
cd /etc/sonarqube/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

##配置SonarQube Scanner

同样在SonarQube官网下载SonarQube Scanner, 解压到SonarQube的同级目录/etc/sonar-scanner下. 同时可以配置一下SonarQube和SonarQube Scanner的环境变量方面以后使用.

# sonar
export SONAR_HOME=/etc/sonarqube-6.2
export SONAR_RUNNER_HOME=/etc/sonar-scanner-2.8/bin
export PATH=${PATH}:${SONAR_RUNNER_HOME}

因为Scanner是和SonarQube Server分开下载配置的,所以Scanner要通过修改配置文件建立起和SonarQube Server与数据库之间的联系. 主要host.url的配置要和Server的保持一致.

# Config sonar-scanner.properties
cd /etc/sonar-scanner-2.8/conf
sonar.host.url=http://localhost:9000
sonar.sourceEncoding=UTF-8
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8

##配置Gradle SonarQube Scanner

在根项目的build.gradle文件中引入SonarQube Scanner的依赖并且将Scanner的插件加入的项目中. 同时配置一些项目基础属性.

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"

sonarqube {
  properties {
    property "sonar.projectName", "My Project Name"
    property "sonar.projectKey", "org.sonarqube:java-gradle-simple"
  }
}

也可以在module中针对实际的场景进行差异化的配置,例如在扫描项目时跳过sociallibmodule.

project(":sociallib") {
    sonarqube {
        skipProject = true
    }
}

这些都配置完完成后就可以在项目根部执行./gradlew sonarqube或者在IDE的Gradle面板处找到sonarqube任务双击执行.执行完成后就访问SonarQube页面插件扫描的结果.例如扫描Android-NativeLogger得到如下结果.

##Jenkins 构建扫描任务

首先建立一个FreeStyle Project

配置Git/SVN信息

配置好环境变量之后通过shell执行代码扫描.也可以使用SonarQube Plugin来帮助扫描.

./gradlew clean
./gradlew sonarqube

最后开启Build periodically设置为H 5 * * *, 使其每天自动执行代码扫描Job.

配置完成之后执行一次构建, 没有异常的话就可以在SonarQube的主页看到执行的结果. 之后也会每天定时构建供其他的开发测试或QA查看.

##Issue

在扫描一个代码行数超过100k的项目时出了一个问题.从错误信息上来看应该是在向SonarQube Server提交扫面信息时, 接口报了500错误.所以问题应该是出在SonarQube Server上了.

Execution failed for task ':sonarqube'.
> Error 500 on http://localhost:9000/api/ce/submit?projectKey=xxx&projectName=xxx : {"errors":[{"msg":"An error has occurred. Please contact your administrator."}]}

既然猜测是Server出了问题, 那就去查看一下Server的运行日志.日志的位置在SonarQube的路径下.日志里果然有异常信息, 将核心的错误信息摘录出来发现是在操作MySQL时包的体积超过了设定的默认值4M(1024*1024*4), 这种情况下数据库拒绝了这次操作,最终体现出来的效果就是接口返回500错误导致Scan失败.

cat /etc/sonarqube/conf/logs/web.log

Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (5727052 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.

定位到了问题就好解决了. 既然是MySQL默认设置的max_allowed_packet太小了, 那么我们就把阈值放大就行了.以root身份登录进MySQL数据库, 直接设置阈值为256M.并重启数据库服务使设置生效就可以解决这个问题.

show VARIABLES like '%max_allowed_packet%';

SET GLOBAL max_allowed_packet=268435456;

转载请注明出处:http://blog.csdn.net/l2show/article/details/55001156

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值