内容目录
参考教程
【游戏开发进阶】教你Unity通过Jenkins实现自动化打包,打包这种事情就交给策划了(保姆级教程 | 命令行打包 | 自动构建)
https://blog.csdn.net/linxinfa/article/details/118816132
Unity发布Android时需要的Android SDK/NDK的下载
https://blog.csdn.net/linxinfa/article/details/88605815
踩坑记录
教程中unity是安装在无空格目录的,安装在有空格目录的unity需要卸载重装,不然python 执行有空格的cmd 批处理很难搞
其中第一个教程的python脚本使用过程中 报错
File "E:\unity_project\project1\build.py", line 44, in monitor_unity_log fd = open(log_file, 'r', encoding='utf-8') TypeError: 'encoding' is an invalid keyword argument for this function
所以
import io 然后open改为io.open 然后放到jenkins执行报错
Traceback (most recent call last): File "E:\unity_project\project1\build.py", line 63, in <module> monitor_unity_log('Build App Done!') File "E:\unity_project\project1\build.py", line 56, in monitor_unity_log print(line) UnicodeEncodeError: 'ascii' codec can't encode characters in position 14-18: ordinal not in range(128) 脚本添加两行 reload(sys) sys.setdefaultencoding('utf8') 在使用unity2021打另一个包的时候的时候由于是破解版,可能是输出日志里有中文报
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 0: invalid start byte 最后参考https://blog.csdn.net/qq_41018465/article/details/119487760 fd = io.open(log_file, 'r', encoding='utf-8')改为 fd = io.open(log_file, 'r', encoding='utf-8', errors='ignore')可以了解决
完整脚本附录
# coding=utf-8 import os import io import sys reload(sys) sys.setdefaultencoding('utf8') import time # 设置你本地的Unity安装目录 unity_exe = 'E:\unity\unity2018\Editor\Unity.exe' # unity工程目录,当前脚本放在unity工程根目录中 project_path = 'E:\unity_project\project1' # 日志 log_file = 'E:\\unity_project\\project1\\unity_log.log' static_func = 'BuildTools.BuildApk' # 杀掉unity进程 def kill_unity(): os.system('taskkill /IM Unity.exe /F') def clear_log(): if os.path.exists(log_file): os.remove(log_file) # 调用unity中我们封装的静态函数 def call_unity_static_func(func): kill_unity() time.sleep(1) clear_log() time.sleep(1) cmd = 'start %s -quit -batchmode -projectPath %s -logFile %s -executeMethod %s --productName:%s --version:%s'%(unity_exe,project_path,log_file,func, sys.argv[1], sys.argv[2]) print('run cmd: ' + cmd) os.system(cmd) # 实时监测unity的log, 参数target_log是我们要监测的目标log, 如果检测到了, 则跳出while循环 def monitor_unity_log(target_log): pos = 0 while True: if os.path.exists(log_file): break else: time.sleep(0.1) while True: fd = fd = io.open(log_file, 'r', encoding='utf-8', errors='ignore') if 0 != pos: fd.seek(pos, 0) while True: line = fd.readline() pos = pos + len(line) if target_log in line: print(u'监测到unity输出了目标log: ' + target_log) fd.close() return if line.strip(): print(line) else: break fd.close() if __name__ == '__main__': call_unity_static_func(static_func) monitor_unity_log('Build App Done!') print('done')
如果说觉得jenkins输出日志过多 可以使用批处理模式
多个脚本打包 比如打 bundle 生成协议proto 然后build WEBGL
jenkins可以使用Extended Choice Parameter 插件
设置一个变量比如为batchmode 为打包内容
然后变量批处理循环打包脚本
python模式 可以显示日志我嫌日志太多,但是如果返回是code 1错误之类的需要改脚本 FOR %%F IN (%batchmode%) DO (call python E:\svn\park\dev\client\park\build.py 1 2 %%F) 批处理模式,简单有效,日志简短,构建失败去看日志就好了 FOR %%F IN (%batchmode%) DO (E:\unity\unity2020.1.0f1\Editor\Unity.exe -quit -batchmode -projectPath "E:\svn\park\dev\client\park" -executeMethod %%F -logFile "E:\svn\park\dev\client\park\output.log" )
1 comment on jenkins unity自动化打包