Jenkins实现安卓持续集成、代码覆盖率、白盒测试

环境:windows jdk1.8

一、Jenkjins服务器的搭建

     官网地址: https://jenkins.io/download/ 或者 百度网盘Jenkins下载链接   提取码:x49z

     安装插件的环境是在外网,所以需要大家科学上网


    

二、Jenkins配置-

     1 点击Configure System 

        第一个是sdk的路径,相应的,在计算机环境变量也需要配置。ANDROID_HOME

        第二个是解决文件路径过长,这个环境变量也需要配置-可忽略

     

    2 点击Global Tool Configuration配置gradle

   

    3 点击Manage Plugins下载HTML Publisher plugin 以及 JaCoCo plugin 后面会介绍

三、Jenkins构建项目

    1 构建一个自由风格的项目

    2 配置git/subversion的path@HEAD(@HEAD代表拉取最新代码,一定要配置)

    3    构建步骤- 实际上就是执行gradle的命令,没啥意思。 比如打个Debug版的360渠道包 assemble_360Debug。

         这部分的指令在As右边的Gradle都可以查看到

      4增加构建步骤- 如果没有下载插件的,是看不到下面的选择项-

        Html插件- 将本地的build目录下reports的测试结果,以及代码覆盖率拷贝到相应的目录(这里的目录需要你先在As上跑成功,才能有具体的路径,渠道包的更不同,所以要注意,所以给不了绝对路径)

        jacoco- 代码覆盖率。 AS中需要进行配置

         

      

     Jenkins的配置就是这样,其实真的很简单。

  四、下面贴下build文件的jacoco配置

  

apply plugin: 'jacoco'

jacoco {
    version "0.7.9"
}

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.huke.eg"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "V1.0"
        flavorDimensions "default"
        multiDexEnabled = true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        //占位符
        manifestPlaceholders = [
                UMENG_CHANNEL_VALUE: "huke",
        ]
    }
    
    //渠道
    productFlavors {
        huke {}
        //批量配置
        productFlavors.all { flavor ->
            flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        }
    }

    signingConfigs {
        release {
            storeFile
            storePassword
            keyAlias
            keyPassword
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }

    getSigningProperties()

    //自定义输出包名的设置
    applicationVariants.all { variant ->
        variant.outputs.all {
            // 输出apk名称为v1.0_tencent.apk
            def fileName = "${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
            outputFileName = fileName
        }
    }

    //其他设置
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
            shrinkResources false
            testCoverageEnabled = true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        //输出类型
        applicationVariants.all {
            //判断是release还是debug版本
            def buildType = it.buildType.name
            //获取当前时间的"YYYY-MM-dd"格式。
            def createTime = new Date().format("YYYY-MM-dd", TimeZone.getTimeZone("GMT+08:00"))
            //如果是正式包,将其输入到指定文件夹
            if (buildType == "release") {
                it.getPackageApplication().outputDirectory = new File('E:\\out_apk' + "/${createTime}")
            }
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    lintOptions {
        abortOnError false
    }

}

//读取签名配置文件
def getSigningProperties() {
    def propFile = file('signing.properties')
    if (propFile.canRead()) {
        def Properties props = new Properties()
        props.load(new FileInputStream(propFile))
        if (props != null && props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') &&
                props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) {

            android.signingConfigs.release.storeFile = file(props['STORE_FILE'])
            android.signingConfigs.release.storePassword = props['STORE_PASSWORD']
            android.signingConfigs.release.keyAlias = props['KEY_ALIAS']
            android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']
        } else {
            println 'signing.properties found but some entries are missing'
            android.buildTypes.release.signingConfig = null
        }
    } else {
        println 'signing.properties not found'
        android.buildTypes.release.signingConfig = null
    }
}

task jacocoTestReport(type: JacocoReport) {
    //gradlew jacocoTestReport
    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",
    )
    def coverageSourceDirs = ['src/main/java']
    additionalSourceDirs = files(coverageSourceDirs)
    sourceDirectories = files(coverageSourceDirs)
    additionalClassDirs = files(coverageSourceDirs)
    executionData = files("$buildDir/outputs/code-coverage/connected/coverage.ec")
}

  signing.properties文件内容-放到keystore的同级目录-app的下面

STORE_FILE = /huke.jks
STORE_PASSWORD = 123456
KEY_ALIAS = huke
KEY_PASSWORD = 123456

然后assembleRealse-打包输出到E盘out_apk目录下面了

 

最后分享下我自己写的脚本打包-build.bat 文件名

#快速编译打包apk脚本
@echo off
chcp 65001
cd 你的项目目录
gradlew assembleRelease 

查看结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值