Android Jenkins下使用gradle打包
环境配置
- 安装Jenkins;
- 在Jenkins插件管理中安装gradle插件,图方便的话就使用自动安装,我安装的是gradle4.6,配合Android gradle插件3.2.1,一般打包源码都是从git或svn上拉取的,所以再安装一下git和svn插件。Jenkins有很多方便的插件,比如发送邮件,文件上传到蒲公英等,真的很厉害,有木有;
- 在系统设置里面新增一个环境变量ANDROID_HOME,对应到服务器的sdk路径,jdk服务器配置过的话这里可以不配置;
任务配置
- 新建一个自由风格的项目;
- 源码管理这项选择svn,输入地址和账号,其他配置默认就行;
- 构建—添加构建步骤—Invoke Gradle script,旋转Invoke Gradle,然后再gradle Version选择需要的版本
4.tasks构建命令app:clean
app:assemblePreRelease --stacktrace
assemblePreRelease对应Android studio中的buildtype - 点击高级,勾选Force GRADLE_USER_HOME to use workspace,使用项目的构建配置进行构建,这里有个坑,不勾选的话会包appt2资源异常。
- 配置到第5就可以打包了,只是打包路径要在app的gradle中配置;
- 构建后归档 apk/*.apk,这样配置后构建成功会打开这个目录;
gradle配置
将构建需要用到的参数配置到gradle.properties文件中,比如AppVersionName,AppVersionCode,推送key,url等
AppVersionName=1.1.0
AppVersionCode=157
#test 测试平台,release发布包。
BuildType=release
#个推配置
#测试key
GETUI_APP_ID_TEST = xxxxxxxxxxxxxxxxxxxxxxx
GETUI_APP_KEY_TEST = xxxxxxxxxxxxxxxxxxxxxxxxxx
GETUI_APP_SECRET_TEST = xxxxxxxxxxxxxxxxxxxxxx
#正式
GETUI_APP_ID_RELEASE = xxxxxxxxxxxxxxxxxxxxxxxxx
GETUI_APP_KEY_RELEASE = xxxxxxxxxxxxxxxxxx
GETUI_APP_SECRET_RELEASE = xxxxxxxxxxxxxxx
#厂商推送配置
#小米
XIAOMI_APP_ID = xxxxxxxxxxx
XIAOMI_APP_KEY = xxxxxxxxxxxx
#魅族
MEIZU_APP_ID = xxxxxxxxxxxx
MEIZU_APP_KEY = xxxxxxxxxxxxxxxx
#华为
HUAWEI_APP_ID = xxxxxxxxxxxxxx
#url 这里因为url要配置到BuildConfig中使用,所以值加上了“”
BASE_COMMON_URL_TEST = "https://mstest.xxxx.cn"
BASE_COMMON_URL_RELEASE = "https://ms.xxxxxx.cn"
app build.gradle
apply plugin: 'com.android.application'
def getDate() {
def date = new Date()
def formattedDate = date.format('yyyyMMddHHmm')
return formattedDate
}
android {
compileSdkVersion 26
useLibrary 'org.apache.http.legacy'
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "xxxxxxxxxx"
minSdkVersion 16
targetSdkVersion 26
versionCode = Integer.parseInt(rootProject.AppVersionCode)
versionName = rootProject.AppVersionName
multiDexEnabled true
ndk {
abiFilters 'x86','armeabi'
}
manifestPlaceholders['GETUI_APP_ID'] = rootProject.GETUI_APP_ID_RELEASE
manifestPlaceholders['GETUI_APP_KEY'] = rootProject.GETUI_APP_KEY_RELEASE
manifestPlaceholders['GETUI_APP_SECRET'] = rootProject.GETUI_APP_SECRET_RELEASE
manifestPlaceholders['XIAOMI_APP_ID'] = rootProject.XIAOMI_APP_ID
manifestPlaceholders['XIAOMI_APP_KEY'] = rootProject.XIAOMI_APP_KEY
manifestPlaceholders['MEIZU_APP_ID'] = rootProject.MEIZU_APP_ID
manifestPlaceholders['MEIZU_APP_KEY'] = rootProject.MEIZU_APP_KEY
manifestPlaceholders['HUAWEI_APP_ID'] = rootProject.HUAWEI_APP_ID
//定义一个BuildConfig变量-url,在代码中使用
buildConfigField("String","BASE_COMMON_URL",rootProject.BASE_COMMON_URL_RELEASE)
}
signingConfigs{
relealse {
storeFile file("../keystore/app.keystore")
storePassword "xxxxxxxxxx"
keyAlias "xxxxxxxxxxxxx"
keyPassword "xxxxxxxxxxxx"
}
}
buildTypes {
//这里面可以自己定义自己要的打包类型
//并配置不同的参数进去,比如推送,url测试的,正式的分别配置为两个
//发布版正式环境
//每个module的build.gradle也要加上app里所有的buildType,不然会报错。
release {
manifestPlaceholders['GETUI_APP_ID'] = rootProject.GETUI_APP_ID_RELEASE
manifestPlaceholders['GETUI_APP_KEY'] = rootProject.GETUI_APP_KEY_RELEASE
manifestPlaceholders['GETUI_APP_SECRET'] = rootProject.GETUI_APP_SECRET_RELEASE
buildConfigField("String","MIC_BASE_COMMON_URL",rootProject.MIC_BASE_COMMON_URL_RELEASE)
//混淆
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
debuggable true
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "true"
//Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources false
//加载默认混淆配置文件 progudard-android.txt在sdk目录里面,不用管,proguard.cfg是我们自己配<span></span>的混淆文件
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//签名
signingConfig signingConfigs.relealse
ndk {
// 架构过滤
abiFilters "armeabi", "armeabi-v7a", "x86"
}
}
//本地调试测试环境
debugTest {
manifestPlaceholders['GETUI_APP_ID'] = rootProject.GETUI_APP_ID_TEST
manifestPlaceholders['GETUI_APP_KEY'] = rootProject.GETUI_APP_KEY_TEST
manifestPlaceholders['GETUI_APP_SECRET'] = rootProject.GETUI_APP_SECRET_TEST
buildConfigField("String","MIC_BASE_COMMON_URL",rootProject.MIC_BASE_COMMON_URL_TEST)
//混淆
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
debuggable true
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "true"
//Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources false
//加载默认混淆配置文件 progudard-android.txt在sdk目录里面,不用管,proguard.cfg是我们自己配<span></span>的混淆文件
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//签名
signingConfig signingConfigs.relealse
ndk {
// 架构过滤
abiFilters "armeabi", "armeabi-v7a", "x86"
}
}
}
/*代码开始*/
aaptOptions {
additionalParameters '--auto-add-overlay'
//noCompress 'foo', 'bar'
ignoreAssetsPattern "!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~"
}
/*代码结束*/
//配置打包输出文件,配置后如果直接运行Build Variant对应的buildType,会报找不到release.apk文件,
//所以如果想在Android studio中直接运行安装调试项目就要过滤掉相应的buildType。
applicationVariants.all { variant ->
if (variant.buildType.name == "release" || variant.buildType.name == "preRelease") {
FileTree tree = fileTree(project.rootDir.absolutePath + "/apk")
//删除apk目录下之前生成的apk文件
tree.visit{
element ->
if(element.getName().endsWith(".apk")){
println "$element.file.name"+" "+element.getName()
delete element.file
}
}
variant.getPackageApplication().outputDirectory = new File(project.rootDir.absolutePath + "/apk")
variant.getPackageApplication().outputScope.apkDatas.forEach { apkData ->
def typeName = ""
if (variant.buildType.name == "preRelease") {
typeName = "测试"
}else if(variant.buildType.name == "release"){
typeName = "正式"
}
apkData.outputFileName = rootProject.AppVersionName + typeName + getDate() +".apk"
}
}
}
}
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
implementation 'com.android.support:recyclerview-v7:27+'
implementation 'com.google.code.gson:gson:2.6.2'
implementation 'com.android.support:support-v4:26+'
implementation 'com.android.support:recyclerview-v7:26+'
implementation 'com.android.support:appcompat-v7:26+'
implementation 'com.android.support:cardview-v7:26+'
implementation 'com.android.support:design:26+'
implementation project(':ui')
}
参数化构建
通过在Jenkins中配置参数,通过gradle命令带入到gradle.properties文件中,从而打包不同需求的apk
- jenkins参数化构建过程,添加一个选项参数BuildType,用来选择打测试包还是发布包
- 构建命令中加入参数
app:clean
app:assembleRelease -PBuildType=${BuildType} --stacktrace
参数以-P开头
–stacktrace是打印详细日志
assembleRelease 可以替换成对应的buildType,比如debug对应assembleDebug
gradle补充说明
gradle是构建工具脚本,编写语音是groovy语言,有点类似java的升级版,它的语法支持java的
在Android studio 工程gradle文件中配置的classpath ‘com.android.tools.build:gradle:3.2.1’ 是引入一个安卓官方支持的一个用于构建安卓项目的gradle插件,所以在各个module的gradle文件中第一行都会有个apply plugin: 'com.android.application’或者apply plugin: ‘com.android.library’,这里就是引入一个gradle插件。
所有android{
}中配置的东西都是来源于这个插件中的
外面的呢比如tasks,dependencies这些都是gradle自带的
#以上内容源于Android Jenkins自动化打包学习过程中遇到的坑和一些心得体会,特此记录一下