【Unity】搭建Jenkins打包工作流,远程打热更、构建App

这篇具有很好参考价值的文章主要介绍了【Unity】搭建Jenkins打包工作流,远程打热更、构建App。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Jenkins是团队协作项目打包常用的工作流,不多做介绍。

Jenkins的部署Unity打包环境还是非常简单的:

工作流程如下:

1. 在Jenkins中添加打包配置参数(如: 版本号, 目标平台等), 参数将以UI的形式显示在Jenkins Web界面以便打包前填写参数;

2. 用.bat批处理代码将步骤1的参数保存到json文件,以便打包时获取参数;

3. 用.bat批处理代码调用Unity.exe触发指定C#静态方法,在此方法中执行参数配置和打包逻辑:

Unity.exe -quit -nographics -batchmode -projectPath "%ProjectRoot%" -executeMethod UGF.EditorTools.JenkinsBuilder.BuildApp -logFile "%ProjectRoot%/Tools/Jenkins/UnityBuildLog.log"

具体配置:

1. 下载Jenkins, Jenkins下载链接:Jenkins download and deployment

为了跨平台方便最好选择下载.war格式的Java包;

2. 当前版本的Jenkins要求的JDK版本是11 - 17, 安装后配置JAVA_HOME环境变量(详情自查Java环境安装)

3. 用命令行启动Jenkins:

java -jar jenkins.war

4. Jenkins启动后,在浏览器输入ip地址和端口打开Jenkins Web界面:

如果是本机通过地址 localhost:8080 打开Web界面, 填写命令行窗口显示的Jenkins密码:

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 

5. 创建Jenkins 打包热更资源和打包App两个任务:

①点击新建视图:

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 ②填写视图信息创建视图:

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 视图就相当于文件夹,是为了更好的归类。选择对应的视图就可以在视图下新建Item,即任务;

③ 点击新建Item,创建Freestyle project任务:

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 ④ 选择建好的任务,进入配置界面就可以为打包添加各种变量和批处理执行流程了:

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 ⑤ 勾选This project is parameterized后就可以添加各种变量UI,这些变量用于传递给打包属性,比如版本号、打包目标平台等

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 点击添加参数,以添加的参数会以可交互UI的形式显示在Web界面,一遍打包前填写配置参数:

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 6. 创建好参数后点击Build with Parameters,就可以填写自定义的打包参数

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 7. 使用.bat批处理代码获取打包参数并生成参数的json文件:

进入配置界面,找到Build Steps栏,添加构建步骤,类型选择Execute Windows batch command(Windows批处理脚本),Mac或Linux平台可以选择shell脚本。

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 可以直接贴入批处理命令行,也可以将命令行写入.bat文件中,然后直接填写要执行的.bat文件名;

通过%参数名%的形式获取参数值;将参数值写入json文件代码如下:

生成打热更资源的参数json文件:

echo {"ResourceOutputDir":"%ResourceOutputDir%","Platform":"%Platform%","ForceRebuild":%ForceRebuild%,"ResourceVersion":%ResourceVersion%,"UpdatePrefixUrl":"%UpdatePrefixUrl%","ApplicableVersions":"%ApplicableVersions%","ForceUpdate":%ForceUpdate%,"AppUpdateUrl":"%AppUpdateUrl%","AppUpdateDescription":"%AppUpdateDescription%"}>"%ProjectRoot%\Tools\Jenkins\BuildResourceConfig.json"

生成打App的参数json文件:

echo {"ResourceOutputDir":"%ResourceOutputDir%","Platform":"%Platform%","FullBuild":%FullBuild%,"DebugMode":%DebugMode%,"DevelopmentBuild":%DevelopmentBuild%,"BuildAppBundle":%BuildAppBundle%,"Version":"%Version%","VersionCode":%VersionCode%}>%ProjectRoot%\Tools\Jenkins\BuildAppConfig.json

