Jenkins 參數(shù)化構(gòu)建(六)


文章目錄

參數(shù)化構(gòu)建的意思為 使用Jenkins構(gòu)建打包的時候動態(tài)的修改gradle文件里面的配置

使用動態(tài)構(gòu)建時,我們需要使用到gradle文件和properties文件配置需要使用的自定義屬性.properties文件

## Jenkins參數(shù)化構(gòu)建使用的變量
## APP version name
APP_VERSION=4.2.2
# 是否為 Jenkins 編譯, 默認(rèn)是 false
IS_JENKINS=false
# 構(gòu)建時間
BUILD_TIME=''
# 渠道名稱
PRODUCT_FLAVORS=website
# 服務(wù)器生構(gòu)建路徑
BUILD_PATH_JENKINS=F:\\DownloadApk
BUILD_PATH_LOCAL=F:\\AS_PROJECT\\TestJenkins
# app名稱
APPNAME=cdelphone

.gradle文件

apply plugin: 'com.android.application'


//獲取當(dāng)前時間
def getDate() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("GMT+08:00"))
}

//打包的一些參數(shù)
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' // 防止在發(fā)布的時候出現(xiàn)因MissingTranslation導(dǎo)致Build Failed!
    }

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

    //簽名相關(guān)
    signingConfigs {
        myConfig {
            storePassword "***"
            keyAlias "***"
            keyPassword "***"
            //由于本地打包使用的是本機(jī)上的KeyStore
            //而Jenkins打包用的是服務(wù)器上的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 服務(wù)器輸出路徑
                    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文件中需要 一 一 與之對應(yīng)。下面我們進(jìn)入到Jenkins對上述參數(shù)進(jìn)行對應(yīng)配置。

image.png

找到 參數(shù)化構(gòu)建過程選項(xiàng)→打勾

選擇→添加參數(shù)
選項(xiàng)參數(shù)使用 Choice
字符輸入?yún)?shù)使用 String Parameter
時間參數(shù)使用 Dynamic Parameter在添加參數(shù)時,配置Name的值必須與.properties文件中定義的參數(shù)名稱相同。我們需要用到的僅這三個,具體輸入如下圖。Choice

Dynamic Parameter


String Parameter


將需要的參數(shù)按類別添加即可。
參數(shù)引用找到上面我們使用Gradle 插件的 Invoke Gradle script修改tasks命令,應(yīng)用上面的參數(shù),并勾選Pass job parameters as Gradle properties選項(xiàng)。如下圖。


PRODUCT_FLAVORS
和BUILD_TYPE
即我們上面配置的參數(shù),務(wù)必保持一致。點(diǎn)擊保存,回到項(xiàng)目首頁。就可以看到,原先的立即構(gòu)建已經(jīng)變成了Build with Parameter點(diǎn)擊參數(shù)構(gòu)建,就可以看到如下上面我們配置的參數(shù)。等待構(gòu)建完成,前往在.Gradle文件中配置的路徑中即可找到我們配置的命名apk。
另外提一點(diǎn),更換名稱。因?yàn)樵皇菢?gòu)建編號,沒有識別度。相信你從無參構(gòu)建時就想更換了。

進(jìn)入項(xiàng)目配置找到→構(gòu)建環(huán)境→勾選Set build Name 設(shè)置參數(shù)


重新打包,如上圖我們使用了BUILD_NUMBER 自帶參數(shù),以及 APPNAME、APP_VERSION、BUILD_TYPE ,最后效果如下圖。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,536評論 25 708
  • 如果你并不急于放到服務(wù)器上,只是想玩玩這個東西。你可以先下載好這兩個下文用到的包。下載Tomcat9.0.zip下...
    橘子周二閱讀 30,412評論 58 70
  • JenKins 是什么? 理解:是一個集成各種插件,通過配置、管理 的本地Web,去自動化打包Android、IO...
    JxMY閱讀 3,348評論 0 0
  • 我們不趕時間,所以總是很念舊,美好的回憶,我們愿意拿出來品味分享,難過的過去,我們也選擇埋在心底,不管是開花還是結(jié)...
    小施的音樂盒子閱讀 472評論 1 2