From 2b086a86324b93a72d74e30be9441e3beee66161 Mon Sep 17 00:00:00 2001 From: ZhuoZhou Date: Tue, 6 May 2025 17:48:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=80=9A=E8=BF=87git=20hash?= =?UTF-8?q?=E6=9D=A5=E5=88=A4=E6=96=AD=E8=B5=84=E6=BA=90=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tools/build_package/build_package.py | 187 +++++++++++++++--- FindVerticalBundleBuilder/Tools/config.py | 21 ++ 2 files changed, 185 insertions(+), 23 deletions(-) diff --git a/FindVerticalBundleBuilder/Tools/build_package/build_package.py b/FindVerticalBundleBuilder/Tools/build_package/build_package.py index 837f333..4ee3977 100644 --- a/FindVerticalBundleBuilder/Tools/build_package/build_package.py +++ b/FindVerticalBundleBuilder/Tools/build_package/build_package.py @@ -25,6 +25,27 @@ from optparse import OptionParser from ipm.wechat_alert import wechat_alert alert = wechat_alert() +input_old_hash = '' +input_new_hash = '' +modifyLevelStr = '' +if len(sys.argv) > 1: + input_old_hash = sys.argv[1] + if input_old_hash == 'none' or input_old_hash == '_': + input_old_hash = '' +if len(sys.argv) > 2: + input_new_hash = sys.argv[2] + if input_new_hash == 'none' or input_new_hash == '_': + input_new_hash = '' +if len(sys.argv) > 3: + modifyLevelStr = sys.argv[3] + +env = config.machine_env_config.Local_Path.value +workspace_path = env['workspace_path'] +unity_install_path = env['unity_install_path'] +art_proj_path = config.getArtProjPath(env) +asset_build_proj_path = config.getAssetsBuildProjPath(env) +unity_proj_path = config.getUnityProjPath(env) + # 主机IP IP = "" # Unity执行文件路径 @@ -46,6 +67,110 @@ def check_dir(path): if not os.path.exists(path): os.makedirs(path) +git_commit_hash_file = os.path.join(workspace_path, 'find_object_git_commit_hash.txt') +git_hash_change_record_file = os.path.join(workspace_path, 'find_object_git_hash_change_record.txt') + +def isGitCommitFileExist(): + return os.path.exists(git_commit_hash_file) + +def writeGitCommitLog(git_log_hash): + # 写入git_commit.txt文件 + with open(git_commit_hash_file, 'w') as f: + f.write(git_log_hash) + +def recordNewGitHash(git_log_hash): + # 文件末尾新增一行记录新的git hash + with open(git_hash_change_record_file, 'a') as f: + f.write(git_log_hash + '\n') + +def isRecordGitHashFileExist(): + return os.path.exists(git_hash_change_record_file) + +def getCurrentGitHash(): + current_commit_hash = '' + if isGitCommitFileExist(): + with open(git_commit_hash_file, 'r') as f: + current_commit_hash = f.read() + print(f"current hash:{current_commit_hash}") + return current_commit_hash + +def getNewGitHash(): + sh1 = f"cd {art_proj_path}" + sh2 = f"git log -1 --pretty=format:\"%H\"" + f = os.popen(f"{sh1} && {sh2}") + new_commit_hash = f.read() + print(f"new hash:{new_commit_hash}") + return new_commit_hash + +# endregion + +def getModifyPic(git_dir): + pass + if input_old_hash != '' and input_new_hash != '': + current_commit_hash = input_old_hash + new_commit_hash = input_new_hash + else: + current_commit_hash = getCurrentGitHash() + new_commit_hash = getNewGitHash() + if not isGitCommitFileExist(): + writeGitCommitLog(new_commit_hash) + current_commit_hash = new_commit_hash + if not isRecordGitHashFileExist(): + recordNewGitHash(new_commit_hash) + if current_commit_hash == new_commit_hash: + config.notification_helper.append_msg("当前commit hash与新commit hash相同,不需要构建") + return None + sh1 = f"cd {git_dir}" + sh2 = f"git log {new_commit_hash}...{current_commit_hash} --name-status" + f = os.popen(f"{sh1} && {sh2}") + modify_content_lines = f.readlines() + return modify_content_lines + + +def getModifyIdList(modify_content_lines): + assetLevelIdList = [] + # thumLevelIdList = [] + if modify_content_lines is None: + return assetLevelIdList#, thumLevelIdList + + for line in modify_content_lines: + levelId = None + if line.startswith('D'): + continue + if '.zip' not in line: + continue + if '\t' in line and '\n' in line: + levelId = line.split('\t')[-1].split('/')[-1].split('.')[0] + else: + levelId = line.split('/')[-1].split('.')[0] + + if levelId is None: + continue + + if '.zip' in line and levelId not in assetLevelIdList: + assetLevelIdList.append(levelId) + + # if '.jpg' in line and levelId not in thumLevelIdList: + # thumLevelIdList.append(levelId) + return assetLevelIdList#, thumLevelIdList + + +def generateLevelIdListByGitLog(): + pass + global _levelModifiedIdList_ + modify_content_lines = getModifyPic(art_proj_path) + _levelModifiedIdList_ = getModifyIdList(modify_content_lines) + if len(modifyLevelStr) > 0: + manual_modify_level_list = modifyLevelStr.split('#') + for level_id in manual_modify_level_list: + # asset_file = os.path.join(art_proj_path, 'LevelPackages', f'{level_id}.unitypackage') + # if not os.path.exists(asset_file): + # config.notification_helper.append_msg(f'{level_id}资源文件不存在,无法打包') + if level_id not in _levelModifiedIdList_: + _levelModifiedIdList_.append(level_id) + + print(f'资源修改列表:{str(_levelModifiedIdList_)}') + config.notification_helper.append_msg(f"构建资源列表: {str(_levelModifiedIdList_)}") def build_package(opts, modify_files): """ @@ -113,6 +238,7 @@ def check_params(opts): if __name__ == '__main__': + # region 创建打包的命令参数 parser = OptionParser() # parser.add_option("-v", "--appversion", dest="appversion", help=('app版本, 显示在app详情内的')) # parser.add_option("-r", "--resversion", dest="resversion", help=('资源版本版本')) @@ -132,15 +258,16 @@ if __name__ == '__main__': opts.buildtype = "BuildBundle" # 本地自测适用 - # opts.aab = "false" - # opts.mode = "Debug" - # opts.platform = "Android" - # opts.assets = "/Users/a0729/gogs.git/find-vertical-art" - # opts.resources = "/Users/a0729/gogs.git/find-vertical-bundle-resource" - # opts.unityexe = "/Applications/Unity/Hub/Editor/2021.3.32f1/Unity.app/Contents/MacOS/Unity" - # opts.log = "log/build.log" - # opts.upload = "false" + opts.aab = "false" + opts.mode = "Debug" + opts.platform = "Android" + opts.assets = "/Users/a0729/gogs.git/find-vertical-art" + opts.resources = "/Users/a0729/gogs.git/find-vertical-bundle-resource" + opts.unityexe = "/Applications/Unity/Hub/Editor/2021.3.32f1/Unity.app/Contents/MacOS/Unity" + opts.log = "log/build.log" + opts.upload = "false" # opts.special = "main_30point_ws20250422_1" + opts.special = "0" # is_upload = True if opts.upload == "true" else False @@ -158,6 +285,7 @@ if __name__ == '__main__': if opts.unityexe != "": UNITY_PATH = opts.unityexe RESOURCE_ROOT = os.path.abspath(os.path.join(curr_dir, "../../Bundles")) + # endregion mainPlayType = MainPlayType() # region 清空各玩法软链接资源列表 @@ -188,22 +316,30 @@ if __name__ == '__main__': os.remove(os.path.join(root, file)) # endregion + # region 检索需要需要打包的关卡 modify_files = [] if opts.special != "0": modify_files = opts.special.split(",") else: # 获取最近6小时内的提交记录,用于解析psd - platform = "android" if opts.platform == "Android" else "ios" - with open(os.path.join(opts.assets, f"git_{platform}_commit_change_files.txt"), "r") as f: - lines = f.readlines() - for aline in lines: - aline = aline.replace("\"", "").replace("\n", "").replace("\r", "") - if aline.endswith(".zip"): - base_dir = aline.split("/")[0] - file_name = os.path.basename(aline) - asset_id = file_name.split(".")[0] - if asset_id not in modify_files: - modify_files.append(asset_id) + # platform = "android" if opts.platform == "Android" else "ios" + # with open(os.path.join(opts.assets, f"git_{platform}_commit_change_files.txt"), "r") as f: + # lines = f.readlines() + # for aline in lines: + # aline = aline.replace("\"", "").replace("\n", "").replace("\r", "") + # if aline.endswith(".zip"): + # base_dir = aline.split("/")[0] + # file_name = os.path.basename(aline) + # asset_id = file_name.split(".")[0] + # if asset_id not in modify_files: + # modify_files.append(asset_id) + + #获取git 提交来得到修改的关卡 + generateLevelIdListByGitLog() + if len(_levelModifiedIdList_) <= 0: + config.notification_helper.append_msg('没有需要构建的资源') + else: + modify_files = _levelModifiedIdList_ print(f"modify_files = {modify_files}") # alert.alert(f"构建资源列表:{str(modify_files)}") tmstp1 = time.time() @@ -216,8 +352,9 @@ if __name__ == '__main__': tmstp2 = time.time() print(f"{len(modify_files)}个资源, 解析psd耗时:{tmstp2 - tmstp1}") config.notification_helper.append_msg(f"解析{len(modify_files)}个psd资源耗时:{(tmstp2 - tmstp1):.0f}s") + # endregion - # 建立需要打包的资源软连接 + # region 建立需要打包的资源软连接 metas = [] for asset_id in modify_files: asset_gameplay = None @@ -254,8 +391,9 @@ if __name__ == '__main__': else: metas.append(["Thum/{}".format(asset_gameplay), dest]) print(f"{asset_gameplay}玩法,{asset_id}资源建立软链接") + # endregion - # 获取资源不同点个数 + # region 获取资源不同点个数 asset_find_num_dict = {} for asset_id in modify_files: asset_gameplay = None @@ -277,8 +415,9 @@ if __name__ == '__main__': print(f"关卡资源ID asset_gameplay:{asset_gameplay},asset_id={asset_id} 不存在titem目录") asset_find_num_dict[asset_id] = find_num print(f"关卡资源ID asset_id = {asset_id}, 寻找物品个数find_num = {find_num}") + # endregion - # 开始打包 + # region 开始打包 以及上传资源 tmBuildPackage1 = time.time() is_build_success, ab_path = build_package(opts, modify_files) tmBuildPackage2 = time.time() @@ -299,12 +438,14 @@ if __name__ == '__main__': tmUpdateSheet2 = time.time() config.notification_helper.append_msg(f"{opts.platform}平台所有资源表更新完成!") print(f"{len(modify_files)}个资源, 更新文档耗时:{tmUpdateSheet2 - tmUpdateSheet1}") + # endregion - # 打包完成后,将meta文件保存到opts.resources + # region 打包完成后,将meta文件保存到opts.resources for meta in metas: print(f"meta = {meta}") print(f"copy {meta[1]} to {os.path.join(opts.resources, 'Raw', meta[0])}") shutil.copy(meta[1], os.path.join(opts.resources, 'Raw', meta[0])) + # endregion config.notification_helper.append_end_msg() alert.alert(config.notification_helper.get_msg(), config.notification_helper.get_people_list()) diff --git a/FindVerticalBundleBuilder/Tools/config.py b/FindVerticalBundleBuilder/Tools/config.py index b46d61f..75daf90 100644 --- a/FindVerticalBundleBuilder/Tools/config.py +++ b/FindVerticalBundleBuilder/Tools/config.py @@ -71,5 +71,26 @@ meta_spriteatlas = 'spriteatlas' meta_hash = 'hash' meta_md5 = 'md5' +# 机器环境配置 +class machine_env_config(enum.Enum): + # 成都MacStudio打包机 + CD_MAC_STUDIO = { + # differences工程环境路径 + "workspace_path": "/Volumes/Predator/find-vertical", + # unity安装路径 + "unity_install_path": "/Applications/Unity/Hub/Editor/2020.3.32f1/Unity.app/Contents/MacOS/Unity", + } + Local_Path = { + "workspace_path": "/Users/a0729/gogs.git", + "unity_install_path": "/Applications/Unity/Hub/Editor/2021.3.32f1/Unity.app/Contents/MacOS/Unity", + } +def getArtProjPath(env: machine_env_config): + return env['workspace_path'] + '/find-vertical-art' + +def getAssetsBuildProjPath(env: machine_env_config): + return env['workspace_path'] + '/find-vertical-bundle-builder' + +def getUnityProjPath(env: machine_env_config): + return getAssetsBuildProjPath(env) + '/find-vertical-bundle-resource'