需要注意的是,字符串参数不能有换行,否则.bat批处理代码会执行异常。

8. 使用命令行调用Unity.exe打包:

可以直接用如下方式,使用批处理调用Unity.exe打包,但是此方式Jenkins无法实时在网页显示打包的Log信息:

Unity.exe -quit -nographics -batchmode -projectPath "%ProjectRoot%" -executeMethod UGF.EditorTools.JenkinsBuilder.BuildApp -logFile "%ProjectRoot%/Tools/Jenkins/UnityBuildLog.log"

最好的选择是安装Jenkins的Unity支持插件,使用插件启动Unity打包可以完美在网页输出Log日志。

① 安装Unity插件

进入Jenkins管理界面:

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 进入插件管理界面:

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 选择Available plugins栏目,搜索安装Unity3d plugin

②  安装Unity3d plugin后,进入Global Tool Configuration配置打包所用的Unity安装路径

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 ③ 再次进入Item配置,添加启动Unity的Build Steps:

【Unity】搭建Jenkins打包工作流,远程打热更、构建App

 启动参数为:

-quit -nographics -batchmode -projectPath "${ProjectRoot}" -executeMethod UGF.EditorTools.JenkinsBuilder.BuildResource -logFile "${ProjectRoot}/Tools/Jenkins/UnityBuildLog.log"

注意,注意Unity3d plugins的获取打包参数的方式与批处理脚本不同,使用${参数名}的方式获取参数值;

其中 -nographics 即不显示Unity图形界面,这样会减少内存消耗,一定程度上能提高打包速度。

 -projectPath "${ProjectRoot}" 为配置项目路径;

-executeMethod UGF.EditorTools.JenkinsBuilder.BuildResource为指定启动Unity后自动执行脚本UGF.EditorTools.JenkinsBuilder的BuildResource()静态方法。

在BuildResource中编写打包逻辑,如先获取生成的json参数文件,根据参数初始化各项设置,然后再打包资源。

9. 打包逻辑:

这里偷懒直接使用之前写过的一个编辑器扩展窗口类AppBuildEditor:【Unity编辑器扩展】扩展Unity工具栏Toolbar, 一键出包/打热更简化打包流程_unitytoolbar_TopGames的博客-CSDN博客

 直接调用编辑器中的方法一键打热更资源,一键打App;

需要注意的是,使用命令行打包并不是启动Unity Editor,所以继承EditorWindow的脚本都不会执行Update和OnGUI方法。如果在Update和OnGUI中有初始化参数的逻辑,需要在Jenkins打包函数中做一遍初始化操作。文章来源地址https://www.toymoban.com/news/detail-435615.html

using System;
using System.IO;
using UnityEditor;
using UnityEngine;

