记录Jenkins H5编译、打包、发布
#!/usr/bin/env python3 # -*- coding:GBK -*- # author by Michael Ho # contact:rui.he@geekthings.com.cn 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)
原文:https://www.cnblogs.com/herui1991/p/12718169.html