1 Star 0 Fork 0

铁血Coder / py-package

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
package.py 8.41 KB
一键复制 编辑 原始数据 按行查看 历史
lvwei 提交于 2017-04-24 17:07 . 编译错误
# -*- coding: gbk -*-
'''
该文件处理构建完成后的打包流程
'''
import os, sys, subprocess, stat, shutil, threading
import re
from build import *
from common import *
class PackageRunner:
def __init__(self, task, job):
self.__t = task
self.__masterbin = self.getsrvmaster(task)
self.__builder = self.getsrvbuild(task)
self.__xmltool = os.path.join(self.__builder, T.xml_merge_app())
self.__menutool = os.path.join(self.__builder, T.menu_merge_app())
self.__issapp = T.iss_app()
self.__isstemplate = os.path.join(self.__builder, T.iss_template())
self.__iss = os.path.join(self.__builder, T.issfile())
self.__verlist = self.makeverlist(job)
self.__appstarterver = None
logfile = os.path.join(task.serverpath, 'package.log')
self.__l = open(logfile, 'w')
self.__upthread = threading.Thread(target = self.uploadmsi)
def __del__(self):
self.__l.flush()
self.__l.close()
def getsrvmaster(self, t):
return os.path.join(os.path.join(t.serverpath, t.master), 'Bin').replace('/', '\\')
def getsrvbuild(self, t):
return os.path.join(os.path.join(t.serverpath, t.master), 'Builder').replace('/', '\\')
def sortversion(self, task1, task2):
v1 = task1.name.replace('task_cad_', '')
v2 = task2.name.replace('task_cad_', '')
t1 = v1.split('_')
t2 = v2.split('_')
if t1[0] < t2[0]:
return -1
elif t1[0] == t2[0]:
if t1[1] < t2[1]:
return 1
else:
return -1
else:
return 1
def makeverlist(self, job):
job.sort(self.sortversion)
# 先对job里的task按CAD版本排序
compiles = []
verlist = []
for t in job:
for k, v in t.configuration.iteritems():
compiles.extend(v)
for c in compiles:
cadver = c['Configuration'].replace('_Release', '').replace('CAD_', 'CAD')
platform = c['Platform'].replace('Win32', '_x86').replace('x64', '_x64')
verlist.append(cadver + platform)
return verlist
# 合并Bin目录和配置(.xml)
def mergebin(self):
t = self.__t
for p in t.plugins:
pluginbin = os.path.join(os.path.join(t.serverpath, p), 'Bin').replace('/', '\\')
cmd = '%s %s %s' % (self.__xmltool, self.__masterbin, pluginbin)
proc = subprocess.Popen(cmd, stdout = self.__l)
proc.wait()
self.__l.flush()
cmd = 'xcopy "%s" "%s" /Y /E /R' % (pluginbin, self.__masterbin)
proc = subprocess.Popen(cmd, stdout = self.__l)
proc.wait()
self.__l.flush()
# 合并菜单(.cui)
def mergemenu(self):
menuconfigure = os.path.join(self.__masterbin, 'Resource\\Menu\\菜单栏配置.xml')
cmd = '%s %s' % (self.__menutool, menuconfigure)
proc = subprocess.Popen(cmd, stdout = self.__l)
proc.wait()
self.__l.flush()
# 替换版本号
def replaceversion(self, pattern, line, s):
newline = line
if line.upper().find(s) != -1:
new = None
result = re.search(pattern, line)
if not result:
return newline
old = result.group(0)
if old.find(',') != -1:
s = old.split(',')
s[-1] = str(int(s[-1]) + 1)
new = ','.join(s)
else:
s = old.split('.')
s[-1] = str(int(s[-1]) + 1)
new = '.'.join(s)
if not self.__appstarterver:
self.__appstarterver = new
if new:
newline = line.replace(old, new)
return newline
# 从rc文件中查找版本号并自动 +1
def chversion(self, f):
# 清楚只读属性
os.chmod(f, stat.S_IREAD | stat.S_IWRITE)
rc = open(f, 'r')
lines = rc.readlines()
rc.close()
wlines = []
rc = open(f, 'w')
vpattern = '([0-9]*)[,\.]([0-9]*)[,\.]([0-9]*)[,\.]([0-9]*)'
for line in lines:
nl = self.replaceversion(vpattern, line, 'PRODUCTVERSION')
nl = self.replaceversion(vpattern, nl, 'FILEVERSION')
wlines.append(nl)
rc.writelines(wlines)
rc.flush()
rc.close()
# 签出AppStarter.rc,修改版本号并上传修改
def upprover(self):
# 获取AppStarter.rc的SVN地址
svn = os.path.join(self.__t.svn, T.find_appstarter_rc()).replace('\\', '/')
local = svn.replace(self.__t.svn, self.__t.serverpath).replace('/', '\\')
# check out AppStarter.rc
svndir, localdir = os.path.dirname(svn), os.path.dirname(local)
os.system('RD /S /Q %s' % (localdir)) # 删除目录
cmd = 'svn co --depth=empty %s %s --username %s --password %s' % (svndir, localdir, self.__t.username, self.__t.password)
proc = subprocess.Popen(cmd, stdout = self.__l)
proc.wait()
cmd = 'svn up %s --username %s --password %s' % (local, self.__t.username, self.__t.password)
proc = subprocess.Popen(cmd, stdout = self.__l)
proc.wait()
self.__l.flush()
# 改写rc文件中的版本号
self.chversion(local)
cmd = 'svn commit -m &quot;自动增加版本号&quot; %s --no-unlock --username %s --password %s' \
% (local, self.__t.username, self.__t.password)
subprocess.Popen(cmd, stdout = self.__l).wait()
# iss脚本[Components]下方内容
def isscomponents(self):
retList = ['Name:%s;Description: %s; Types: custom; Flags:checkablealone' %(ver, \
ver.replace('_x86', ' 32位支持').replace('_x64', ' 64位支持').replace('CAD_', 'AutoCAD')) \
for ver in self.__verlist]
return '\n'.join(retList)
# iss脚本[Files]下方内容
def issfiles(self):
retList = ['Source: {#BIN}\\%s\\*; Excludes: VMProtectSDK32.dll; DestDir : {#APP_PATH}\\%s\\ ; Flags : ignoreversion overwritereadonly recursesubdirs; Components : %s'\
%(ver, ver, ver) for ver in self.__verlist]
return '\n'.join(retList)
# 更改ISS打包脚本模板
def isssetup(self):
#读取AppStarter的版本号
targetversion = self.__appstarterver
if self.__t.productversion:
targetversion = self.__t.productversion
#读取打包脚本模板
template = open(self.__isstemplate)
lines = template.readlines()
template.close()
#写真正的打包脚本
iss = open(self.__iss, 'w')
for l in lines:
if l.find('#define APPNAME \'博微配电网工程设计软件2016\'') != -1:
l = '#define APPNAME \'%s\'\r\n' % (self.__t.productname)
if l.find('#define VERSION_NO \"3.2.1.0\"') != -1:
l = '#define VERSION_NO \"%s\"\r\n' % (targetversion)
if l.find('#define LEAST_ONE_COMPONENT \"DefComponent\"') != -1:
l = '#define LEAST_ONE_COMPONENT \"not (%s)\"' % (' or '.join(self.__verlist))
if l.find('[Components]') != -1:
l = '%s%s\n' % (l, self.isscomponents())
if l.find('[Files]') != -1:
l = '%s%s\n' % (l, self.issfiles())
iss.write(l)
iss.flush()
iss.close()
# 执行ISS打包脚本
def runiss(self):
cmd = '\"%s\" \"%s\"'%(self.__issapp, self.__iss)
proc = subprocess.Popen(cmd, stdout = self.__l)
proc.wait()
self.__l.flush()
# 将安装包拷贝至ftp://192.168.2.158
def uploadmsi(self):
setupdir = os.path.join(self.__builder, 'setupPackage')
if not os.path.exists(setupdir):
os.makedirs(setupdir)
uncompletes = {}
remotedir = '\\加速打包系统安装包备份'
# setupPackage下的.exe
files = os.listdir(setupdir)
for f in files:
fullpath = os.path.join(setupdir, f)
remotepath = os.path.join(remotedir, f)
if fullpath[-4:].lower() == '.exe':
uncompletes[fullpath] = remotepath
up = FTPWrapper(uncompletes,'192.168.2.158', 'ftpuser', 'Disk123')
up.upload()
# 开始执行打包流程
def run(self):
self.mergebin()
self.mergemenu()
self.upprover()
self.isssetup()
self.runiss()
# TODO: 开启线程拷贝安装包和PDB
self.__upthread.start()
pass
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/lvwiesuper/py-package.git
git@gitee.com:lvwiesuper/py-package.git
lvwiesuper
py-package
py-package
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891