Jenkins 参数化构建(六)

文章目录

参数化构建的意思为 使用Jenkins构建打包的时候动态的修改gradle文件里面的配置

使用动态构建时,我们需要使用到gradle文件和properties文件配置需要使用的自定义属性.properties文件

## Jenkins参数化构建使用的变量
## APP version name
APP_VERSION=4.2.2
# 是否为 Jenkins 编译, 默认是 false
IS_JENKINS=false
# 构建时间
BUILD_TIME=''
# 渠道名称
PRODUCT_FLAVORS=website
# 服务器生构建路径
BUILD_PATH_JENKINS=F:\\DownloadApk
BUILD_PATH_LOCAL=F:\\AS_PROJECT\\TestJenkins
# app名称
APPNAME=cdelphone

.gradle文件

apply plugin: 'com.android.application'


//获取当前时间
def getDate() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("GMT+08:00"))
}

//打包的一些参数
ext {
    TestVersion = "1.0.0"
    TestVersionCode = "100"
}

android {
    compileSdkVersion 21
    buildToolsVersion '24.0.2'

    defaultConfig {
        applicationId "com.cdel.chinaacc.daytest"
        versionCode 8
        versionName APP_VERSION
        minSdkVersion 15
        targetSdkVersion 16
        multiDexEnabled true
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "web"]
    }

    lintOptions {
        abortOnError false
        checkReleaseBuilds false
        disable 'MissingTranslation' // 防止在发布的时候出现因MissingTranslation导致Build Failed!
    }

    packagingOptions {
        exclude 'AndroidManifest.xml'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'local.properties'
    }
    dexOptions {
        javaMaxHeapSize "4g"
    }

    //签名相关
    signingConfigs {
        myConfig {
            storePassword "***"
            keyAlias "***"
            keyPassword "***"
            //由于本地打包使用的是本机上的KeyStore
            //而Jenkins打包用的是服务器上的KeyStore
            //两个路径不一样
            if ("true".equals(IS_JENKINS)) {
                storeFile file('./keystore/mykey')
            } else {
                storeFile file('./keystore/mykey')
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            zipAlignEnabled true
            shrinkResources true
            signingConfig signingConfigs.myConfig
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
        }
        debug {
            signingConfig signingConfigs.myConfig
//            zipAlignEnabled true
//            minifyEnabled false    // 是否混淆
//            shrinkResources false  // 是否去除无效的资源文件
//            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    //打包输出apk名称
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def apk = output.outputFile
            if (apk != null && apk.name.endsWith('.apk')) {
                //新名字
                def fileName
                //时间戳
                def timeNow
                //输出文件夹
                def outDirectory
                //是否为Jenkins打包,输出路径不同
                if ("true".equals(IS_JENKINS)) {
                    //时间戳
                    timeNow = BUILD_TIME
                    //输出文件夹 BUILD_PATH 服务器输出路径
                    outDirectory = BUILD_PATH_JENKINS
                    fileName = APPNAME + "_V${variant.versionName}_${variant.buildType.name}_${variant.productFlavors[0].name}.apk"
                    output.outputFile = new File(outDirectory + "/" + timeNow, fileName)
                } else {
                    //时间戳
                    timeNow = getDate()
                    outDirectory = BUILD_PATH_LOCAL
                    fileName = APPNAME + "_V${variant.versionName}_${variant.buildType.name}_${variant.productFlavors[0].name}.apk"
                    output.outputFile = new File(outDirectory + "/" + timeNow, fileName)
                }

            }
        }
    }

    // 渠道列表
    productFlavors {
        m91zhushou {}
        anzhuoshichang {}
        anzhi {}
        tencent {}
        mumayi {}
        wandoujia {}
        m360shouji {}
        baidu {}
        xiaomi {}
        meizu {}
        huawei {}
        web {}
        zonghe {}
    }

    // 指定渠道名
    productFlavors .all {
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
}

dependencies {
    compile project(':cdelframelib')
}

}


上面我们配置了、渠道包、签名文件、版本号、apk命名、apk输出文件夹,在.properties文件中需要 一 一 与之对应。下面我们进入到Jenkins对上述参数进行对应配置。

《Jenkins 参数化构建(六)》 image.png

找到
参数化构建过程选项→打勾

《Jenkins 参数化构建(六)》

选择→添加参数
选项参数使用 Choice
字符输入参数使用 String Parameter
时间参数使用 Dynamic Parameter在添加参数时,配置Name的值必须与.properties文件中定义的参数名称相同。我们需要用到的仅这三个,具体输入如下图。Choice

《Jenkins 参数化构建(六)》

Dynamic Parameter

《Jenkins 参数化构建(六)》

String Parameter

《Jenkins 参数化构建(六)》

将需要的参数按类别添加即可。
参数引用找到上面我们使用Gradle 插件的 Invoke Gradle script修改tasks命令,应用上面的参数,并勾选Pass job parameters as Gradle properties选项。如下图。

《Jenkins 参数化构建(六)》

PRODUCT_FLAVORS
和BUILD_TYPE
即我们上面配置的参数,务必保持一致。点击保存,回到项目首页。就可以看到,原先的立即构建已经变成了Build with Parameter点击参数构建,就可以看到如下上面我们配置的参数。等待构建完成,前往在.Gradle文件中配置的路径中即可找到我们配置的命名apk。
另外提一点,更换名称。因为原命名只是构建编号,没有识别度。相信你从无参构建时就想更换了。

《Jenkins 参数化构建(六)》

进入项目配置找到→构建环境→勾选Set build Name 设置参数

《Jenkins 参数化构建(六)》

重新打包,如上图我们使用了BUILD_NUMBER 自带参数,以及 APPNAME、APP_VERSION、BUILD_TYPE ,最后效果如下图。

《Jenkins 参数化构建(六)》

    原文作者:Mr_不靠谱_先森
    原文地址: https://www.jianshu.com/p/ffcc4c1eec99
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