1. 程式人生 > >Android使用Jenkins持續整合自動化打包

Android使用Jenkins持續整合自動化打包

一、使用shell自動打包apk

命令呼叫android專案根目錄下的gradlew來完成打包

新建AndroidBuild.sh命令檔案,並配置檔案內容如下

#!/bin/bash 
	#version.properties檔案所在的目錄
	path='/Users/mac/androidProject/TestMaster'
	content=$(cat ${path}/version.properties)
	echo "讀取內容:$content"
	#讀取檔案的VERSION_CODE對應的value,儲存versionCode變數
	versionCode=`grep VERSION_CODE ${path}version.properties|cut -d'=' -f2`
	#將versionCode+1,得到累加後的addVersionCode
	addVersionCode=`expr $versionCode + 1`
	echo "versionCode====$versionCode"
	# 將addVersionCode重新累加賦值給檔案的VERSION_CODE
	sed -i "s#^VERSION_CODE=.*#VERSION_CODE=${addVersionCode}#g"  ${path}version.properties
	content=$(cat ${path}version.properties)
	addVersionCode=`grep VERSION_CODE ${path}version.properties|cut -d'=' -f2`
	echo "替換之後====$content"
	echo "addVersionCode====$addVersionCode"
	#判斷versionCode是否累加成功, -gt標識大於返回true
	if [ $addVersionCode -gt $versionCode ]
	then
	# 打包apk
	#gradlew 對應目錄
	BUILD_TOOL_PATH='/Users/mac/androidProject/TestMaster'
	echo "開始打包..."
	#cd $BUILD_TOOL_PATH && ./gradlew assembleinsectRelease
	 cd $BUILD_TOOL_PATH && ./gradlew assembleDebug
	openRootPath='/Users/mac/androidProject/TestMaster/app'
	#打包完成開啟包所在的目錄,當然,程式裡面的這面絕對路徑請替換成你對應的路徑,不然程式執行不會成功
	explorer $openRootPath'\build\outputs\apk'
	else
	echo "error : versionCode未加1"
	fi

其中需要打包debug版本需要配置gradlew assembleDebug/assembleinsectDebug,

打包release版本需要配置gradlew assembleRelease/assembleinsectRelease

使用時cd到AndroidBuild.sh資料夾,使用命令sh AndroidBuild.sh

二、Gradle配置

首先需要在根目錄下新建versionCode配置檔案用於記錄打包的版本號,舉例新建version.properties,檔案內容VERSION_CODE=1

配置主Module的Gradle檔案,檔案內容可簡單配置如下

apply plugin: 'com.android.application'

def getVersionCode() {
    def versionFile = file('../version.properties')
    if (versionFile.canRead()) {
        def Properties versionProps = new Properties()
        versionProps.load(new FileInputStream(versionFile))
        def versionCode = versionProps['VERSION_CODE'].toInteger()
        def runTasks = gradle.startParameter.taskNames //僅在assembleRelease任務是增加版本號,其他渠道包在此分別配置
//        if ('assembleDebug' in runTasks|'assembleinsectDebug' in runTasks) {
            versionProps['VERSION_CODE'] = (++versionCode).toString()
            versionProps.store(versionFile.newWriter(), null)
//        }
        return versionCode
    } else {
        throw new GradleException("Could not find version.properties!")
    }
}
android {
    def currentVersionCode = getVersionCode()
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.liuxingyu.testmaster"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode currentVersionCode
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    signingConfigs {
        release {
            storeFile file('/Users/mac/androidProject/TestMaster/app/release.keystore') //絕對路徑
            storePassword "jure123456"
            keyAlias "key0"
            keyPassword "jure123456"
        }
    }
    buildTypes {
        debug {
            minifyEnabled false
            shrinkResources false
            zipAlignEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            minifyEnabled true
            shrinkResources true
            zipAlignEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

二、使用Jenkins持續整合

待續。。。