分享

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

 冬O_O煦 2017-05-16

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, MySQLOracle. 这篇文章就介绍一下在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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

MySQL配置完成之后去SonarQube的官网下载最新版本或者LTS版.将压缩包内部的文件压缩到/etc/sonarqube下.并开启SonarQube.

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

开启成功之后就可以在浏览器中访问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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

配置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}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

因为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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

配置Gradle SonarQube Scanner

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

buildscript {
  repositories {
    maven {
      url "https://plugins./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"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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

project(":sociallib") {
    sonarqube {
        skipProject = true
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

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

Jenkins 构建扫描任务

首先建立一个FreeStyle Project

配置Git/SVN信息

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

./gradlew clean
./gradlew sonarqube
  • 1
  • 2
  • 1
  • 2

最后开启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."}]}
  • 1
  • 2
  • 1
  • 2

既然猜测是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.
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

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

show VARIABLES like '%max_allowed_packet%';

SET GLOBAL max_allowed_packet=268435456;
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多