Jenkins构建Android项目持续集成之findbugs的使用

题外话

这篇本来和之前的系列要一起出的,但是因为中间公司要发布一个版本,给耽搁了,今天工作做完了,又闲了下来。所以就又来继续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文件,打开就是查虫结果

findbugs报告

这里可以看到总体的一些警告情况。

但是当你往下查看具体的某些问题时,会发现一些R$anim 之类的

详细报告

而在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值有哪些呢,这里可以从报告中查看得知:

BugCode

上图是Performance Category,Code列就是BugCode name的可选值。
通过过滤器的配置,我们可以个性化的定制报告了。

Jenkins配置findbugs

增加构建后操作步骤

构建后步骤

findbugs配置

看说明,该路径配置是获取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

构建命令

邮箱也相应添加findbugs报告

邮箱配置findbugs

保存配置,立即构建。如果运行正常的话,可以看到如下的报告

jenkins报告

你也可以从邮箱内容打开链接查看报告

邮箱链接

总结

至此,本系列也差不多讲完了。这套持续集成是我们公司正在用的,所以实用性还是蛮高的,用起来有很多好处,不管是对开发、测试都有很大的便利性,大大的提高了项目的质量和可控性。往大的说,它也为敏捷开发提供了可行性基础。第一次写这样的系列,有什么错的或者建议,希望能看到你的提出。

看下其他文章:
1、Jenkins构建Android项目持续集成之简介篇
2、Jenkins构建Android项目持续集成之Jenkins的安装篇
3、Jenkins构建Android项目持续集成之系统配置篇
4、Jenkins构建Android项目持续集成之创建项目
5、Jenkins构建Android项目持续集成之单元测试及代码覆盖率
6、Jenkins构建Android项目持续集成之findbugs的使用

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
您好!对于使用Jenkins进行Java项目的持续构建和部署,以下是一些基本的步骤和配置: 1. 安装Jenkins:首先,您需要安装Jenkins并确保其成功运行。可以从Jenkins官方网站下载安装程序并按照指示进行安装。 2. 配置Java环境:在Jenkins服务器上,确保已经正确安装和配置了Java开发环境。您可以通过在终端或命令提示符中运行`java -version`来验证Java环境是否正确设置。 3. 创建一个新的Jenkins Job:登录到Jenkins管理界面,点击"New Item"创建一个新的任务。选择"Freestyle project"作为项目类型。 4. 配置源代码管理:在"配置"页面的"源代码管理"部分,选择您的代码托管平台(如Git或SVN),并提供您的项目的代码仓库URL和凭据信息。 5. 配置构建触发器:在"配置"页面的"构建触发器"部分,选择适当的触发器。例如,可以选择定期构建,或者在代码提交时触发构建。 6. 配置构建步骤:在"配置"页面的"构建"部分,添加构建步骤以构建和部署您的Spring Boot项目。以下是一些常见的步骤: - 使用Maven或Gradle构建项目使用Maven或Gradle构建您的项目。您可以在"构建"部分的"添加构建步骤"中选择适当的构建工具,并提供构建命令或任务。 - 打包可执行JAR文件:使用Maven或Gradle将项目打包为可执行的JAR文件。 - 部署项目使用适当的部署工具(例如Docker、Tomcat等)将打包的JAR文件部署到目标环境。 7. 保存并触发构建:保存Jenkins任务配置,并手动触发第一次构建以验证配置是否正确。您可以单击任务页面的"立即构建"按钮来手动触发构建。 这些是基本的步骤和配置,您可以根据您的项目需求进行相应的调整和扩展。希望对您有所帮助!如果您有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值