window和linux命令交互之--android镜像自动化编译,通过windows的bat脚本控制ubuntu编译服务器编译镜像

7 篇文章 0 订阅
5 篇文章 0 订阅

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 pexpect

repoinit = 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指定目录获取镜像即可,完成实现了全自动话编译.


转载请注明出处



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值