android镜像自动化编译
文章现实愿景:
为了实现傻瓜式编译,也就是不管懂不懂linux技术的人都可以通过一键式的执行在windows端的bat脚本,然后触发ubuntu编译服务器进行镜像编译,编译完成之后ubuntu把编译出来的镜像拷贝到windows固定目录下.
目的:
一是解放对出版本人员的依赖,随时自己来触发编译.
二是实现每日编译,可以验证库上最新版本合入代码是否有问题.
知识点:
1.android镜像全自动编译之-shell和python脚本交互
2.Cygwin工具安装实现windows和ubuntu之间的命令交互
3.ubuntu编译服务器自动检测编译条件,实现自动触发编译
整个流程如图
具体实现:
一.要实现android镜像自动编译库上最新版本,就是要自动实现下载库上最新代码,自动配置产品编译环境,自动启动源码编译,编译完成之后自动报告编译结果等等步骤.
知识点1: python pexpect实现自动交互
这里就设计到repo init时需要手动输入用户名,邮箱和yes等信息,为了实现自动化交互,这里用python自带的pexpect模块来实现,用shell脚本调用python脚本来实现repo init功能,具体如下:
### repo_init.py###
#!/usr/bin/python
import pexpectrepoinit = pexpect.spawn('repo init -u url -b branch')
repoinit.expect('Your\s+Name.*')
repoinit.sendline()
repoinit.expect('Your\s+Email.*')
repoinit.sendline()
repoinit.expect('is this.*')
repoinit.sendline('y')
sys.exit(0)
###############
shell端脚本调用python如下:
######autobuild.sh##########
#!/bin/bash
python repo_init.py #自动repo init
repo sync #自动下载库上代码
source build/envsetup.sh
lunch general #这里将设general是要编译的产品
make -j4
if [ "$?" -eq 0 ] ;then
#编译成功
else
#编译失败
exit 1
fi
#####################
这里假设镜像编译完成且打包成了zip格式,现在需要拷贝到windows端,需要和windows进行交互. 还有windows的bat需要触发实现自动编译.这里需要在windows安装Cygwin实现执行shell命令,并需要在windows安装ssh服务,ubuntu也需要安装ssh服务,用来实现相互拷贝数据(scp命令,ssh链接等)
知识点2: windows和linux命令交互
一台电脑要能用windows又要能用linux,一个非常好的选择就是在windows端安装Cygwin工具,比安装虚拟机简单方便,也不像安装双操作系统一样,需要关机切换.
步骤:
1. windows端安装Cygwin,具体操作请看如下链接:
http://www.linuxidc.com/Linux/2011-05/35835.html
2. 在windows中cygwin安装ssh服务,打开cygwin输入命令:ssh-host-config,安装完成,启动用net start sshd ,具体看: http://www.blogjava.net/Man/archive/2012/11/26/392004.html
3. ubuntu服务端需要安装ssh服务端 sudo apt-get install openssh-server
4. 在windows安装完成Cygwin和ssh服务之后,用ssh-keygen在windows端的.ssh目录下产生密钥,然后将公钥id_rsa.pub的内容复制到服务端(ubuntu).ssh目录下的authorize_keys文件中,如果没有此文件则在服务端.ssh文件夹中创建.同样在windows端也保存ubuntu的id_rsa.pub公钥到.ssh/authorize_keys中,实现双向ssh访问. 具体看如下链接:
http://jingyan.baidu.com/article/60ccbceb02bd4264cab197b9.html
这样之后windows就可以用Cygwin自带的ssh工具链接到ubuntu端了,同时可以用scp等命令,其他可用命令看Cygwin安装目录下的bin文件夹
5. ssh -l username 192.168.11.51 "~/Work/test.sh" 实现远程执行ubuntu上的脚步文件,具体看: http://bbs.csdn.net/topics/390489981
6. 需要在Cygwin中安装其他工具,当然可以参考:
http://blog.csdn.net/chief1985/article/details/6689754
http://www.2cto.com/os/201212/176551.html
例如:$ /cygdrive/d/Software/Cygwin-64/setup-x86_64.exe -q -P wget 可以安装wget工具,其中setup-x86_64.exe就是Cygwin-64的安装exe文件.
知识点三:自动检测触发自动编译
这里要实现点击bat脚本,触发ubuntu端自动编译.由于直接调用编译脚本时会报错:
Traceback (most recent call last):
...
pexpect.ExceptionPexpect: The command was not found or was not executable: repo.
在windows的Cygwin中安装repo也无法解决此错误,所以这里采用在windows端置位ubuntu标志,然后ubuntu端的服务检测到这个标志就开始执行编译脚本的方法.说的这么高深,其实很简单,具体看如下步骤:
1> 在windows端通过ssh -l username 192.168.11.51 " touch building_flag"命令创建一个building_flag文件,有ubuntu端的一个buildcheck.sh服务脚本在定时检测此文件是否存在,存在这此服务脚本启动编译脚本autobuild.sh自动编译. 当然bat脚本执行了
ssh -l username 192.168.11.51 " touch building_flag"这个命令后需要知道什么时候编译成功,并告诉用户,这bat可以轮询windows存放镜像目录下是否有镜像,有说明编译成功.因为编译完成之后,会拷贝镜像到windows指定目录.当然其他判断条件也可以,这里主要说整个流程和思路
2> 在ubuntu端创建的buildcheck.sh脚本加入到开机子启动中,这里放置到ubuntu系统的开机初始化脚本文件~/.profile的最后,把buildcheck.sh设置为后台执行,因为buildcheck.sh是一个死循环定时检测,如果不设置为后台运行,这ubuntu开机启动的时候初始化脚本无法退出,桌面永远实现不了.
如果时在/etc/profile开机启动文件最后加一句:/路径/buildcheck.sh & 这种方法有问题:
(注意: 在/etc/profile加 nohup /路径/buildcheck.sh & 的启动方法不生效,采用这个开机脚本实现会导致下载代码的repo init失败. 所以这里使用另外一个启动脚本来实现)
在~/.profile文件最后加一句:nohup /路径/buildcheck.sh & #加"&"表示后台运行.nohup在profile父进程退出时后台运行的子进程不被回收,这样就作为服务脚本在运行了.
3> buildcheck.sh内容为定时检测building_flag文件是否存在,如果存在这触发autobuild.sh开启自动编译.内容如下:
###buildcheck.sh###
while true
do
if [ -f /路径/building_flag ] #如果building_flag文件存在
then
rm -rf /路径/building_flag #删除building_flag,以便进行下次编译条件检测.
. /路径/autobuild.sh & # 启动autobuild.sh镜像自动编译
fi
sleep 30 #30s检测一次
done
##################
4> 自动化编译完成之后,需要拷贝镜像到windows,按理说执行如下命令即可:
scp /路径/镜像.zip windows端Cygwin用户名@ip地址:windows路径
但是这样执行时,会出现ubuntu无法找到windows路径的问题,这里换用python脚本来执行此命令即可. 这里的路径是ubuntu格式的,因为安装了Cygwin,可以找到home目录在Cygwin安装目录下.当然windows格式的目录是没法识别的. 这里假设这个拷贝zip的python名字为copy_zip.py,这个脚本可以加到镜像编译打包成功之后.
#####copy_zip.py#####
#!/usr/bin/python
import pexpect
import os
os.system('scp /路径/镜像.zip windows端Cygwin用户名@ip地址:windows路径')####end#####
例如:os.system('scp ~/*.zip Administrator@192.168.11.62:~/images')
这里的~/images路径在本人电脑上实际为"C:\cygwin64\home\Administrator"
总结:
通过前面三个知识点及其相关的操作步骤,我们就可以实现在windows端一键式执行bat脚本,然后等待编译完成,到windows指定目录获取镜像即可,完成实现了全自动话编译.
转载请注明出处