namespace UGF.EditorTools
{
    public class JenkinsBuilder
    {
        const string BuildResourceConfigFile = "Tools/Jenkins/BuildResourceConfig.json";
        const string BuildAppConfigFile = "Tools/Jenkins/BuildAppConfig.json";
        public static void BuildResource()
        {
            Debug.Log("------------------------------Start BuildResource------------------------------");
            var configFile = UtilityBuiltin.ResPath.GetCombinePath(Directory.GetParent(Application.dataPath).FullName, BuildResourceConfigFile);
            if (!File.Exists(configFile))
            {
                Debug.LogError($"构建失败! 构建配置文件不存在:{configFile}");
                return;
            }
            JenkinsBuildResourceConfig configJson = null;
            try
            {
                var jsonStr = File.ReadAllText(configFile);
                configJson = UtilityBuiltin.Json.ToObject<JenkinsBuildResourceConfig>(jsonStr);

            }
            catch (Exception err)
            {
                Debug.LogError($"构建失败! 构建配置文件解析失败:{configFile}, Error:{err.Message}");
                return;
            }
            if (configJson == null)
            {
                Debug.LogError($"构建失败! 反序列构建配置参数失败:{configFile}");
                return;
            }
            
            if (!CheckAndSwitchPlatform(configJson.Platform))
            {
                Debug.LogError($"构建失败! 切换平台({configJson.Platform})失败.");
                return;
            }

            var appBuilder = EditorWindow.GetWindow<AppBuildEidtor>();
            appBuilder.Show();
            appBuilder.JenkinsBuildResource(configJson);
        }
        public static void BuildApp()
        {
            Debug.Log("------------------------------Start BuildApp------------------------------");
            var configFile = UtilityBuiltin.ResPath.GetCombinePath(Directory.GetParent(Application.dataPath).FullName, BuildAppConfigFile);
            if (!File.Exists(configFile))
            {
                Debug.LogError($"构建失败! 构建配置文件不存在:{configFile}");
                return;
            }
            JenkinsBuildAppConfig configJson = null;
            try
            {
                var jsonStr = File.ReadAllText(configFile);
                configJson = UtilityBuiltin.Json.ToObject<JenkinsBuildAppConfig>(jsonStr);

            }
            catch (Exception err)
            {
                Debug.LogError($"构建失败! 构建配置文件解析失败:{configFile}, Error:{err.Message}");
                return;
            }
            if (configJson == null)
            {
                Debug.LogError($"构建失败! 反序列换构建配置失败:{configFile}");
                return;
            }
            if (!CheckAndSwitchPlatform(configJson.Platform))
            {
                Debug.LogError($"构建失败! 切换平台{configJson.Platform}失败.");
                return;
            }
            var appBuilder = EditorWindow.GetWindow<AppBuildEidtor>();
            appBuilder.Show();
            appBuilder.JenkinsBuildApp(configJson);
        }
        /// <summary>
        /// 切换到目标平台
        /// </summary>
        /// <param name="platform"></param>
        /// <returns></returns>
        private static bool CheckAndSwitchPlatform(BuildTarget platform)
        {
            if (EditorUserBuildSettings.activeBuildTarget != platform)
            {
                BuildTargetGroup buildTargetGroup = BuildPipeline.GetBuildTargetGroup(platform);
                Debug.Log($"#########切换平台,TargetGroup:{buildTargetGroup}, BuildTarget:{platform}#######");
                return EditorUserBuildSettings.SwitchActiveBuildTarget(buildTargetGroup, platform);
            }
            return true;
        }
    }

    public class JenkinsBuildResourceConfig
    {
        public string ResourceOutputDir; //构建资源输出目录
        public BuildTarget Platform; //构建平台
        public bool ForceRebuild; //强制重新构建全部资源
        public int ResourceVersion; //资源版本号

        public string UpdatePrefixUrl; //热更资源服务器地址
        public string ApplicableVersions; //资源适用的App版本号
        public bool ForceUpdate; //是否强制更新App
        public string AppUpdateUrl; //App更新地址
        public string AppUpdateDescription; //App更新说明
    }
    public class JenkinsBuildAppConfig
    {
        public string ResourceOutputDir; //构建资源输出目录(只有非全热更需要)
        public BuildTarget Platform; //构建平台
        public bool FullBuild; //打包前先为热更生成AOT dll
        public bool DebugMode; //显示debug窗口
        public bool DevelopmentBuild; //调试模式
        public bool BuildAppBundle; //打Google Play aab包
        public string Version; //App版本号
        public int VersionCode; //App版本编号
    }
}

