前言
调研需求:
以前都是通过IDE(Eclipse or Android Studio)
手动生成apk通过QQ或者邮件发送给测试人员进行测试,不仅影响平常开发的效率,也给开发带来了很多不必要的痛苦和麻烦,现在要求对项目进行持续集成,也就是说通过某种方式定时(比如每晚凌晨三点)自动将git库中最新的代码pull下来编译打包,测试人员每天早上上班都能拿到最新的代码打包的Apk。
Jenkins介绍
Jenkins是一个开源软件项目,它前身是Hudson,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
功能
Jenkins
功能包括:
1、持续的软件版本发布/测试项目。
2、监控外部调用执行的工作。
目的:
基于服务器(Linux)
Jenkins+Git+Gradle+Android
自动化打包
主要流程:
一、Linux环境配制
二、下载Jenkins, 安装,启动。
三、登录Jenkins,安装插件
四、配置系统配置
五、创建任务
六、构建任务
七、拿到apk
八、后续怎么做看个人需要,比如写脚本输入到指定路径,看到有人上传到了蒲公英。。。
准备工作:
服务器(Contos7)
Apache Tomcat (点击跳转下载地址)
Android SDK (点击跳转下载地址)
Gradle (点击跳转下载地址)
JDK (点击跳转下载地址)
Git (点击跳转下载地址)
其它 (根据自身项目所需)
Linux环境配制:
1、JDK安装及配置
由于Android开发使用的 Jdk1.8,因此不能复用服务器上现有的JDK;
首先去Oracle Downloads下载 Jdk for Linux.下载jdk-8u131-linux-x64.tar.gz
上传到服务器,进入相关目录解压:
命令:tar -zxvf jdk-8u131-linux-x64.tar.gz
可将目录移至其他目录,其实最好在解压前就将压缩包移至目标目录
JDK环境变量配置(可选)
由于后台使用了JAVA_HOME
、JENKINS_HOME
等一系列环境变量名,所以服务器上默认调用的会是他们的环境变量,我们开发的一套只能在自己的Tomcat、Jenkins中进行指定,具体下文会进行说明
2、Tomcat安装及配置
首先去Tomcat Download选择版本进行下载,这里选择的是apache-tomcat-7.0.79.tar.gz(根据自己的需求下载)
上传到服务器,进入相关目录解压:
tar -zxv -f apache-tomcat-7.0.79.tar.gz
a.端口修改
由于常规tomcat端口被已有tomcat占用,因此我们需要修改端口
进入conf目录下的server.xml修改,用Vim修改.不会用的同学请出门左转度娘主要修改的是,设置为自定义端口号。
* Tomcat admin port 即文件最上面的端口号
* Http/1.1 port 连接访问的端口号
* AJP/1.3 port
b.环境配置
指定Tomcat运行时环境,在bin目录下修改setclasspath.sh
export JAVA_HOME=/usr/android/java/jdk1.8.0_131
export JRE_HOME=/usr/android/java/jdk1.8.0_131/jre
export JENKINS_HOME=/home/android/jenkins
3、Gradle安装及配置
首先去Gradle Download下载对应Gradle版本,笔者使用到的是gradle-3.3-all.zip
上传到指定目录解压:
unzip gradle-3.3-all.zip
然后添加环境变量vim /etc/profile,在环境变量配置处增加一句
export GRADLE_HOME=/home/gradle-3.3/bin
4、Android Sdk For Linux 安装及更新
这里下载Sdk解压都不是难点.难点在于安装之后更新的问题
用AS或者Eclipse的肯定接触过Sdk Manager,此处选择更新后要手动点Accept License才能启动更新.但是在Linux下没有界面化的勾选可用.
因此需要用脚本来更新.网上有说复制License的方法笔者试了无效,也许是姿势不对吧,此处也是踩了很久的坑才搜出来的解决方法:
更新Sdk方法传送门 这里先感谢下该作者
也可以用脚本更新:就几个步骤
a.查看可更新列表
在Sdk的tools目录使用./android list sdk —all查看远程服务器提供的Sdk包的序号,记录想要更新的Sdk序号
b.编辑脚本
#!/usr/bin/expect
set timeout -1
spawn /usr/local/android-sdk-linux/tools/android update sdk -u -a -t 1,2,3,24,25,26,27,28,30,95,96,102,103,104,105,106,107
expect {
"Do you accept the license" { exp_send "y\r" ; exp_continue }
eof
}
此处1,2,3,…为需要下载的SDK序号
c.运行脚本
待脚本跑完,sdk就更新完毕了!
注意:此处脚本用到了expect,需要在服务器上安装,此处提供expect安装传送门
*5、NDK for Linux安装(可选)
安装较简单,后续需配置Jenkins系统变量,下文会进行说明:
项目因用到了JNI
,需要安装NDK
,可是后期发现在项目里每次均去编译jni导致项目的compile sdk
不能使用高于23
的,致使Instant Run
等功能使用,很影响开发效率.后期改在项目外编译好了静态库然后放入项目中,这样不会限制项目自身的SDK版本,因此若未使用JNI的项目,则可跳过此步骤
6、Git安装及环境变量配置
下载安装并配置环境变量
export GIT_HOME=/usr/android/git-2-2.12.2/bin
7、 Jenkins安装及配置
a.下载 点击跳转下载地址
下载Jenkins
将war
包放入Tomcat
的webapps
目录下,启动tomcat
然后在地址栏输入路径http://localhost:/8777 其中8777为第二步中自定义的端口号
b. 插件安装
然后安装插件(基本参考网上的)
1.Branch API Plugin
2.build timeout plugin
3.build-name-setter
4.Credentials Binding Plugin
5.description setter plugin
6.Dynamic Parameter Plug-in
7.Environment Injector Plugin
9.Git plugin
10.GIT server Plugin
11.Gradle Plugin
12.Git Parameter Plug-In
13.Pipeline: Basic Steps
14.Pipeline: Build Step
15.Pipeline: Input Step
16.Pipeline: Nodes and Processes
17.Pipeline: Stage Step
18.Scriptler
19.Workspace Cleanup Plugin
20.Post-Build Script Plug-in
21.Email Extension Plugin
22.SSH Slaves plugin
23.Timestamper
因为Jenkins版本不同,实际使用中发现缺失不少!(下面是随便贴几个)
c. 环境变量配置
环境变量
首先点击系统管理->系统设置配置Jdk、Android Sdk、Gradle、Android Ndk环境变量(此处也可配置Git目录,笔者是将Git目录配置在Linux环境变量中了)
至此环境大体上配置已经完成,即可进入项目相关配置。。。
Jenkins项目配置
首先创建一个项目,将构建保持的天数和个数进行限制:
注意:此处感谢后台同事提示,因为Android SDK NDK 就特别占空间了,如果构建缓存不进行限制,则很快服务器空间就会不足
参数构建配置
择择构建平台:
选择打包环境:
是否由Jenkins构建:
APP版本号:
自定义时间:
构建者信息:
注意:因为的公司对打包的Apk名以及测试版本号时间戳显示的要求,因此需要使用动态参数!(还有其他参数均与以上类似,可自行配置)
!!! 记住尤为重要的是这些参数都是Jenkins上配置的Gradle属性,得传递到App的Gradle中!
源码管理:
在源码管理处配置Git账号
Gradle构建脚本(增加构建动作)
配置输出命令:
clean
assemble'${PRODUCT_FLAVOR_BUILD}${ENVIRONMENT_BUILD}'
--stacktrace
—debug
这段动态脚本相当于 clean assembleXiaomiRelease
构建后操作:(比如可以上传到第三方平台,服务器等。)
准备构建项目:
选择好需要构建的参数,选择开始构建,每一次构建都会自动从git拉取最新的代码.第一次构建Jenkins需要下载相应的jar包,耗时会比较久(如果构建失败,请继续阅读接下步骤)
构建完成:
总结:
以上是Jenkins+Git+Gradle+Android 自动化打包及自动化构建过程,CI可以自己随时打包,从此不再麻烦开发人员。
相关难点:
- Linux 服务器环境的配制
- JobProject相关的配制
- Gradle 动态脚本编写
- 处理好多渠道问题