携手创作,共同成长!这是我参与「掘金日新计划 · 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命令行打包了,下篇将详细介绍。