到了这里,关于【Unity】搭建Jenkins打包工作流,远程打热更、构建App的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 生信工作流框架搭建 | 04-nextflow与Slurm高性能计算

    本篇为biodoge《生信工作流框架搭建》系列笔记的第5篇,该系列将持续更新。 上回生信工作流框架搭建 | 03-nextflow与AWS批量计算为大家提供了nextflow上云的实用教程。虽然AWS批量计算技术含量较大,但毕竟在国内应用场景较少,下面将为大家介绍另一种更为常用的应用:阿里云

    2024年02月15日
    浏览(100)
  • 保姆级教程:从0到1搭建Stable Diffusion XL完整工作流进行AI绘画

    Rocky Ding 公众号:WeThinkIn 【人人都是算法专家】栏目专注于分享Rocky在AI行业中对业务/竞赛/研究/产品维度的思考与感悟。欢迎大家一起交流学习💪 大家好,我是Rocky。 之前Rocky详细介绍了Stable Diffusion(SD)的核心基础知识,SD是目前最流行的开源AI绘画模型,其繁荣的生态大

    2024年02月13日
    浏览(51)
  • 揭秘!我用AI写了一部精彩小说;搭建AI视频创作工作流;一键生成摘要工具清单;大模型创业生死5问 | ShowMeAI日报

    👀 日报周刊合集 | 🎡 生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 作者团队梳理了自2018年以来大语言模型的发展历程,并可视化成了这棵树的生长过程。对于模型的学习和选择,都非常有参考意义。 GIF高清动图 和 JPG高清图有点大,放在咱们的知识星球里了,

    2024年02月10日
    浏览(56)
  • 【工作流】Activiti工作流简介以及Spring Boot 集成 Activiti7

    什么是工作流? 工作流指通过计算机对业务流程进行自动化管理,实现多个参与者按照预定义的流程去自动执行业务流程。 文章源码托管:https://github.com/OUYANGSIHAI/Activiti-learninig Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、

    2024年02月08日
    浏览(53)
  • 云原生离线工作流编排利器 -- 分布式工作流 Argo 集群

    作者:庄宇 在现代的软件开发和数据处理领域,批处理作业(Batch)扮演着重要的角色。它们通常用于数据处理,仿真计算,科学计算等领域,往往需要大规模的计算资源。随着云计算的兴起,阿里云批量计算和 AWS Batch 等云服务提供了管理和运行这些批处理作业的平台。 随

    2024年01月24日
    浏览(84)
  • Camunda 7工作流引擎 API 以及与Springboot集成实现工作流配置全纪录

    项目中需要用到工作流引擎来设计部分业务流程,框架选型最终选择了 Camunda7,关于 Camunda以及 Activity 等其他工作流 引擎的介绍及对比不再介绍,这里只介绍与现有Springboot项目的集成以及具体使用及配置 流程(PROCESS): 通过工具建模最终生成的BPMN文件,里面有整个流程的定

    2024年02月10日
    浏览(58)
  • 云计算工作流调度

    阅读笔记 首先,我们提出了一个更实用的混合云服务流程成本驱动调度模型,该模型在不降低VM部署弹性的情况下更精确地定义资源约束,并考虑了基于间隔的综合收费,包括计费周期和持续使用折扣。 其次,提出了一种改进的基于FWA(烟花算法)的方法来解决这一问题。在

    2024年02月02日
    浏览(71)
  • Activiti 工作流简介

    1、什么是工作流         工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。 1.2、工作流系统   

    2024年02月04日
    浏览(51)
  • Docker工作流

    开发应用 编写Dockerfile 构建Docker镜像 运行Docker容器 测试应用 发布镜像到Hub 迭代更新镜像 首先你需要创建一个应用,这个应用可以是后端应用或者前端应用,任何语言都可以。 比如:我使用IDEA 创建一个Java后端应用,基于Maven构建,工程结构如下: 基于自己的工程来编写

    2024年04月29日
    浏览(36)
  • Git 工作流设计

    前言 常用的工作流有四种 集中式工作流 功能分支流 git flow 工作流 forking 工作流 集中式工作流 集中式工作流,多个功能(feat),bug修复(fix) 在一个分支上开发,极容易出现代码从冲突 功能分支流 新的功能或者bug fork出一个新的分支,在该分支上开发 功能在分支开发完后再合

    2024年02月05日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包