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 

查看結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章