文章目錄
參數化構建的意思為 使用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對上述參數進行對應配置。
找到 參數化構建過程選項→打勾
選擇→添加參數
選項參數使用 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 ,最后效果如下圖。