Jenkins安装
Jenkins构建android
Jenkins构建maven

1、环境

  • gradle的android依赖版本:com.android.tools.build:gradle:3.3.0
  • gradle版本:gradle-4.10.1
  • 已经安装好的jenkins(centos的安装过程可参考Jenkins安装)

因为需要修改gradle的脚本,有些比较早的脚本是不支持的,所以本文的适用性请自行斟酌,毕竟2014年用jenkins构建android的时候还是用的ant,那时候的ant脚本对现在已经没有任何参考意义了。

2、目标

用jenkins构建后,要达到一种什么样的效果。结合我自身目前的项目和需求,需要达成以下目标:

  • 一次性构建所有的渠道版本,自动打tag并上传APK到svn目录。
  • 构建内测版本,并自动发布到fir.im(因为要和IOS同步)。
  • 构建后删除源码。
  • 修改后的gradle脚本不影响本地直接run&install调试。

3、gradle脚本

gradle.properties,以下内容为追加内容原有数据不要删除
#版本号versionCode=1#版本名versionName=ver1.0.0#[其他值]:自有渠道   RELEASE:发布  DEV:开发buildType=DEV#默认渠道名jpushChannel=dev

buildType的值的作用:

  • RELEASE : 一次性构建所有渠道版本
  • DEV:本地调试用,如果没有jenkins传参数,默认生成的是本地开发版本
  • 其他值:这个值是变量,根据jenkins传递参数而变化,这样可以单独生成某渠道

jpushChannel的值的作用:因为极光推送和统计都做了,一次集成比较方便,这里用的极光统计,这个值是为了本地调试用,默认生成一个开发渠道,当然也可以不配置在这里,直接在gradle脚本写死。

AndroidManifest.xml 相关代码片段

这里配置动态渠道名称,主要在build.gradle里生成。

主module build.gradle

以下代码有删减,只列框架结构,比如在defaultConfig {}里配置的话,会只贴出与本文相关配置,除versionCode和versionName外,均为追加内容

