记录Jenkins H5编译、打包、发布
#!/usr/bin/env python3
# -*- coding:GBK -*-
# author by Michael Ho
# contact:herui@gszq.com
import os, shutil, time
# npm编译
def npm_compile(npm_path, npm_source, s_dir):
"""
:param npm_path:
:param path:
:return:
"""
os.chdir(s_dir)
print("当前工作目录是:{}".format(s_dir))
print("开始从 {} 下载依赖包... ...".format(npm_source))
npm_install = npm_path + r" install --registry=" + npm_source
os.system(npm_install)
print("开始编译... ...")
npm_build = npm_path + r" run build"
os.system(npm_build)
# 加密成.d文件
def H5_encode(encode_tool, s_dir, d_dir):
"""
:param encode_tool: H5Encode加密工具
:param s_path: workspace源代码路径
:param d_path: 加密后的代码路径
"""
if os.path.exists(d_dir):
shutil.rmtree(d_dir)
os.makedirs(d_dir)
if not os.path.exists(encode_tool):
print("加密工具不存在,请检查... ...")
exit(0)
else:
H5_Encode_CMD = encode_tool + r" -D " + s_dir + r"\ " + d_dir + r"\ 0"
print(H5_Encode_CMD)
os.system(H5_Encode_CMD)
# 打包归档
def zip_file(zip_exe, path, file):
"""
:param zip_exe: 需要打包的路径
:param path: 需要打包的路径
:param file: 压缩包的名称
:return:
"""
if os.path.exists(file):
os.remove(file)
zip_CMD = zip_exe + r" a " + file + r" " + path + r"\*"
print(zip_CMD)
print("{} 归档中... ...".format(file))
os.system(zip_CMD)
if not os.path.exists(file):
print("{} 归档失败, 请检查 Jenkins 上脚本... ...".format(file))
exit(0)
# 生成小包函数
def copy_app_H5(x_root, s_dir, d_dir):
if not os.path.exists(x_root):
print("小包目录不存在,构建停止 ... ...")
exit(0)
if os.path.exists(d_dir):
shutil.rmtree(d_dir)
for root, dirs, files in os.walk(x_root):
for d in dirs:
d_name = os.path.join(root, d).rstrip()
d_dir_name = d_name.replace(x_root, d_dir)
if not os.path.exists(d_dir_name):
os.makedirs(d_dir_name)
for f_name in files:
f_name = os.path.join(root, f_name).rstrip()
if(os.path.splitext(f_name)[1] == ".d"):
s_file = f_name.replace(x_root, s_dir)
d_file = f_name.replace(x_root, d_dir)
shutil.copyfile(s_file, d_file)
# 判断复制是否成功
if(s_file.replace(s_dir, "") == d_file.replace(d_dir, "")):
print("{} ---> 拷贝成功 ^.^".format(d_file))
else:
print("拷贝过程发生错误,请检查...")
# 全量包部署
def copy_all_file(d_qdymanage, s_dir, d_dir):
if os.path.exists(d_qdymanage):
for file in os.listdir(d_dir):
file = os.path.join(d_dir, file)
if os.path.isfile(file):
os.remove(file)
if os.path.isdir(file) and file != d_qdymanage:
shutil.rmtree(file) # 删除除qdymanage目录以外所有的目录和文件
else:
print("{} 目录不存在, 请检查! 构建停止... ...".format(d_qdymanage))
exit(0)
for root, dirs, files in os.walk(s_dir):
for d in dirs:
s_dir_name = os.path.join(root, d) # 列出workspace里面的子目录
d_dir_name = s_dir_name.replace(s_dir, d_dir)
if not os.path.exists(d_dir_name):
os.makedirs(d_dir_name) # 创建zzinfo里面的子目录
for f in files:
s_file_name = os.path.join(root, f) # 列出workspace里面的所有文件的绝对路径
d_file_name = s_file_name.replace(s_dir, d_dir) # 列出目标文件的绝对路径
print("{0} ---> {1}".format(s_file_name, d_file_name).rstrip())
shutil.copyfile(s_file_name, d_file_name)
# main函数入口
if __name__ == "__main__":
os.environ['VERSION'] = r"7_06_001"
# 0.编译
npm_path = r'"C:\Program Files\nodejs\npm"'
npm_source = r"https://registry.npm.taobao.org"
s_dir = os.getenv("WORKSPACE")
npm_compile(npm_path, npm_source, s_dir)
# 1.加密
encode_tool = r"d:\Jenkins\H5Encode.exe"
m_dir = s_dir + r"\dest" # %workspace%\dist 是H5源代码目录
d_dir = r"d:\Jenkins\frontend_encrypt"
H5_encode(encode_tool, m_dir, d_dir)
# 2.打包归档(小包)
# 2.1 生成小包
x_root = r"d:\H5_app_src"
xs_dir = d_dir
xd_dir = r"d:\Jenkins\H5_app"
copy_app_H5(x_root, xs_dir, xd_dir)
# 2.2 小包打包
zip_exe = r'"C:\"Program Files"\7-Zip\7z.exe"'
src_file = r"H5_" + os.getenv("VERSION") + "_src_" + os.getenv("TEST_ENVIRONMENT") + "_" + time.strftime('%Y%m%d') + ".7z"
src_dir = xd_dir
zip_file(zip_exe, src_dir, src_file)
# 3.打包归档(全量包)
file = r"H5_" + os.getenv("VERSION") + r"_" + os.getenv("TEST_ENVIRONMENT") + "_" + time.strftime('%Y%m%d') + ".7z"
zip_file(zip_exe, d_dir, file)
# 4.170环境部署全量包
if os.getenv("TEST_ENVIRONMENT") == "js_test":
d_qdymanage = r"d:\zzinfo\mszx\download\qdymanage"
all_s_dir = d_dir
all_d_dir = r"d:\zzinfo\mszx\download"
copy_all_file(d_qdymanage, all_s_dir, all_d_dir)