Jenkins构建Android项目持续集成之findbugs的使用
2017-01-22 20:05
941 查看
Jenkins构建Android项目持续集成之findbugs的使用
http://itfish.net/article/53357.html http://itfish.net/article/53357.html http://itfish.net/article/53357.html
这篇本来和之前的系列要一起出的,但是因为中间公司要发布一个版本,给耽搁了,今天工作做完了,又闲了下来。所以就又来继续jenkins构建Android项目持续集成系列的findbugs篇。
关于findbugs的介绍,可以自行百度下,这里贴下百度百科的介绍。findbugs是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。这组缺陷模式是可配置的,通过配置,可以过滤掉一些我们不想或不需要检测的问题。
理论的部分就不多阐述了,我们直接来看看项目中怎么使用findbugs吧。
首先,在build.gradle引入findbugs插件
然后,添加一个task
注意:凡是task有依赖connectedAndroidTest的,都需要连接着模拟器或者真机,否则会报错
以下是我build.gradle的内容:
然后在Terminal输入命令
执行成功之后,会在项目根目录下build\reports\findbugs生成findbugs.html文件,打开就是查虫结果
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/1848ba6179dad5a3d6bdcd1861a53b61.jpg)
这里可以看到总体的一些警告情况。
但是当你往下查看具体的某些问题时,会发现一些R$anim 之类的
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/d3bfba6b4abbee1c30ab714e2dd3ac70.jpg)
而在Android中,R文件是自动生成,我们查虫是不需要检查该文件的。这时候过滤配置就派上用场了。
在项目根目录下新建一个findbug_filter.xml文件,内容如下
上面match到的是要过滤掉,而不是要捕捉的,所以我们过滤掉了R文件、manifest文件和测试用例类。
相应的,我们需要修改gradle配置,让过滤器生效,在task findbugs 配置如下:
然后在Teminal再执行gradlew findbugs,重新查看报告,之前的那些关于‘R$’的警告都没有了,说明过滤器生效了。
再者,我们可能有这样的需求,可能每个人的查看报告的侧重点不同,所以想,报告是否可以更个性化一些。同样的,我们可以根据过滤器实现。
其中,
是以一大类bug相关的来设置过滤器的,category的值有哪些呢?有PERFORMANCE(性能问题)、CORRECTNESS(一般正确性问题)、MT_CORRECTNESS(多线程正确性问题)、MALICIOUS_CODE(恶意代码),这四大类。
而BugCode是category类下的细分,而它们的name值有哪些呢,这里可以从报告中查看得知:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/6a513c62f9a7d2f3148b645b28deb42a.jpg)
上图是Performance Category,Code列就是BugCode name的可选值。
通过过滤器的配置,我们可以个性化的定制报告了。
增加构建后操作步骤
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/c92a2df01e6069b211ec1657e385fab6.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/dc9897c1f364d452601effc54680cabb.jpg)
看说明,该路径配置是获取xml文件的,但是,之前我们获取到的是html文件,怎么办?所以,这里我们要修改一下gradle配置。
我们将xml.enabled设置为true,html.enabled设置为false。
然后,构建命令也要添加findbugs
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/c9af321f1f4d393008279d96aa7ce7e1.jpg)
邮箱也相应添加findbugs报告
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/32b4dc735c5b1bed400a8c522e7b0117.jpg)
保存配置,立即构建。如果运行正常的话,可以看到如下的报告
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/4acf6957727b2136713a2052a1e883fb.jpg)
你也可以从邮箱内容打开链接查看报告
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/58c406af65acdbbdec1cba4c3b4ac917.jpg)
至此,本系列也差不多讲完了。这套持续集成是我们公司正在用的,所以实用性还是蛮高的,用起来有很多好处,不管是对开发、测试都有很大的便利性,大大的提高了项目的质量和可控性。往大的说,它也为敏捷开发提供了可行性基础。第一次写这样的系列,有什么错的或者建议,希望能看到你的提出。
看下其他文章:
1、Jenkins构建Android项目持续集成之简介篇
2、Jenkins构建Android项目持续集成之Jenkins的安装篇
3、Jenkins构建Android项目持续集成之系统配置篇
4、Jenkins构建Android项目持续集成之创建项目
5、Jenkins构建Android项目持续集成之单元测试及代码覆盖率
6、Jenkins构建Android项目持续集成之findbugs的使用
推荐文章iOS
新特性分列式 之 iOS 5.x - 主要内容:自动引用计数、故事板、控件自定义呈现、容第8章6节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动Monk[置顶]
Swift 2.0学习笔记(Day 25)——类和结构体定义Cocos2D:塔防游戏制作之旅(十六)Android开发技巧——自定义控件之使用style
http://itfish.net/article/53357.html http://itfish.net/article/53357.html http://itfish.net/article/53357.html
题外话
这篇本来和之前的系列要一起出的,但是因为中间公司要发布一个版本,给耽搁了,今天工作做完了,又闲了下来。所以就又来继续jenkins构建Android项目持续集成系列的findbugs篇。
Findbugs简介
关于findbugs的介绍,可以自行百度下,这里贴下百度百科的介绍。findbugs是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。这组缺陷模式是可配置的,通过配置,可以过滤掉一些我们不想或不需要检测的问题。
findbugs在gradle中的配置
理论的部分就不多阐述了,我们直接来看看项目中怎么使用findbugs吧。 首先,在build.gradle引入findbugs插件
apply plugin: 'findbugs'
然后,添加一个task
task findbugs(type: FindBugs,dependsOn:"connectedAndroidTest") {// ignoreFailures = true effort = "default" reportLevel = "medium" //这里填写项目classes目录 classes = files("${project.rootDir}/andbase-core/build/intermediates/classes") source = fileTree('src/main/java') classpath = files() reports { //只能开启一个 xml.enabled = false html.enabled = true } }
注意:凡是task有依赖connectedAndroidTest的,都需要连接着模拟器或者真机,否则会报错
以下是我build.gradle的内容:
apply plugin: 'com.android.library'
//代码覆盖率插件
apply plugin: 'jacoco'
//findbugs
apply plugin: 'findbugs'
android {
compileSdkVersion 22
buildToolsVersion '22.0.1'
defaultConfig {
minSdkVersion 8
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug{
testCoverageEnabled true
}
}
lintOptions {
abortOnError false
}
packagingOptions {
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
}
jacoco{
version "0.7.4.201502262128"
}
}
task findbugs(type: FindBugs,dependsOn:"connectedAndroidTest") {// ignoreFailures = true effort = "default" reportLevel = "medium" //这里填写项目classes目录 classes = files("${project.rootDir}/andbase-core/build/intermediates/classes") source = fileTree('src/main/java') classpath = files() reports { //只能开启一个 xml.enabled = false html.enabled = true } }
task jacocoTestReport(type:JacocoReport){//,dependsOn:"connectedAndroidTest"
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
reports{
xml.enabled = false
html.enabled = true
csv.enabled = false
}
classDirectories = fileTree(
dir : "$buildDir/intermediates/classes/debug",
excludes : [
'**/*Test.class',
'**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
'**/Manifest*.*'
]
)
def coverageSourceDirs = ['src/main/java']
additionalSourceDirs = files(coverageSourceDirs)
sourceDirectories = files(coverageSourceDirs)
additionalClassDirs = files(coverageSourceDirs)
executionData = files("$buildDir/outputs/code-coverage/connected/coverage.ec")
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.1'
}
然后在Terminal输入命令
gradlew findbugs
执行成功之后,会在项目根目录下build\reports\findbugs生成findbugs.html文件,打开就是查虫结果
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/1848ba6179dad5a3d6bdcd1861a53b61.jpg)
这里可以看到总体的一些警告情况。
但是当你往下查看具体的某些问题时,会发现一些R$anim 之类的
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/d3bfba6b4abbee1c30ab714e2dd3ac70.jpg)
而在Android中,R文件是自动生成,我们查虫是不需要检查该文件的。这时候过滤配置就派上用场了。
findgbugs过滤器配置
在项目根目录下新建一个findbug_filter.xml文件,内容如下<?xml version="1.0" encoding="UTF-8"?> <FindBugsFilter> <Match> <!-- ignore all issues in resource generation --> <Class name="~.*\.R\$.*"/> </Match> <Match> <Class name="~.*\.Manifest\$.*"/> </Match> <Match> <Class name="~.*\.*Test" /> <!-- test classes are suffixed by 'Test' --> <Not> <Bug code="IJU" /> <!-- 'IJU' is the code for bugs related to JUnit test code --> </Not> </Match> </FindBugsFilter>
上面match到的是要过滤掉,而不是要捕捉的,所以我们过滤掉了R文件、manifest文件和测试用例类。
相应的,我们需要修改gradle配置,让过滤器生效,在task findbugs 配置如下:
task findbugs(type: FindBugs,dependsOn:"connectedAndroidTest") {// ignoreFailures = true effort = "default" reportLevel = "medium" //过滤器 excludeFilter = new File("${project.rootDir}/findbug_filter.xml") //这里填写项目classes目录 classes = files("${project.rootDir}/andbase-core/build/intermediates/classes") source = fileTree('src/main/java') classpath = files() reports { //只能开启一个 xml.enabled = false html.enabled = true } }
然后在Teminal再执行gradlew findbugs,重新查看报告,之前的那些关于‘R$’的警告都没有了,说明过滤器生效了。
再者,我们可能有这样的需求,可能每个人的查看报告的侧重点不同,所以想,报告是否可以更个性化一些。同样的,我们可以根据过滤器实现。
<?xml version="1.0" encoding="UTF-8"?> <FindBugsFilter> <Match> <!-- ignore all issues in resource generation --> <Class name="~.*\.R\$.*"/> </Match> <Match> <Class name="~.*\.Manifest\$.*"/> </Match> <Match> <Class name="~.*\.*Test" /> <!-- test classes are suffixed by 'Test' --> <Not> <Bug code="IJU" /> <!-- 'IJU' is the code for bugs related to JUnit test code --> </Not> </Match> <!--过滤掉一些bug--> <Match> <!--1、性能问题--> <!--<Bug category="PERFORMANCE" />--> <!--2、一般正确性问题--> <!--<Bug category="CORRECTNESS" />--> <!--3、多线程正确性问题--> <!--<Bug category="MT_CORRECTNESS" />--> <!--4、恶意代码,有可能成为攻击点--> <!--<Bug category="MALICIOUS_CODE" />--> <Or> <!--Field names should start with a lower case letter--> <BugCode name="Nm"/> <!--Method ignores exceptional return value or Return value of method without side effect is ignored--> <BugCode name="RV"/> <!--国际化--> <BugCode name="Dm"/> </Or> </Match> </FindBugsFilter>
其中,
<Bug category="MT_CORRECTNESS" />
是以一大类bug相关的来设置过滤器的,category的值有哪些呢?有PERFORMANCE(性能问题)、CORRECTNESS(一般正确性问题)、MT_CORRECTNESS(多线程正确性问题)、MALICIOUS_CODE(恶意代码),这四大类。
<BugCode name="Dm"/>
而BugCode是category类下的细分,而它们的name值有哪些呢,这里可以从报告中查看得知:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/6a513c62f9a7d2f3148b645b28deb42a.jpg)
上图是Performance Category,Code列就是BugCode name的可选值。
通过过滤器的配置,我们可以个性化的定制报告了。
Jenkins配置findbugs
增加构建后操作步骤![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/c92a2df01e6069b211ec1657e385fab6.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/dc9897c1f364d452601effc54680cabb.jpg)
看说明,该路径配置是获取xml文件的,但是,之前我们获取到的是html文件,怎么办?所以,这里我们要修改一下gradle配置。
task findbugs(type: FindBugs,dependsOn:"connectedAndroidTest") {// ignoreFailures = true effort = "default" reportLevel = "medium" //过滤器 excludeFilter = new File("${project.rootDir}/findbug_filter.xml") //这里填写项目classes目录 classes = files("${project.rootDir}/andbase-core/build/intermediates/classes") source = fileTree('src/main/java') classpath = files() reports { //只能开启一个 xml.enabled = true html.enabled = false } }
我们将xml.enabled设置为true,html.enabled设置为false。
然后,构建命令也要添加findbugs
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/c9af321f1f4d393008279d96aa7ce7e1.jpg)
邮箱也相应添加findbugs报告
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/32b4dc735c5b1bed400a8c522e7b0117.jpg)
保存配置,立即构建。如果运行正常的话,可以看到如下的报告
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/4acf6957727b2136713a2052a1e883fb.jpg)
你也可以从邮箱内容打开链接查看报告
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/21/58c406af65acdbbdec1cba4c3b4ac917.jpg)
总结
至此,本系列也差不多讲完了。这套持续集成是我们公司正在用的,所以实用性还是蛮高的,用起来有很多好处,不管是对开发、测试都有很大的便利性,大大的提高了项目的质量和可控性。往大的说,它也为敏捷开发提供了可行性基础。第一次写这样的系列,有什么错的或者建议,希望能看到你的提出。看下其他文章:
1、Jenkins构建Android项目持续集成之简介篇
2、Jenkins构建Android项目持续集成之Jenkins的安装篇
3、Jenkins构建Android项目持续集成之系统配置篇
4、Jenkins构建Android项目持续集成之创建项目
5、Jenkins构建Android项目持续集成之单元测试及代码覆盖率
6、Jenkins构建Android项目持续集成之findbugs的使用
推荐文章iOS
新特性分列式 之 iOS 5.x - 主要内容:自动引用计数、故事板、控件自定义呈现、容第8章6节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动Monk[置顶]
Swift 2.0学习笔记(Day 25)——类和结构体定义Cocos2D:塔防游戏制作之旅(十六)Android开发技巧——自定义控件之使用style
相关文章推荐
- Jenkins构建Android项目持续集成之findbugs的使用
- Jenkins构建Android项目持续集成之findbugs的使用
- Jenkins构建Android项目持续集成之findbugs的使用
- Jenkins构建Android项目持续集成之简介篇
- Jenkins构建Android项目持续集成之单元测试及代码覆盖率
- Docker+Jenkins持续集成环境(2)使用docker+jenkins构建nodejs前端项目
- Jenkins构建Android项目持续集成之创建项目
- Jenkins构建Android项目持续集成之Jenkins的安装篇
- Jenkins构建Android项目持续集成之单元测试及代码覆盖率
- Jenkins构建Android项目持续集成之单元测试及代码覆盖率
- Jenkins构建Android项目持续集成之系统配置篇
- Jenkins构建Android项目持续集成之创建项目
- Docker+Jenkins持续集成环境(2)使用docker+jenkins构建nodejs前端项目
- Jenkins构建Android项目持续集成之Jenkins的安装篇
- Jenkins构建Android项目持续集成之系统配置篇
- 使用Jenkins进行android项目的自动构建(3)
- jenkins 持续集成, 使用sbt多项目同时package
- 使用Jenkins进行android项目的自动构建(2)
- 在Redhat上为.Net 项目构建基于Jenkins + Github + Mono 的持续集成环境
- 使用Hudson持续集成Android项目