Jenkins下Android gradle自动化打包

Android Jenkins下使用gradle打包

环境配置

  1. 安装Jenkins;
  2. 在Jenkins插件管理中安装gradle插件,图方便的话就使用自动安装,我安装的是gradle4.6,配合Android gradle插件3.2.1,一般打包源码都是从git或svn上拉取的,所以再安装一下git和svn插件。Jenkins有很多方便的插件,比如发送邮件,文件上传到蒲公英等,真的很厉害,有木有;
  3. 在系统设置里面新增一个环境变量ANDROID_HOME,对应到服务器的sdk路径,jdk服务器配置过的话这里可以不配置;

任务配置

  1. 新建一个自由风格的项目;
  2. 源码管理这项选择svn,输入地址和账号,其他配置默认就行;
  3. 构建—添加构建步骤—Invoke Gradle script,旋转Invoke Gradle,然后再gradle Version选择需要的版本
    4.tasks构建命令app:clean
    app:assemblePreRelease --stacktrace
    assemblePreRelease对应Android studio中的buildtype
  4. 点击高级,勾选Force GRADLE_USER_HOME to use workspace,使用项目的构建配置进行构建,这里有个坑,不勾选的话会包appt2资源异常。
  5. 配置到第5就可以打包了,只是打包路径要在app的gradle中配置;
  6. 构建后归档 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

  1. jenkins参数化构建过程,添加一个选项参数BuildType,用来选择打测试包还是发布包
    在这里插入图片描述
  2. 构建命令中加入参数
    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自动化打包学习过程中遇到的坑和一些心得体会,特此记录一下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jenkins是一个开源的持续集成工具,它可以用于自动化构建、测试和部署项目。对于iOS和Android的自动打包Jenkins提供了一些插件和功能来简化这个过程。 首先,针对iOS应用的自动打包,我们可以使用Jenkins的iOS插件。这个插件允许我们配置相关的构建环境,例如Xcode、CocoaPods等。我们可以在Jenkins上设置一个定时任务或者触发器,当代码库有新的提交时,自动触发构建流程。构建流程可以括编译、打包、签名、生成可安装的.ipa文件等步骤。这样,开发团队就可以通过每次代码提交后的自动构建来获得最新的可安装的iOS应用。 对于Android应用的自动打包,需要使用JenkinsAndroid插件。这个插件提供了强大的构建和部署功能,可以与Gradle等构建工具集成。我们可以在Jenkins上配置构建任务,指定构建的目标版本、Gradle脚本等信息。当有新的提交时,Jenkins自动进行构建,并生成.apk文件。这样,开发团队可以基于最新的.apk文件进行测试和部署。 另外,Jenkins还有一些其他的插件可以支持iOS和Android应用的自动化测试。我们可以集成一些测试框架,如Appium、Calabash等,来进行UI自动化测试。这些测试可以与构建流程结合,每次构建后自动运行。这样一来,我们就可以非常方便地进行持续集成和持续交付。 总结起来,Jenkins为iOS和Android应用的自动打包提供了一些功能和插件。通过配置构建流程,我们可以实现定时或触发式的自动构建,并生成可安装的.ipa或.apk文件。与此同时,我们还可以集成自动化测试框架,实现持续集成和持续交付。这些功能可以大大提高开发团队的效率和应用的质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值