美文网首页JenkinsGradle
Jenkins 参数化构建(六)

Jenkins 参数化构建(六)

作者: Mr_不靠谱_先森 | 来源:发表于2017-09-14 11:27 被阅读2932次

    文章目录

    参数化构建的意思为 使用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对上述参数进行对应配置。

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

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

    Dynamic Parameter


    String Parameter


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


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

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


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


    相关文章

      网友评论

        本文标题:Jenkins 参数化构建(六)

        本文链接:https://www.haomeiwen.com/subject/zbzrsxtx.html