基于Python和Jenkins的Unity自动化打包方案总结(5)

198 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

基于Python的构建脚本

上篇中,我们配置了Jenkins项目,设置好了参数和构建操作。Jenkins只是一个框架和UI,核心的内容需要我们编写构建脚本实现。本文中,我们使用基于Python3的构建脚本,本篇中就详细分析这个脚本的具体操作。

从Jenkins获取参数

Jenkins中定义的参数,在构建开始时,会被Jenkins注册进系统环境变量中,在Python中,可以使用os.getenv()获取。我们定义的参数类型有string, choice, bool, multi-string,但从环境变量中获取到的都是string,因此需要转换一下,为了方便,我定义了几个函数:

#!/user/bin/python
#coding = utf-8
import shutil
import os
import json
import sys

def getParamString(name,default=''):
	value = os.getenv(name)
	if value == None:
		value = default	
	return value

def getParamInt(name,default=0):
	value = os.getenv(name)
	if value == None:
		value = default
	else:
		value = int(value)	
	return value

def getParamBool(name,default=False):
	value = os.getenv(name)
	if value == None:
		value = default
	elif value == 'true':
		value = True
	else:
		value = False	
	return value

分别获取string, int和bool类型的参数,并提供默认值。而对于Multi-line类型的参数,是获取参数字符串后进行切割得到字符串数组。

开始获取参数

首先我们定义一个main函数,作为整个脚本的主函数:

def main():
    pass
    
if __name__ == '__main__':
    main()

然后,我们首先获取Jenkins的参数,这即包括我们自己定义的构建参数,也包含Jenkins自动定义的一些参数:

def main():
    print('Get parameters from Jenkins.')
    JOB_NAME = getParamString('JOB_NAME')
    BUILD_NUMBER = getParamString('BUILD_NUMBER')
    WORKSPACE = getParamString('WORKSPACE')
    BUILD_TYPE = getParamString('BUILD_TYPE')
    VERSION_NO_BASE = getParamString('VERSION_NO_BASE')
    SVN_VERSION_NO = getParamInt('SVN_VERSION_NO')
    VERSION_TYPE = getParamString('VERSION_TYPE')
    BUILD_TIMESTAMP = getParamString('BUILD_TIMESTAMP')
    UNITY_VERSION = getParamString('UNITY_VERSION', '2021.3.8f1')    
    DEBUG_MODE = getParamBool('DEBUG_MODE', False)
    APP_NAME = getParamString('APP_NAME', 'App')
    BUILD_SCENES = getParamString('BUILD_SCENES').split('\n')
    PACKAGE_SHARED_FOLDER = getParamString('PACKAGE_SHARED_FOLDER')

Jenkins自动定义的参数包含:

  • JOB_NAME: 即Jenkins构建项目的名字
  • BUILD_NUMBER : 是构建的编号,即第N次构建。
  • WORKSPACE : 是Jenkins构建项目的工作目录,我们从svn拉取的工程就是在这个目录中 其他都是我们在构建项目中自定义的打包参数。

分割多行文本参数: 这儿的BUILD_SCENES参数是多行文本,因此使用getParamString获取到所有文本后,使用split('\n')按换行符进行分割,得到字符串数组。

获取Unity可执行文件路径

需要说明的是,本方案中,Unity是直接安装在Jenkins所在的windows服务器上,优势就是简单,对于内网打包足够了,虽然看上去不太高大上。因此需要获取到Unity的路径,我们在构建项目中也配置了Unity的版本号,这样可以根据自己的实际需求去安装相应版本的Unity。

def main()
    # 接上面
    unity = f'C:/Program Files/Unity/Hub/Editor/{UNITY_VERSION}/Editor/Unity.exe'
    print(f'Unity path: {unity}')

获取版本输出目录路径,并准备该目录

同样,输出目录也是在Jenkins所在windows服务器上的某一个目录,对于每个构建项目都有一个单独的目录。这个目录我们并没有使用Jenkins项目的工作目录,即上面获取的WORKSPACE,是因为Workspace里面放的是从svn拉取的项目,且每次拉取前都需要revert。我们使用createOutputFolder()这个方法确保该输出目录是存在的,且是空目录。这说明,每次构建前我们都会将上一次输出目录中的内容清除掉,而不是本次构建后将本次的内容清除掉。这么做的目的是当构建失败时,可以去该目录查看log文件,分析失败原因。因此,我们将Unity执行的log文件的地址也放在这个目录中,即下面定义的log_path

def createOutputFolder(path):
    if os.path.exists(path):
        shutil.rmtree(path)	
    os.mkdir(path)
        
def main()
    # 接上面
    output_folder = f'C:/Project/builds_{JOB_NAME}'    
    log_path = f'{output_folder}/{JOB_NAME}_build_log_{BUILD_NUMBER}'            
    
    createOutputFolder(output_folder)

待续

至此,我们已经做好了所有准备工作,下面就可以开始执行Unity命令行打包了,下篇将详细介绍。