文章目录
参数化构建的意思为 使用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 ,最后效果如下图。