| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 | 
							- # -*- coding:utf-8 -*-
 
- import time
 
- import sys
 
- import os
 
- import json
 
- import subprocess
 
- '''
 
-     配置全局变量
 
- '''
 
- JSONFILE = None
 
- SHELLFILE = None
 
- print(sys.argv[0])  # sys.argv[0] 类似于shell中的$0,但不是脚本名称,而是脚本的路径
 
- if len(sys.argv) == 2:
 
-     JSONFILE = sys.argv[1]  # 表示Json参数文件路径;
 
- if len(sys.argv) == 3:
 
-     SHELLFILE = sys.argv[2]  # 表示Shell脚本文件路径;
 
- # 输入开始时间;
 
- print("Start",time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
 
- # 源码路径
 
- CODE_DIR = None
 
- # 脚本名称;
 
- SCRIPT_NAME = None
 
- # 编译前的参数
 
- PREV_ARG = None
 
- # 脚本参数
 
- SCRIPT_ARG = None
 
- # 编译后的参数
 
- AFTER_ARG = None
 
- # 源码目录名称;
 
- CODE_FOLDER_NAME = None
 
- # 解析json文件;
 
- def loadJson():
 
-     global CODE_DIR
 
-     global PREV_ARG
 
-     global JSONFILE
 
-     global SCRIPT_ARG
 
-     global AFTER_ARG
 
-     global SCRIPT_NAME
 
-     global CODE_FOLDER_NAME
 
-     print(u"loadJson")
 
-     if JSONFILE is None or JSONFILE.__len__() == 0:
 
-         print(u"use default josn arg")
 
-         JSONFILE=sys.path[0]+"/arg.json"
 
-         #JSONFILE = "arg.json"
 
-     if os.path.exists(JSONFILE) is False:
 
-         print(u"json file doesn't exist")
 
-         return False
 
-     try:
 
-         data = open(JSONFILE, 'r')
 
-         args = json.load(data)
 
-     except Exception as e:
 
-         print("An error occurred:"+e)
 
-         return False
 
-     print(args['pre-compile'])
 
-     print(args['after-compile'])
 
-     print(args['compile'])
 
-     CODE_DIR = args['code-dir']
 
-     CODE_FOLDER_NAME = CODE_DIR.split('/')[-1]
 
-     SCRIPT_NAME = args['compile-script']
 
-     PREV_ARG = args['pre-compile']
 
-     SCRIPT_ARG = args['compile']
 
-     AFTER_ARG = args['after-compile']
 
-     return True
 
- # 不使用重定向;
 
- def cmdExecute_NoRidrect(cmd, dir=None):
 
-     print(str.format("cmd start:%s, %s") % (cmd, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
 
-     proc = subprocess.Popen(cmd, shell=True, cwd=dir)
 
-     # 等待完成;
 
-     proc.wait()
 
-     print(str.format("cmd end:%s, %s") % (cmd, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
 
- # 重定向标准输出、标准错误;
 
- def cmdExecute_Ridrect(cmd, dir=None):
 
-     print(str.format("cmd start:%s, %s") % (cmd, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
 
-     proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, cwd=dir)
 
-     # 等待完成;
 
-     stdout,stderr = proc.communicate()
 
-     if proc.returncode == 0:
 
-         print(u'cmd finished')
 
-     # 返回执行结果;
 
-     print("stdout=",stdout)
 
-     print("stderr=",stderr)
 
-     print(str.format("cmd end:%s, %s") % (cmd, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
 
-     return stdout
 
- def prev_compile():
 
-     global PREV_ARG
 
-     global CODE_DIR
 
-     print("prev_compile", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
 
-     if PREV_ARG is None or PREV_ARG.__len__() == 0:
 
-         print("prev args is empty")
 
-         return False
 
-     
 
-     # Python无法将字符串'false'转为布尔类型;
 
-     if 'clean' in PREV_ARG:
 
-         if type(PREV_ARG['clean']) == type(u'str'):
 
-             PREV_ARG['clean'] = True if PREV_ARG['clean'].lower() == u'true' else False
 
-         print(type(PREV_ARG['clean']), PREV_ARG['clean'])
 
-     if 'sync' in PREV_ARG:
 
-         if type(PREV_ARG['sync']) == type(u'str'):
 
-             PREV_ARG['sync'] = True if PREV_ARG['sync'].lower() == u'true' else False
 
-         print(type(PREV_ARG['sync']), PREV_ARG['sync'])
 
-     if 'redownload' in PREV_ARG:
 
-         if type(PREV_ARG['redownload']) == type(u'str'):
 
-             PREV_ARG['redownload'] = True if PREV_ARG['redownload'].lower() == u'true' else False
 
-         print(type(PREV_ARG['redownload']), PREV_ARG['redownload'])
 
-     # 更新代码;
 
-     commands=[]
 
-     commands.append(str.format("cd %s") % CODE_DIR)
 
-     commands.append("rm -rf Target")
 
-     # Java创建会话终端(导入了所有环境变量),无须再export,解决repo:commnand not found的问题;
 
-     #commands.append("export PATH=$(echo $PATH)") 
 
-     if 'clean' in PREV_ARG and PREV_ARG['clean']:
 
-         print("enable clean")
 
-         commands.append("repo forall -c \"pwd &&git clean -xfd && git checkout .\"")
 
-     # 更新代码;
 
-     if 'sync' in PREV_ARG and PREV_ARG['sync']:
 
-         print("enable sync")
 
-         commands.append("repo sync")
 
-     
 
-     # 重新下载;
 
-     if 'redownload' in PREV_ARG and PREV_ARG['redownload']:
 
-         print("enable redownload")
 
-         commands.append(str.format("rm -rf !(%s|%s|%s|%s)") % ("builder.py", "arg.json", SCRIPT_NAME, "ftp.py"))
 
-         commands.append(str.format("repo init -u %s") % (PREV_ARG['branch-addr']))
 
-         commands.append("repo sync")   
 
-     
 
-     # 执行所有命令;
 
-     commandline=';'.join(commands)    
 
-     cmdExecute_Ridrect(commandline)
 
- def call_script():
 
-     global SCRIPT_ARG
 
-     print("call_script", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
 
-     if SCRIPT_ARG is None or SCRIPT_ARG.__len__() == 0:
 
-         print("script args is empty")
 
-         return False
 
-     # 生成命令行参数;
 
-     commandline = ''
 
-     for item in SCRIPT_ARG:
 
-         line = str.format("%s=%s ") % (item, SCRIPT_ARG[item])
 
-         commandline = commandline + line
 
-     
 
-     print("script args is:"+commandline)
 
-     if commandline.__len__() == 0 or commandline.index("=") == -1:
 
-         print("commandline is empty or format error!")
 
-         return False
 
-     print("start to compile")
 
- 	# 调用编译脚本时,不需要重定向,否则无法生成日志;
 
-     cmdExecute_NoRidrect(str.format("cd %s;chmod 777 %s;./%s %s")%(CODE_DIR,SCRIPT_NAME,SCRIPT_NAME,commandline), CODE_DIR)
 
-     return True
 
- def after_compile():
 
-     global AFTER_ARG
 
-     print("after_compile", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
 
-     if AFTER_ARG is None or AFTER_ARG.__len__() == 0:
 
-         print("after args is empty")
 
-         return False
 
-     if 'Scp2OtherServer' in AFTER_ARG:
 
-         if type(AFTER_ARG['Scp2OtherServer']) == type(u'str'):
 
-             AFTER_ARG['Scp2OtherServer'] = True if AFTER_ARG['Scp2OtherServer'].lower() == u'true' else False
 
-         print(type(AFTER_ARG['Scp2OtherServer']), AFTER_ARG['Scp2OtherServer'])
 
-     
 
-     # 上传到其他服务器;
 
-     if 'Scp2OtherServer' in AFTER_ARG and AFTER_ARG['Scp2OtherServer']:
 
-         commands=[]
 
-         commands.append(str.format("cd %s/Target/") % CODE_DIR)
 
-         commands.append("cd $(ls|grep V8)")
 
-         commands.append("pwd")
 
-         commands.append("ls")
 
-         # 创建目录;
 
-         ScpDir=AFTER_ARG['ScpServerPath']+time.strftime("%Y%m%d%H%M%S")
 
-         commands.append(str.format('ssh %s@%s "[ -d %s ] && echo ok || mkdir -p %s"') % (AFTER_ARG['ScpUserName'], AFTER_ARG['ScpServerName'], ScpDir, ScpDir))
 
-         commands.append(str.format("scp -r OTA %s@%s:%s") % (AFTER_ARG['ScpUserName'], AFTER_ARG['ScpServerName'], ScpDir))
 
-         commands.append(str.format("scp -r Reports/* %s@%s:%s") % (AFTER_ARG['ScpUserName'], AFTER_ARG['ScpServerName'], ScpDir))
 
-         commands.append(str.format("scp -r USB/* %s@%s:%s") % (AFTER_ARG['ScpUserName'], AFTER_ARG['ScpServerName'], ScpDir))
 
-         # 执行所有命令;
 
-         commandline=';'.join(commands)    
 
-         cmdExecute_Ridrect(commandline)
 
- if __name__ == "__main__":
 
-     # os.system('cd ~/2851M; ls -al; repo sync') # 可用命令格式;
 
-     # subprocess.call('cd ~;ls -al;cd ~/2851M; ls -al; repo sync', shell=True)
 
-     # subprocess.call(["cd ~", "ls -al","cd ~/2851M", "ls -al", "repo sync"], shell=False) 错误的执行方式;
 
-     ret = loadJson()
 
-     if ret is True:
 
-         prev_compile()
 
-         call_script()
 
-         after_compile()
 
-     else:
 
-         print(u"doesn't build")
 
 
  |