Jenkins + Gradle 持續(xù)自動化構(gòu)建 Android(2)

本文寫怎么用 jenkins 和 shell 腳本打 QA 用的安裝包

1 . 配置 jenkins 構(gòu)建環(huán)境

打開項目-> 打開 [配置]-在 [ General ] -> [參數(shù)化構(gòu)建過程] -> 選擇 [添加參數(shù)]“Choice” 。[name] 處 輸入 “build_type”,[Choices]處輸入 “Test” 和“Release”,這些輸入不是一定的,可以根據(jù)實際情況來輸入。
比如 我們要打的包分兩種,一種是給 QA 測試用的 安裝包,會打出來兩個安裝包, Demo 環(huán)境的和正式環(huán)境的,這兩個環(huán)境的區(qū)別是連接不同的主機(jī),有不同的數(shù)據(jù)。另外一種是渠道包,會打出來幾十個安裝包,耗時比較久,一般等所有測試通過了才打渠道包。具體配置如下圖

build type.png

2 . 配置構(gòu)建腳本

在 [構(gòu)建]->選擇 [Execute shell]-> 輸入腳本

sh ./jenkins_build.sh ${BUILD_NUMBER} ${build_type} || exit -1

具體如下圖


jenkins script

3. jenkins 腳本

真正控制做構(gòu)建的就在這了。腳本如下
jenkins_build.sh, 這個腳本文件放到 project 下,jenkins 打包時就能找到這個文件。


#!/bin/sh

build_number=$1

if [ -z $build_number ]; then
    build_number=0
fi

build_type=$2

if [ -z $build_type ]; then
    build_type="Test"
fi

root_path="`dirname $0`"
root_path_prefix=${root_path}
if [ "$root_path_prefix" != "/" ]; then
    root_path="`pwd`/${root_path}"
fi
root_path="`pwd`"
echo ${root_path}
if [ ! -z "$build_number" ]  && [ ! -z "$root_path" ]; then
        rm -rf ${root_path}/output/Build_${build_number}
fi

mkdir -p ${root_path}/output/Build_${build_number}

if [ "$build_type" = "Test" ]; then
    echo ${root_path}
    ${root_path}/gradlew --no-daemon clean assembleDemo官網(wǎng)Qa -PBUILD_NUMBER=${build_number} || exit -1
    ${root_path}/gradlew --no-daemon clean assembleOnline官網(wǎng)Qa -PBUILD_NUMBER=${build_number} || exit -1
else
    ${root_path}/gradlew --no-daemon clean assembleRelease -PBUILD_NUMBER=${build_number} || exit -1
fi

這個腳本所做的就是根據(jù)環(huán)境的不同執(zhí)行不同的gradle命令。

哦,對了,這段腳本需要配合 build.gradle 使用。
還需要在 build.gralde 中添加 如下配置
這部分配置是用來打不同環(huán)境 的包的,有 本地開發(fā)用的Dev,有demo 和 online,渠道就一個官網(wǎng)。


  productFlavors {

        flavorDimensions "enviroment", "channel"

        Dev {
            dimension "enviroment"
            applicationId = ANDROID_BUILD_DEV_APP_ID
            manifestPlaceholders = [APP_NAME: 'UmuDev']
        }

        Demo {
            dimension "enviroment"
            applicationId = ANDROID_BUILD_DEMO_APP_ID
            manifestPlaceholders = [APP_NAME: 'UmuDemo']
        }

        Online {
            dimension "enviroment"
            applicationId = ANDROID_BUILD_APP_ID
            manifestPlaceholders = [APP_NAME: 'Umu']
        }

        官網(wǎng) {
            dimension "channel"
            manifestPlaceholders = [CHANNEL_NAME: 'portal']
        }
    }

以下代碼大部分功能是將 project/app/build/outpus 中打出的 apk 放到 project/output 中

 android.variantFilter { variant ->
        if (variant.buildType.name.equals('release') && variant.getFlavors().get(0).name.equals('Demo')) {
            variant.setIgnore(true);
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def buildRootDir = buildDir.getParentFile().getParentFile()
            def buildOutputRootDir = new File(buildRootDir, "output")
            def buildOutputDir = new File(buildOutputRootDir, "Build_${BUILD_NUMBER}")
            def version = defaultConfig.versionName;
            if (variant.buildType.versionNameSuffix) {
                version += variant.buildType.versionNameSuffix
            }
            def dirname = "umu-" + variant.productFlavors[0].name + "-" + variant.buildType.name + "-" + version + "-" + variant.productFlavors[1].name;

            def apkDir = new File(buildOutputDir, dirname)
            output.outputFile = new File(apkDir, dirname + ".apk");

            if (variant.buildType.minifyEnabled) {
                variant.assemble.doLast {
                    copy {
                        from variant.mappingFile
                        into "${apkDir.absolutePath}"
                        rename { String fileName ->
                            "${dirname}_mapping.txt"
                        }
                    }
                }
            }
        }
    }

4. 打包

配置好之后點擊 [構(gòu)建] 然后選 Test ,編譯完成后可以看到 output 中多了倆文件,如下圖。


5 未完待續(xù)

下面會寫上傳安裝包到蒲公英進(jìn)行分發(fā)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容