android {    defaultConfig {        //对应gradle.properties里的versionCode        versionCode project.versionCode as int        //对应gradle.properties里的versionName        versionName project.versionName             //配置manifest参数,多个以逗号隔开,这里只列1个,对应AndroidManifest.xml 里的${JPUSH_CHANNEL_VALUE}        //这里project.jpushChannel对应gradle.properties里的jpushChannel        manifestPlaceholders = [                JPUSH_CHANNEL_VALUE : project.jpushChannel        ]        //hdy_debug这个参数比较特别,是为了内测时开启日志用        if(project.buildType == "DEV" || project.buildType == "hd_debug"){            buildConfigField "boolean", "isDebug", "true"        } else {            buildConfigField "boolean", "isDebug", "false"        }    }    buildTypes {        release {           //如果不是本地调式版本,则修改APK生成路径            if(project.buildType != "DEV"){                android.applicationVariants.all { variant ->                    variant.getPackageApplicationProvider().get().outputDirectory = new File(project.rootDir.absolutePath + "/apk")                }            }            //修改APK命名规则            android.applicationVariants.all { variant ->                variant.getPackageApplicationProvider().get().outputScope.apkDatas.forEach { apkData ->                    //定义渠道名称                    def channelName                    if(project.buildType == "RELEASE"){                         //如果是生成所有渠道,则用gradle里定义的渠道名                        channelName = variant.flavorName                    }else if(project.buildType == "DEV"){                        //如果是本地调试,则用默认的渠道名                        channelName = project.jpushChannel                    }else {                        //其他情况用jenkins传的参数作渠道名                        channelName = project.buildType                    }                    apkData.outputFileName = "Ehome_" +                            channelName + "_" +                            variant.versionName +                             ".apk"                }            }        }    }    //渠道名    flavorDimensions "default"    productFlavors {        if (project.buildType == "RELEASE") {            hd {}            hw {}            bd {}            yyb {}            xm {}            op {}            vv {}            ot {}        }    }    //批量更换渠道名    if (project.buildType == "RELEASE") {        productFlavors.all { flavor ->            flavor.manifestPlaceholders = [JPUSH_CHANNEL_VALUE: name]        }    }}

修改gradle.properties中buildType=DEV时,为本地开发版,当buildType=RELEASE时,则会在源码根目录生成一个apk文件,里面有多个APK渠道包。当RELEASE本地测试过后,改为DEV即可。

4、配置Jenkins

Jenkins需要配置的环境:JDK、Gradle、android sdk



本机有的就不用自动安装了,Gradle服务器上没有所以自动安装一下,如果不知道自己的git目录在哪里whereis
[root@centos]# whereis git
[root@centos]# $JAVA_HOME

这里选择网络安装后,点了保存肯定是没有安装的,这个得再正式build项目时安装,所以不要着急。另外选择Gradle的版本最好打开你的android studio看一下用的是哪个版本。

配置android sdk

本文为centos配置android sdk,windows直接把平时开发用的sdk目录填入即可。

注意:windows下的sdk并不能直接copy到linux下,有专门的linux sdk,androiddk_r24.4.1-linux.tgz,注意从谷歌的官网下载,别被人种了木马。

下载完linux sdk解压,里面基本上什么也没有,阅读SDK Readme.txt,其中一段写着:

To start the SDK Manager, please execute the program "android".

From the command-line you can also directly trigger an update by
executing:
tools/android update sdk --no-ui

Tip: use --help to see the various command-line options.

原来要从网上更新,如果你是带界面的就双击tools/android操作,服务器没界面,我得用终端来操作

[root@localhost android-sdk]# tools/android update sdk --no-ui


安装fir.im插件

参考官方文档,这里不再赘述

创建jenkins构建任务

根据需求要创建2个流程,步骤如下图


渠道Release版

先看效果



创建任务


随便填写描述,我这里就简单写个“自动化打包”,然后把勾选“ 参数化构建过程”,点击 添加参数,选择选项参数, 选项不要有空格,每个选项一行,Release版只有1个选项。


继续添加2个参数,把versionName和versionCode添加进来,都是字符参数即可。

然后添加List Subversion tags参数,这个主要是把指定目录下的tag给列出来,方便下次构建的时候查看上次的版本号,关于SVN目录或者tag目录,有些不熟悉的朋友可能会有点疑惑,上目录结构:

——android
————release
————tags
————trunk

android:安卓项目根目录
release:子目录,存放生成后发布的APK
tags:子目录,存放tag
trunk:存源码

文本参数feature版本说明,密码参数svnPwd,写在这里是因为不想暴露svn密码,看后面步骤的脚本就知道了。

然后,点开右下角的Advanced或高级按钮,修改工作目录,修改这个的目的有2个

  • 这是服务器上的samba目录(samba搭建),方便在windows下观察调试
  • 最后的目录级别是src,这个后期要用到

然后配置SVN,其中如果以前没有配置过SVN,点击Add根据提示自己填写,配置为全局认证参数即可,svn目录是能直接下载到android的源码到settings.gradle级别即可。


然后添加执行shell,“ Exit code to set build unstable”这个选项很重要,1代表即使脚本失败也会继续进行下一步,这里把打SVN Tag的脚本分2步写,就是因为svn mkdir可能失败,毕竟同1个版本号也许会编译2次,svn上已经有了这个目录,再创建目录就会失败。

创建SVN Tag目录

svn的密码是引用的上面的参数svnPwd

echo "make tag dir"$versionNamesvn mkdir svn://192.168.1.91/HM1/android/tags/$versionName -m "mkdir tags ${versionName} \n ${feature}" --username "jenkins" --password "${svnPwd}" --non-interactive
打SVN tag
echo "创建tag"$versionNamesvn cp svn://192.168.1.91/HM1/android/trunk/EHome svn://192.168.1.91/HM1/android/tags/$versionName -m "${versionName}-${versionCode}" --username "jenkins" --password "${svnPwd}" --non-interactive

执行编译动作,然后创建svn release目录,上传编译好的APK


执行编译动作,选中配置好的Gradle Version
app:cleanapp:assembleRelease
创建release目录
svn mkdir svn://192.168.1.91/HM1/android/release/$versionName -m "mkdir release ${versionName}" --username "jenkins" --password "${svnPwd}" --non-interactive
上传编APK
rm -rf ../releasemkdir ../releasecd ../releasesvn checkout svn://192.168.1.91/HM1/android/release/$versionName . --username "jenkins" --password "${svnPwd}" --non-interactive\cp -rf ../src/apk/*.apk ./svn add * --force --username "jenkins" --password "${svnPwd}" --non-interactivesvn commit -m "release-${versionName}" --username "jenkins" --password "${svnPwd}" --non-interactive
最后添加Post-build Actions

删除所有内容


内测版

这两个版本差别不是很大,这个版本更加简单一点,所以这里就不大幅贴图了,只把差异部分贴出来。

还是创建参数化构建,但是不需要svn tag和密码了
这里的hd_debug就是前面build.gradle里是否打印log的配置
在代码里调用:BuildConfig.isDebug

 if(project.buildType == "DEV" || project.buildType == "hd_debug"){            buildConfigField "boolean", "isDebug", "true"        } else {            buildConfigField "boolean", "isDebug", "false" }

注意工作目录不能和其他目录重复,否则在同时编译时会出问题


Build就只用添加编译脚本即可


前面装完了fir.im的插件后,在Post-build Actions选择如下

至此,就完成了android的jenkins自动化构建了。

5、遇到的问题及解决办法

1、shell脚本执行失败导致中断

“Exit code to set build unstable”这个选项,1代表即使脚本失败也会继续进行下一步,所以如果不在乎shell是否执行失败,填1即可。

2、Manifest merger failed with multiple errors, see logs

编写android本地gradle脚本时遇到的,具体原因及解决方法查看Manifest merger failed with multiple errors, see logs

更多相关文章

  1. Android(安卓)ViewGroup中addView方法使用
  2. android 点击获取验证码显示倒计时并不可用
  3. android studio之NDK配置
  4. (详解)Eclipse3.6搭建 Android(安卓)2.2 开发环境
  5. android.os.FileUriExposedException 自动安装APK报错 5分钟搞定
  6. Android(安卓)7.0拍照后保存到手机的指定目录并返回显示
  7. _CONFLICTING_PROVIDER 多渠道打包
  8. android中的适配器
  9. 实习入职第二十天:Android(安卓)中文 API(123) —— AbsListView

随机推荐

  1. android 键盘不弹出
  2. [Android]在Avtivity中注册监听器
  3. ANDROID轮播广告图片
  4. Android如何获取手机的屏幕宽高
  5. android Gridview生成程序快捷键的简单方
  6. Android--LowMemoryKiller知识点补充
  7. Android任务和返回栈完全解析,细数那些你
  8. android画了一个笑脸
  9. 架构
  10. android GPS定位和卫星个数(源码)