本站文章总数为:165
Search Posts

jenkins unity自动化打包

内容纲要

参考教程

【游戏开发进阶】教你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自动化打包

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注