我们的思路是每天下班后团队各成员在指定的时间(例如下午18:30)之前把各自的代码上传到SVN,然后服务器在指定的时间(例如下午18:30)更新代码、执行ant 打包命令、最后将apk包存放在指定目录(或者上传指定ftp目录)、其他部门或者同事可以访问指定的地址来下载最新的APK包。就是在ubuntu系统中创建一个定时任务,这个任务每天会在指定时间执行事先编写好的编译脚本。这个定时任务在ubuntu中可以使用crontab来实现。(还不了解crontab的同学自行脑补啦)
一、环境准备
1、在ubuntu 12.04搭建编译环境。
关于Linux下ant编译Android的步骤可以参考 《建立apk定时自动打包系统第一篇——Ant多渠道打包并指定打包目录和打包日期》和《建立apk定时自动打包系统第二篇——自动上传文件》 这个帖子。这个帖子虽然是在windows上操作的,但是步骤都是相似的。相信作为聪明的程序猿这点是可以举一反三的。
2、搭建好apk的编译环境之后我们要安装SVN客户端。unbuntu安装SVN非常简单。执行下列命令
sudo apt-get install subversion
等待完成之后,执行下面命令
svn --version
如果出现了svn版本以及相关帮助等信息说明svn已经安装好了。
二、安装apache服务
由于我的ubuntu服务器已经绑定了公司内网的IP(192.168.0.115),只要我将apk包存放在指定目录下(如apk),那么其他同事就是可以在浏览器中使用192.168.0.115/apk下查看或下载已经打好包的apk了。
1、安装apache服务。
ubuntu中安装apache服务也是很简单的。
sudo apt-get install apache2
安装好之后,自动打开了apache服务,其对外访问的目录默认是在/var/www/目录下,所以在浏览器中输入localhost,并出现It work!字样,说明apache服务安装成功
1、修改ant.properties
在这个文件中我们指定一个apk保存目录为apache服务下的一个目录
key.store=./test.keystore
key.alias=test.keystore
key.store.password=test
key.alias.password=test
apk.dir=/var/www/apk
app.name=AntDemo
#channel numbers
market_channels=default_channel
这样,ant打好包之后只要是公司内网的同事就可以访问192.168.0.115/apk来下载最新的apk包了。
二、编写apk编译执行脚本
在《建立apk定时自动打包系统第一篇——Ant多渠道打包并指定打包目录和打包日期》帖子中,我们是使用
ant deploy
进行打包的。因此我们的脚本的思路也是很简单的,先使用svn update 项目代码,然后使用ant deploy 命令。
1、在项目根目录(例如我的项目目录是/data/appworks/AntDemo)下面新建一个build-app.sh文件。文件的内容如下:
#!/bin/sh
export JAVA_HOME=/data/dev/jdk
export ANT_HOME=/data/dev/ant
export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH
cd /data/appworks/AntDemo/
#update
echo "updating code from server."
svn update --username 你的svn用户名 --password svn密码,无可省略
echo "update finish.begin building the project."
#deploy
ant deploy
echo "building app is finishing."
上面蓝色部分一定要设置,否则crontab不会执行这个脚本。这个问题困扰了楼主好久。切记切记!
编写好shell脚本之后,给build-app.sh添加执行权限
chmod +x build-app.sh
然后在项目目录下手动执行下这个脚本看看有没有错,如果可以打包成功,那么说明这个脚本是正确的了。
2、创建crontab任务。
使用下面命令编辑一个crontab任务
crontab -e
这个时候在shell中就打开了crontab的编辑状态下的页面,在这个页面的后面插入下面的指令
30 18 * * * /data/appworks/AntDemo/build-app.sh
然后编辑,保存
这时候crontab就会在每天的18:30执行/data/appworks/AntDemo/build-app.sh 执行打包命令了。