Android Jenkins+Git+Gradle持续集成
首先到Jenkins的官网下载https://jenkins.io,安装jenkins不再赘述
然后是插件安装如下
注意:列表中为主要插件,而Jenkins的插件是有依赖关系的,安装一个插件可能要先安装它依赖的插件,否则会安装失败。在可选插件勾选列表中的插件即可,依赖插件会自动下载,是不是很棒。
Git plugin
Gradle Plugin
Email Extension Plugin
description setter plugin
build-name-setter
user build vars plugin
Post-Build Script Plug-in
Branch API Plugin
SSH plugin
Scriptler
Dynamic Parameter Plug-in
Git Parameter Plug-In
在线没有的插件可以去找离线包
接着安装打包需要的工具 安卓 sdk gradle git
1.下载Android SDK
http://tools.android-studio.org/index.php/sdk/ 我下载的是:android-sdk_r24.4.1-linux.tgz
2. 解压Android SDK
将android-sdk_r24.4.1-linux.tgz文件复制到Linux 文件系统中的某个目录,我的是目录是/usr/local/
执行命令解压:
tar -zvxf android-sdk_r24.4.1-linux.tgz
3.配置环境变量
在文件/etc/profile末端添加如下两行:
export ANDROID_HOME=/usr/local/android-sdk-linux
export PATH=$ANDROID_HOME/tools:$PATH
android-sdk-linux是你解压后的文件名,tools一定要这样写,是里面文件夹的名称
执行命令文件立马生效
source /etc/profile
4.安装所有包
android update sdk --no-ui
或者查看序列号
android list sdk --all
结果
1- Android SDK Tools, revision 24.1.2
2- Android SDK Platform-tools, revision 22
3- Android SDK Build-tools, revision 22.0.1
4- Android SDK Build-tools, revision 22 (Obsolete)
5- Android SDK Build-tools, revision 21.1.2
6- Android SDK Build-tools, revision 21.1.1 (Obsolete)
7- Android SDK Build-tools, revision 21.1 (Obsolete)
8- Android SDK Build-tools, revision 21.0.2 (Obsolete)
9- Android SDK Build-tools, revision 21.0.1 (Obsolete)
10- Android SDK Build-tools, revision 21 (Obsolete)
11- Android SDK Build-tools, revision 20
12- Android SDK Build-tools, revision 19.1
13- Android SDK Build-tools, revision 19.0.3 (Obsolete)
14- Android SDK Build-tools, revision 19.0.2 (Obsolete)
15- Android SDK Build-tools, revision 19.0.1 (Obsolete)
16- Android SDK Build-tools, revision 19 (Obsolete)
17- Android SDK Build-tools, revision 18.1.1 (Obsolete)
18- Android SDK Build-tools, revision 18.1 (Obsolete)
19- Android SDK Build-tools, revision 18.0.1 (Obsolete)
20- Android SDK Build-tools, revision 17 (Obsolete)
21- Documentation for Android SDK, API 22, revision 1
22- SDK Platform Android 5.1.1, API 22, revision 2
23- SDK Platform Android 5.0.1, API 21, revision 2
24- SDK Platform Android 4.4W.2, API 20, revision 2
25- SDK Platform Android 4.4.2, API 19, revision 4
26- SDK Platform Android 4.3.1, API 18, revision 3
27- SDK Platform Android 4.2.2, API 17, revision 3
按序列号安装
android update sdk -u --all --filter 1,2,3,5,11,12,22,23,24,25,26,27,28,29,88,89
后面如果打包报错再来按序号安装所需版本
gradle安装及使用
到官网下载 https://gradle.org/install/
2、解压安装包到目录
/root/A
3、打开环境文件
sudo vim /etc/profile
4、写入环境变量:
export GRADLE_HOME=/root/A/gradle-2.0
export PATH=$GRADLE_HOME/bin:$PATH
5、环境变量生效
source /etc/profile
6、检查结果
gradle -v
出现版本信息即为正确
Gradel的使用:
查看当前工程支持的操作任务
gradle tasks
清理工程
gradle clean
编译项目debug版本 ,并输出到output目录
gradle assembleDebug
编译项目release版本 ,并输出到output目录
gradle assembleRelease
代码检查及测试
gradle check
编译项目并执行检查及测试,即assemble + check
gradle build
然后在jenkins上配置工具的路径
1 设置全局环境变量
主要有三个全局环境变量,JAVA_HOME,ANDROID_HOME,GRADLE_HOME
点击系统管理-系统设置,找到全局属性,勾选enviroment variables,分别添加这三个环境变量。主要添加变量路径要和你系统的保持一致。
然后是 工具路径 点击系统管理-Global tool configuration
最后开始打包
打包
1.创建项目
距离开始打包又近了一步,接下来就开始创建新项目了,点击首页的新建,进入下图界面
给自己的项目起个名字,然后选择构建一个自由风格的软件项目,点击OK按钮,进入项目的配置界面。
2.项目配置
直接选择源码管理tab或者向下滚动找到源码管理,如图;
选中Git选项,会出现上图的界面,配置Git项目的URL,我测试用的是Github项目,并且传输协议选择的是HTTP,需要选择Credentials选项,选择通行证,第一次需要点击Add添加通行证,如图:
Kind种类选择默认的Username with password,然后在Username和Pasword处分别输入Git账户的用户名和密码,然后滚动到下方点击Add,然后在Credentials中选择我们刚才添加的通行证。
接着滚动到构建Tab,点击添加构建步骤,然后选择Invoke Gradle script,如图:
然后配置构建时的Gradle版本,和需要执行的任务,如图:
这个Tasks是先clean工程,然后打包所有渠道的Release版本,这是Gradle的命令,不多说了。然后点击保存按钮,马上就可以打包了。
3.开始构建
点击左侧菜单栏的立即构建,开始构建项目,这时候Build History版块会出现构建任务列表,点击进入可以查看构建详情页
又很多菜单可以选择来查看状态,点击Console Output来查看构建输出的日志,所有的信息都会显示,日志最后输出Finished: SUCCESS即构建成功。
成功之后,返回项目地址就可以点击工作空间,在app的build目录下面查看apk生成情况。
以上就是Jenkins打包最简单的配置,我知道大家想要的不止这些,更精彩的还在后面。
定制想要的功能
1.参数化构建
在我们打包的时候,我们大多时候不想只是简简单单打一个版本的包,我们想通过配置一下参数,来满足一些需求,比如根据渠道打不同版本的包、根据Tag打不同的包等,下面就来说一下Jenkins参数化构建。
在我们项目中需要配置的选项有:版本(Release 或 Debug),版本号,渠道包,根据Tag打包。另外我们还需要加上打包途径,AS打包还是Jenkins打的包,还要加一个时间戳。所有的参数列出来了,下面就配置Jenkins的参数化构建吧~
在Jenkins项目主页选择配置,进入配置页,在General tab将参数化构建过程选中,如图:
接下来就可以添加参数了,下面我先列出参数表格:
参数名 参数类型 参数值列表
BUILD_TYPE Choice Release or Debug
IS_JENKINS Choice true
PRODUCT_FLAVORS Choice Xiaomi 、Wandoujia等
BUILD_TIME Dynamic Parameter 2016-12-21-11-11
APP_VERSION Choice 1.0.0、1.0.1等
GIT_TAG Git Parameter tag1.0.0等
下面直接放我的配置截图:
配置完参数还不算完,我们要在下方构建时候引用,首先找到构建标签处,将Tasks属性值修改为:
clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE} --stacktrace --debug
其中${PRODUCT_FLAVORS}和&{BUILD_TYPE}分别对应上面的参数名。配置如图:
看了图大家肯定留意到了红色框内的选项而且很好奇吧,这个选项是APP_VERSION、IS_JENKINS、BUILD_TIME需要用到的,因为这三个参数需要注入到Android项目中的配置一样,而红色框中的这个选项可以帮我们侵入到gradle.properties文件中替换值,并且build.gradle文件能够直接引用gradle.properties文件中的属性,所以起到了侵入的效果。下面分别是我的gradle.properties和主项目的build.gradle文件全代码:
//gradle.properties #sec:decoupled_projects #org.gradle.parallel=true APP_VERSION=1.0.1 IS_JENKINS=true BUILD_TIME='' //build.gradle apply plugin: 'com.android.application' def getDate() { def date = new Date() def formattedDate = date.format('yyyy-MM-dd-HH-mm') return formattedDate } def verCode = 14 android { compileSdkVersion 25 buildToolsVersion "25.0.0" defaultConfig { applicationId "com.zyyoona7.autobuildtest" minSdkVersion 15 targetSdkVersion 23 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true versionCode verCode versionName APP_VERSION } signingConfigs { signingConfig { //由于本地打包使用的是本机上的KeyStore //而Jenkins打包用的是服务器上的KeyStore //两个路径不一样 if("true".equals(IS_JENKINS)){ storeFile file("服务器上KeyStore的路径") }else { storeFile file(STORE_FILE_PATH) } keyAlias KEY_ALIAS keyPassword KEY_PASSWORD storePassword STORE_FILE_PASSWORD } } buildTypes { release { minifyEnabled true zipAlignEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.signingConfig } debug { } } dexOptions { javaMaxHeapSize "2g" } //渠道Flavors productFlavors { wandoujia { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"] } xiaomi { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"] } } //修改生成的apk名字及输出文件夹 applicationVariants.all { variant -> variant.outputs.each { output -> //新名字 def newName //时间戳 def timeNow //输出文件夹 def outDirectory //是否为Jenkins打包,输出路径不同 if ("true".equals(IS_JENKINS)) { //Jenkins打包输出到服务器路径 timeNow = BUILD_TIME //BUILD_PATH为服务器输出路径 outDirectory = BUILD_PATH //AutoBuildTest-v1.0.1-xiaomi-release.apk newName = 'AutoBuildTest-v' + APP_VERSION + '-' + variant.productFlavors[0].name + '-' + variant.buildType.name + '.apk' } else { //本机打包输出在本机路径 timeNow = getDate() outDirectory = output.outputFile.getParent() if ('debug'.equals(variant.buildType.name)) { newName = "AutoBuildTest-v${APP_VERSION}-debug.apk" } else { //AutoBuildTest-v1.0.1-xiaomi-release.apk newName = 'AutoBuildTest-v' + APP_VERSION + '-' + variant.productFlavors[0].name + '-' + variant.buildType.name + '.apk' } } output.outputFile = new File(outDirectory+'/'+timeNow, newName) } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.0.0' testCompile 'junit:junit:4.12' }
这样在Jenkins打包的时候上面三个参数就会随着选择变化而变化了。
GIT_TAG参数使用配置,只需在源码管理处的Branch引用改为$GIT_TAG引用参数名,如图:
参数配置完毕,看一下主页面的效果吧,现在立即构建选项变成了_ Build with Parameters_,完成图:
提示:
如果选中了GIT_TAG中的任意版本都无法取消选中,只能刷新;
构建后操作
将apk放在nginx的下载目录下nginx 即开启 autoindex on 即可
jenkins配置如下
测试人员即可从网址下下载所需apk了
如果没有服务器的 给大家福利阿里云的优惠券
https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=twka3s4r