【游戏开发进阶】教你Unity通过Jenkins实现自动化打包,打包这种事情就交给策划了(保姆级教程 |
您所在的位置:网站首页 › unity启动参数 › 【游戏开发进阶】教你Unity通过Jenkins实现自动化打包,打包这种事情就交给策划了(保姆级教程 |
文章目录
一、前言二、Jenkins简介三、Jenkins的下载与安装1、JDK下载与安装2、Jenkins下载3、Jenkins安装4、Jenkins初始化
四、Jenkins的基本操作1、关闭Jenkins1.1、方式一:暴力杀进程(不推荐)1.2、方式二:以管理员身份执行 net stop jenkins1.3、方式三:通过jenkins.exe来关闭,jenkins stop
2、启动Jenkins2.1、方式一:以管理员身份执行 net start jenkins2.2、方式二:通过jenkins.exe来启动,jenkins start
3、修改端口号4、新建账号5、修改密码6、安装插件6.1、方式一:通过Manage Plugins安装(需要科学上网)6.2、方式二:CLI命令行安装(需要科学上网)6.3、方式三:离线环境安装插件
7、创建并执行任务:Hello World8、执行带参数的任务9、执行python任务10、周期性触发执行任务
五、实战:Unity + Jenkins1、Unity Demo工程1.1、创建Demo工程1.2、切换Android平台1.3、设置JDK、Android SDK、Gradle1.4、设置包名1.5、测试打包
2、编写Editor打包工具2.1、Editor打包工具代码2.2、执行Editor打包工具菜单
3、命令行调用Unity静态函数:打包函数3.1、Unity命令行模式3.2、命令参数解释3.3、批处理脚本3.4、Unity打包工具接收命令行参数
4、Jenkins调用bat脚本5、拓展:python加强版脚本
六、完毕
一、前言
嗨,大家好,我是新发。 前几天我写了一篇文章,【游戏开发进阶】教你自制离线Maven仓库,实现Unity离线环境使用Gradle打包(Unity | Android | 谷歌 | Gradle),里面我提到了Unity使用Jenkins实现自动化打包, 特别说明: 我的电脑系统环境是Windows 10,所以下面的操作环境都是在Windows 10系统下的。 二、Jenkins简介相信很多人都知道Jenkins,不过为了照顾萌新,我这里还是简单说下Jenkins是什么。 Jenkins官网:https://www.jenkins.io/ Jenkins是一个开源软件项目,是基于Java开发的一个持续集成工具(CI),具有友好的操作界面,主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。它可以在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。 注: 什么是集成? 代码由编译、发布和测试、直到上线的一个过程。 什么是持续集成? 高效的、持续性的不断迭代代码的集成工作。 这样讲好像也不是很直观,没关系,它就是一个工具,我们学会使用它就好,下面我来一步步教大家如何使用Jenkins。 三、Jenkins的下载与安装 1、JDK下载与安装因为Jenkins是基于Java开发的,要运行Jenkins需要Java环境,即JDK,所以我们需要先安装下JDK。 JDK下载:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 根据你的系统环境选择对应的JDK下载, 进入Jenkins官网:https://www.jenkins.io/ 点击Download, 双击jenkins.msi,执行安装,设置一下安装路径, 上面安装完毕后会自动启动Jenkins服务,我们可以在任务管理器中看到一个Java的进程,它就是Jenkins的服务进程。 上面我们说到,在任务管理器中可以看到一个Java进程,它就是Jenkins的服务进程, 以管理员身份运行命令net stop jenkins,如下(我是使用管理员身份运行PowerShell来执行命令的) 注意,如果你不是以管理员身份执行上面的命令,则会提示发生系统错误 5 如下(普通账号权限下通过cmd执行命令) 进入Jenkins的安装目录,如下, 以管理员身份执行命令net start jenkins,如下 进入Jenkins的安装目录, 先关闭Jenkins,进入Jenkins的安装目录,可以看到里面有一个jenkins.xml,使用文本编辑器打开它, Jenkins可能需要多人登录,我们可以新建一些账号供其他人登录。 在Jenkins主页的左侧栏中点击Manage Jenkins, 点击账号的齿轮按钮, 在Manage Jenkins页面中,点击Manage Plugins, Jenkins CLI就是Jenkins的命令行工具,类似于MacOS的终端。 我们可以在Jenkins的Manage Jenkins页面中看到Jenkins CLI,点击进入, 如果不清楚插件名可以上Jenkins的插件官网查看:https://plugins.jenkins.io/ 注意,你可能会提示 ERROR: anonymous is missing the Overall/Read permission我们需要在Configure Global Security中勾选项目矩阵授权策略,给Anonymous添加Administer权限即可。 上面两种方式都需要联网,而我们有可能需要把Jenkins部署在离线环境的电脑上(比如内网),这个时候就只能通过离线安装的方式了。 这个时候,我们需要先在有网络(能科学上网)的电脑上下载安装插件。 安装好的插件可以在这个目录中找到: C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins\.jenkins\plugins 我以创建一个HelloWorld任务为例来演示一下。 点击New Item, 如下 有时候我们需要创建带参数的任务。 我们勾选This project is parameterized,然后点击Add Parameter,可以看到它提供了多种类型的参数, 我们看到任务Build中并没有Phython的选项, 最后执行任务,输出日志如下,结果正确, 有时候我们需要周期性地执行任务,比如每天8点触发一次执行任务,或者每隔30分钟触发一次执行任务。 在Build Triggers(触发器)中勾选Build periodically, 语法: *:匹配范围内所有值,例:* * * * * M-N:匹配M~N范围内所有值,例:10-30 * * * * M-N/X:在指定M~N范围内每隔X构建一次,例:10-30/5 * * * * */X:整个有效区间内每隔X构建一次,例:*/30 * * * * A,B,...,Z:匹配多个值,例:10,20,30 * * * * 关于符号H: 为了在系统中生成定时任务,符号H(代表Hash,后面用散列代替)应该用在可能用到的地方,例如:为十几个日常任务配置0 0 * * *将会在午夜产生较大峰值。相比之下,配置H H * * *仍将每天一次执行每个任务,不是都在同一时刻,可以更好的使用有限资源。 符号H可用于范围,例如,H H(0-7) * * *代表凌晨0:00到 上午7:59一段时间。 符号H在一定范围内可被认为是一个随机值,但实际上它是任务名称的一个散列而不是随机函数。 案例: 每30分钟构建一次 H/30 * * * *每2小时构建一次 H H/2 * * *每天早上8点构建一次 0 8 * * *每天的8点,12点,22点,一天构建3次 0 8,12,22 * * *每前半小时中每隔10分钟构建一次 H(0-29)/10 * * * *每个工作日从早上9点45分开始到下午4点45分结束这段时间内每间隔2小时的45分钟那一刻构建一次 45 9-16/2 * * 1-5每月(除了12月)从1号到15号这段时间内某刻构建一次 H H 1,15 1-11 *好了,案例就列举这么多了。 现在,为了演示,我设置为每隔1分钟执行一次, 下面我演示一下通过Jenkins来调用Unity打包Android的APK。 我先画个流程图,方便大家理解: 现在,我们开始吧。 1、Unity Demo工程 1.1、创建Demo工程创建一个Unity工程, 点击 File / Build Settings菜单,切换成Android平台, 点击Edit / Preferences,在External Tools中设置好JDK、Android SDK、Gradle, 在Player Settings中设置一下包名,比如com.linxinfa.test, 添加要打包的场景,手动点击Build,测试一下是否能正常打出APK, 新建一个Editor文件夹, 点击菜单Build / Build Apk, Unity提供了命令行模式给开发者,我们可以写bat脚本来调用Unity中的静态函数,比如我们的打包函数。 格式: Unity程序 -参数 -projectPath 工程地址 -executeMethod 静态函数 例: "D:\software\Unity\2021.1.7f1c1\Editor\Unity.exe" ^ -quit ^ -batchmode ^ -projectPath "E:\UnityProject\UnityDemo" ^ -executeMethod BuildTools.BuildApk ^ -logFile "E:\UnityProject\UnityDemo\output.log"注:为了阅读方便,命令我写成多行,在bat中连接多行的符号是^ 我们可以在Unity官方手册看到具体的命令参数说明:https://docs.unity3d.com/Manual/CommandLineArguments.html -batchmode 在 批处理模式下运行Unity,它不会弹出窗口。当脚本代码在执行过程中发生异常或其他操作失败时Unity将立即退出,并返回代码为1。 -quit 命令执行完毕后将退出Unity编辑器。请注意,这可能会导致错误消息被隐藏(但他们将显示在Editor.log文件) -buildWindowsPlayer 构建一个32位的Windows平台的exe(例如:-buildWindowsPlayer path/to/your/build.exe) -buildWindows64Player 构建一个64位的Windows平台的exe(例如:-buildWindows64Player path/to/your/build.exe) -importPackage 导入一个的package,不会显示导入对话框 -createProject 根据提供的路径建立一个空项目 -projectPath 打开指定路径的项目 -logFile 指定输出的日志文件 -nographics 当运行在批处理模式,不会初始化显卡设备,不需要GPU参与;但如果你需要执行光照烘焙等操作,则不能使用这个参数,因为它需要GPU运算。 -executeMethod 在Unity启动的同时会执行静态方法。也就是说,使用executeMethod我们需要在编辑文件夹有一个脚本并且类里有一个静态函数。 -single-instance 在同一时间只允许一个游戏实例运行。如果另一个实例已在运行,然后再次通过-single-instance启动它的话会调节到现有的这个实例。 -nolog 不产生输出日志。 通常output_log.txt被写在游戏输出目录下的*_Data文件夹中。 3.3、批处理脚本我们知道,一个Unity工程只能打开一个实例,所以如果我们已经手动用Unity打开了工程,此时执行下面这个命令是会报错的, "D:\software\Unity\2021.1.7f1c1\Editor\Unity.exe" ^ -quit ^ -batchmode ^ -projectPath "E:\UnityProject\UnityDemo" ^ -executeMethod BuildTools.BuildApk ^报错如下: Aborting batchmode due to fatal error: It looks like another Unity instance is running with this project open. Multiple Unity instances cannot open the same project. 我们需要先判断Unity是否在运行中,如果是,则先将旧的Unity实例进程杀掉,对应的bat代码如下: ::判断Unity是否运行中 TASKLIST /V /S localhost /U %username%>tmp_process_list.txt TYPE tmp_process_list.txt |FIND "Unity.exe" IF ERRORLEVEL 0 (GOTO UNITY_IS_RUNNING) ELSE (GOTO START_UNITY) :UNITY_IS_RUNNING ::杀掉Unity TASKKILL /F /IM Unity.exe ::停1秒 PING 127.0.0.1 -n 1 >NUL GOTO START_UNITY :START_UNITY :: 此处执行Unity打包另外,我们想要在执行打包时传入一些参数,比如APP名字、版本号等,可以在命令中加上,格式可以自定义,我们只需在后面的C#代码中进行相应的解析即可,例: --productName:%1 --version:%2其中%1表示参数1,%2表示参数2, 完整命令如下: "D:\software\Unity\2021.1.7f1c1\Editor\Unity.exe" ^ -quit ^ -batchmode ^ -projectPath "E:\UnityProject\UnityDemo" ^ -executeMethod BuildTools.BuildApk ^ --productName:%1 ^ --version:%2整合上面的Unity进程判断,最终完整的bat代码如下: ::判断Unity是否运行中 TASKLIST /V /S localhost /U %username%>tmp_process_list.txt TYPE tmp_process_list.txt |FIND "Unity.exe" IF ERRORLEVEL 0 (GOTO UNITY_IS_RUNNING) ELSE (GOTO START_UNITY) :UNITY_IS_RUNNING ::杀掉Unity TASKKILL /F /IM Unity.exe ::停1秒 PING 127.0.0.1 -n 1 >NUL GOTO START_UNITY :START_UNITY :: 此处执行Unity打包 "D:\software\Unity\2021.1.7f1c1\Editor\Unity.exe" ^ -quit ^ -batchmode ^ -projectPath "E:\UnityProject\UnityDemo" ^ -executeMethod BuildTools.BuildApk ^ -logFile "E:\UnityProject\UnityDemo\output.log" ^ --productName:%1 ^ --version:%2将上面的bat代码保存为build_app.bat,我们通过命令行去执行这个build_app.bat,如下: 虽然我们上面的bat脚本传递了包名和版本号两个参数,但是我们在Unity的打包工具中并没有对这两个参数进行解析,现在,我们补上解析参数的逻辑吧。 // 解析命令行参数 string[] args = System.Environment.GetCommandLineArgs(); foreach (var s in args) { if (s.Contains("--productName:")) { string productName= s.Split(':')[1]; // 设置app名字 PlayerSettings.productName = productName; } if (s.Contains("--version:")) { string version = s.Split(':')[1]; // 设置版本号 PlayerSettings.bundleVersion = version; } }打包工具完整代码如下: // BuildTools.cs using UnityEngine; using UnityEditor; public class BuildTools { [MenuItem("Build/Build APK")] public static void BuildApk() { // 解析命令行参数 string[] args = System.Environment.GetCommandLineArgs(); foreach (var s in args) { if (s.Contains("--productName:")) { string productName= s.Split(':')[1]; // 设置app名字 PlayerSettings.productName = productName; } if (s.Contains("--version:")) { string version = s.Split(':')[1]; // 设置版本号 PlayerSettings.bundleVersion = version; } } // 执行打包 BuildPlayerOptions opt = new BuildPlayerOptions(); opt.scenes = new string[] { "Assets/Scenes/SampleScene.unity" }; opt.locationPathName = Application.dataPath + "/../Bin/test.apk"; opt.target = BuildTarget.Android; opt.options = BuildOptions.None; BuildPipeline.BuildPlayer(opt); Debug.Log("Build App Done!"); } }重新执行命令: 我们回到Jenkins页面中,创建一个带参数的任务, appName参数: version参数: 我个人其实不是特别喜欢写bat脚本,我更喜欢写pytho,于是,我就写了个python版的脚本,脚本中我加了监控Unity日志输出的逻辑,方便进行一些判断,画个图: 我们把脚本保存为build_app.py, 好了,就写这么多吧,我是新发,喜欢我的可以点赞、关注,有任何技术上的疑问欢迎评论或留言~ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |