【Unity3D】Jenkins Pipeline流水线自动构建Apk
目录
一、准备阶段
二、创建Pipeline流水线项目
三、注意事项
一、准备阶段
1、安装tomcat 10.0.5
Index of apache-local/tomcat/tomcat-10
2、安装jdk 17
Java Archive Downloads - Java SE 17.0.13 and later
3、下载Jenkins 2.492.1 (.war)包
War Jenkins Packages
将jenkins.war包移动到D:\Program Files\Apache Software Foundation\Tomcat 10.0\webapps下
配置环境变量
CATALINA_HOME
D:\Program Files\Apache Software Foundation\Tomcat 10.0
JAVA_HOME
E:\JDK(保持使用Unity3d所需的JDK 1.8版本)
Path环境变量新增路径
%CATALINA_HOME%\bin
D:\Program Files\Apache Software Foundation\Tomcat 10.0\bin下新建一个setenv.bat文件,tomcat启动jenkins 2.492.1必须使用JDK 17或以上版本(有要求,否则启动会失败)
set JAVA_HOME=D:\Program Files\Java\jdk-17
win + R 输入cmd打开运行命令窗口,输入startup,会执行D:\Program Files\Apache Software Foundation\Tomcat 10.0\bin\startup.bat文件,启动tomcat


可检查上面红框处是否已经指定使用对应的JDK版本,若不是可能构建时也会出各种问题。
启动Tomcat窗口后,不能关闭,我们就是使用它访问Jenkins网页的,默认是http://localhost:8080/jenkins/
关于Jenkins的密码登录、插件安装可参考,插件:Unity3d、Gradle、Pipeline、Pipeline: Stage View、Git plugin、Push Over SSH、Maven Integration Plugin、Docker Pipeline
【Unity】Jenkins自动打包入门小结_jenkins unity-CSDN博客
安装插件镜像地址(文本使用清华大学维护的镜像中心,可正常安装插件)
维护方 镜像中心地址
Jenkins 中文社区 https://updates.jenkins-zh.cn/update-center.json
清华大学 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
华为开源镜像站 https://mirrors.huaweicloud.com/jenkins/updates/update-center.json
腾讯 https://mirrors.cloud.tencent.com/jenkins/updates/update-center.json
ustc https://mirrors.ustc.edu.cn/jenkins/updates/update-center.json
bit https://mirror.bit.edu.cn/jenkins/updates/update-center.json
lework https://cdn.jsdelivr.net/gh/lework/jenkins-update-center/updates/tencent/update-center.json https://cdn.jsdelivr.net/gh/lework/jenkins-update-center/updates/tsinghua/update-center.json https://cdn.jsdelivr.net/gh/lework/jenkins-update-center/updates/ustc/update-center.json https://cdn.jsdelivr.net/gh/lework/jenkins-update-center/updates/bit/update-center.json





修改Jenkins工作区 workspace地址
2个文件:C:\ProgramData\Jenkins\.jenkins\config.xml 和 C:\Users\lenovo\.jenkins\config.xml都修改如下标签,E:/JenkinsFile/workspace是自定义工作区,E:/JenkinsFile/builds是构建记录目录,${ITEM_FULL_NAME}是Jenkins项目名
<workspaceDir>E:/JenkinsFile/workspace/${ITEM_FULL_NAME}</workspaceDir><buildsDir>E:/JenkinsFile/builds/${ITEM_FULL_NAME}</buildsDir>
二、创建Pipeline流水线项目






脚本式Pipeline语法(还有个是声明式SCM,需配合Git拉取 具体百度)
pipeline {agent anyenvironment {JAVA_HOME = "E:/JDK" // 确保这里的路径正确,或者使用环境变量如${JAVA_HOME}}tools {// 指定JDK版本,例如JDK 1.8jdk 'JDK'}//参数设定 参数name、choices要对应上Jenkins设置的参数parameters{choice(name: "Platform",choices:['Android','Window64'],description: "平台")string(name: "BuildPath",defaultValue: "E:/UnityProject/MilkGameFramework_AutoBuildTest/BuildOutput/$Platform/AutoBuildTest", description: "构建输出目录")}stages {stage('打包') {steps {script {//执行一个.sh脚本文件(Shell命令)打包sh "F:/SH/build.sh"echo "打包完成"}}}}
}
F:/SH/build.sh文件如下,和打包Windows时一样的调用Unity去执行静态方法传参打包, 只有2个参数Platform和BuildPath,这2个参数是直接由Jenkins Pipeline的参数设置传入的,想增加其他参数同理添加,Pipeline 脚本式语法百度下(Groovy语法)
echo 'execute unity script to build project ' + $Platform + $BuildPathD:/UnityHubInstallPath/2019.4.0f1/Editor/Unity.exe -quit -batchmode -projectPath E:/UnityProject/MilkGameFramework_AutoBuildTest -executeMethod UnityProjectBuilder.CommandLineBuild -logFile JenkinsBuildUnity.log Platform-$Platform BuildPath-$BuildPath
配置完成后即可去点击构建(构建之前先把Unity相关的脚本配置好)
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEditor.Build.Reporting;public class UnityProjectBuilder
{static string[] GetBuildScenes(){List<string> names = new List<string>();foreach (EditorBuildSettingsScene e in EditorBuildSettings.scenes){if (e == null)continue;if (e.enabled)names.Add(e.path);}return names.ToArray();}//测试用[MenuItem("BuildPackage/Build(Android)")]public static void BuildPackage(){LocalCommandLineBuild(@"E:\UnityProject\MilkGameFramework_AutoBuildTest\BuildOutput\Android\Test", "Android");}/// <summary>/// 此方法是从jienkins上接受 数据的 方法/// </summary>static void CommandLineBuild(){LocalCommandLineBuild(GetJenkinsParameter("BuildPath"), GetJenkinsParameter("Platform")); }static void LocalCommandLineBuild(string path, string platform){try{Debug.Log("Command line build\n------------------\n------------------");string[] scenes = GetBuildScenes();//string path = @"E:\Unity游戏包\Android\消消乐游戏";//这里的路径是打包的路径, 定义//string path = GetJenkinsParameter("BuildPath");Debug.Log(path);for (int i = 0; i < scenes.Length; ++i){Debug.Log(string.Format("Scene[{0}]: \"{1}\"", i, scenes[i]));}// ProjectPackageEditor.BuildByJenkins(GetJenkinsParameter("Platform"), GetJenkinsParameter("AppID"), GetJenkinsParameter("Version"), GetJenkinsParameter("IPAddress"));Debug.Log("Starting Build!");Debug.Log("Platform: " + GetJenkinsParameter("Platform"));//string platform = GetJenkinsParameter("Platform");if (platform == "Android"){Debug.Log("构建安卓开始:" + path + ".apk");BuildReport report = BuildPipeline.BuildPlayer(scenes, path + ".apk", BuildTarget.Android, BuildOptions.CompressWithLz4);if (report.summary.result == BuildResult.Succeeded){Debug.Log("Build succeeded: " + path + ".apk");}else if (report.summary.result == BuildResult.Failed){Debug.LogError("Build failed");foreach (var log in report.steps){if (log.messages != null){foreach (var message in log.messages){Debug.LogError(message.content);}}}}}else if (platform == "IOS"){//BuildPipeline.BuildPlayer(scenes, path, BuildTarget.iOS, BuildOptions.AcceptExternalModificationsToPlayer);}else if (platform == "Window64"){BuildReport report = BuildPipeline.BuildPlayer(scenes, path + ".exe", BuildTarget.StandaloneWindows64, BuildOptions.None);if (report.summary.result == BuildResult.Succeeded){Debug.Log("Build succeeded: " + path + ".exe");}else if (report.summary.result == BuildResult.Failed){Debug.LogError("Build failed");foreach (var log in report.steps){if (log.messages != null){foreach (var message in log.messages){Debug.LogError(message.content);}}}}}}catch (Exception err){Debug.LogError("方法F中捕捉到:" + err.Message);throw;//重新抛出当前正在由catch块处理的异常err}finally{Debug.Log("----------> I am copying! <--------------");}}/// <summary>///解释jekins 传输的参数/// </summary>/// <param name="name"></param>/// <returns></returns>static string GetJenkinsParameter(string name){/*下面是解析这个字符串,用空格分隔,每一个arg是空格分隔后的字符串,然后继续解析出Platform参数和BuildPath参数,注意:$BuildPath是我们Jenkins上定义的参数,它会传入一个字符串路径-quit -batchmode -projectPath D:\下载文件\游戏蛮牛源码\一个消消乐工程 -executeMethod UnityProjectBuilder.CommandLineBuild -logFile JenkinsBuildUnity.log Platform-$Platform BuildPath-$BuildPath*/foreach (string arg in Environment.GetCommandLineArgs()){//Debug.Log("arg:" + arg);if (arg.StartsWith(name)){return arg.Split("-"[0])[1];}}return null;}
}
等待一会打包成功后会得到

若失败了,去查看Jenkins日志

三、注意事项
1、Pipeline插件有最低Jenkins版本要求,最好是使用最新版本的Jenkins(其他版本可能有问题)
2、Tomcat使用11.0.x版本可能有问题,类似Could not create Java Virtual Machine...,故尝试使用Tomcat 10.0.5版本正常,若有类似问题请更换Tomcat版本(具体原因不清楚)
3、Jenkins版本有对应JDK版本要求,本文Jenkins要求必须JDK 17或以上,否则无法正常启动Jenkins
4、Tomcat启动的Jenkins是查找不到Jenkins服务的。
5、Tomcat换版本后,要注意变更环境变量CATALINA_HOME指定的地址,忘了就还是运行旧的Tomcat,即使你是去到具体的Tomcat双击startup.bat运行的,它只认环境变量。
6、Pipeline Script 语法对\敏感,尽量不要用\,全部改为/
7、点击构建时,可能会立刻报错,此时请把Pipeline代码设置为最简单的案例,例如:
pipeline {agent anystages {stage('打包') {steps {script {echo "打包测试"}}}}
}
若发现还是有报错,类似找不到stages、stage、steps等字眼的,很可能还是Pipeline相关的插件没更新好,要全部更新到最新。
8、一种非常奇怪的bug,具体怎么解决也是稀里糊涂的,反正就是一点击构建,瞬间失败,1ms都没执行,查看build log
报错1:Also: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: 3f2d47bc-e83a-4bd4-beae-34a81a0ce08f
groovy.lang.MissingPropertyException: No such property: Platform for class: groovy.lang.Binding
at groovy.lang.Binding.getVariable(Binding.java:63)
at PluginClassLoader for script-security//org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(S
报错2:Also: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: eddf3d49-e60e-4fd1-aeaf-d230d2946b16
java.lang.NullPointerException: Cannot invoke "java.util.Map.size()" because "map" is null
at java.base/java.util.TreeMap.putAll(TreeMap.java:314)
at hudson.slaves.EnvironmentVariablesNodeProperty.buildEnvVars(EnvironmentVariablesNodeProperty.java:87)
jenkins升级后启动job遇到问题java.lang.NullPointerException: Cannot invoke “java.util.Map.size()“ because “map_cannot invoke "java.util.map.size()" because "m" i-CSDN博客
参考如上文章后得知大概是config.xml被我改崩了,因此我直接删了C:\ProgramData\Jenkins\.jenkins\config.xml(记得缓存),然后重启Jenkins,也就是重新关闭tomcat和开启tomcat运行jenkins 去构建一次就会自动生成config.xml,好像还要等它一会儿才会生成,如果还是没生成,可以试试重启电脑,然后正常修改workspace地址即可。之后就能正常打包了,很有可能是我没改<buildsDir>标签,仅改了<workspaceDir>标签问题,也可能是我更换了太多次Jenkins版本,以及也尝试过使用Jenkins.msi安装包形式去安装(安装包形式有Jenkins服务)本文是将所有安装包Jenkins版本卸载,仅使用tomcat+jenkins形式的
相关文章:
【Unity3D】Jenkins Pipeline流水线自动构建Apk
目录 一、准备阶段 二、创建Pipeline流水线项目 三、注意事项 一、准备阶段 1、安装tomcat 10.0.5 Index of apache-local/tomcat/tomcat-10 2、安装jdk 17 Java Archive Downloads - Java SE 17.0.13 and later 3、下载Jenkins 2.492.1 (.war)包 War Jenkins Packa…...
信息收集-Web应用备案产权Whois反查域名枚举DNS记录证书特征相似查询
知识点: 1、信息收集-Web应用-机构产权&域名相关性 2、信息收集-Web应用-DNS&证书&枚举子域名 企业信息 天眼查 https://www.tianyancha.com/ 企业信息 小蓝本 https://www.xiaolanben.com/ 企业信息 爱企查 https://aiqicha.baidu.com/ 企业信息 企查…...
结合实际讲NR系列2—— SIB1
这是在基站抓取的sib1的一条信令 L3MessageContent BCCH-DL-SCH-Messagemessagec1systemInformationBlockType1cellSelectionInfoq-RxLevMin: -64q-QualMin: -19cellAccessRelatedInfoplmn-IdentityListPLMN-IdentityInfoplmn-IdentityListPLMN-IdentitymccMCC-MNC-Digit: 4MC…...
绿虫仿真软件如何预测组件衰减对收益的影响?
绿虫仿真软件通过其精细化的算法模型,能够有效预测组件衰减对光伏电站收益的影响,主要体现在以下几个方面: 1. 数据基础与模型构建 历史数据分析:绿虫软件整合了长达20年的历史数据,涵盖气象、地理、组件型号、逆变器…...
本地部署DeepSeek集成VSCode创建自己的AI助手
文章目录 安装Ollama和CodeGPT安装Ollama安装CodeGPT 下载并配置DeepSeek模型下载聊天模型(deepseek-r1:1.5b)下载自动补全模型(deepseek-coder:1.3b) 使用DeepSeek进行编程辅助配置CodeGPT使用DeepSeek模型开始使用AI助手 ✍️相…...
07贪心 + 动态规划(D1_基础学习)
目录 讲解一:贪心算法 一、什么是贪心算法? 二、贪心算法的应用场景 三、使用Java代码实现贪心算法 四、知识小结 -------------------------------- 讲解二:动态规划算法 一、什么是动态规划算法 二、动态规划算法求解问题需要具备的…...
redis之数据库
文章目录 服务器中的数据库切换数据库数据库键空间读写键空间时的维护操作 设置键的生存时间或过期时间保存过期时间过期键的判定过期键删除策略清性删除策略的实现定期删除策略的实现 总结 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结…...
【竞技宝】电竞世界杯:无畏契约首次入选正式项目!
北京时间2月12日,电竞世界杯基金会(EWCF)与知名游戏开发商拳头游戏(Riot Games)在近日共同宣布达成三年合作伙伴关系。同时,三大顶级电竞项目——《英雄联盟》《英雄联盟:云顶之弈》(…...
Golang GORM系列:GORM 高级查询教程
有效的数据检索是任何程序功能的基础。健壮的Go对象关系映射包(称为GORM)除了标准的CRUD操作之外,还提供了复杂的查询功能。这是学习如何使用GORM进行高级查询的综合资源。我们将涵盖WHERE条件、连接、关联、预加载相关数据,甚至涉…...
智能GUI Agent是什么,有什么应用领域
智能GUI Agent是什么 研究背景与目的:GUI长期主导人机交互,LLM特别是多模态模型的出现,为GUI自动化带来变革,催生了基于LLM的GUI智能体。这些智能体可理解自然语言指令,处理复杂GUI元素并执行操作,改变了用户与软件交互方式。论文旨在梳理该领域发展脉络,剖析关键要素,…...
k8s优雅操作pod容器组
k8s优雅操作pod容器组 回退备份 kubectl get deploy deployName -o yaml>>deployName-bak-date "%Y-%m-%d".yaml获取副本数 replicasecho | kubectl get -o template deploy/deployName --template{{.spec.replicas}}停止容器组 kubectl scale deployment …...
在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.20.2
文章目录 1. 安装 nvm(如果还没有安装的话)2. 加载 nvm 配置3. 列出特定系列的 Node.js 版本(远程):4. 安装 Node.js 16.20.25. 使用指定版本的 Node.js6. 验证安装 在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.…...
MySQL创建存储过程和存储函数
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...
PyQt学习记录03——批量设置水印
0. 目录 PyQt学习记录01——加法计算器 PyQt学习记录02——串口助手 1. 前言 本次主要是为了学习Qt中的 QFileDialog 函数, QFileDialog.getExistingDirectory:用于选择文件夹,返回的是一个文件夹路径。 QFileDialog.getOpenFileName&…...
vivo手机和Windows电脑连接同一个WiFi即可投屏!
虽然现在很多人喜欢刷手机,但是对于长时间需要使用手机办公的人来说,手机屏幕还是太小了,当人一天二十四小时中要花费近十个小时摆弄手机,就会渴望手机屏幕能够大一点,至少看的时候,眼睛舒服一点。 因为嫌弃…...
芯盾时代数据安全产品体系,筑牢数据安全防线
芯盾时代数据安全治理(DSG)框架,以国家法律法规、行业监管标准、行业最佳实践为依据,从数据安全战略出发,以数据分类分级为支撑,构数据安全管理体系、数据安全技术体系、数据安全运营体系与数据安全监督评价…...
异位妊娠唯一相关的是年龄(U型曲线)
异位妊娠唯一相关的是年龄(U型曲线) 简介 异位妊娠,俗称宫外孕,是指受精卵在子宫体腔以外着床发育的异常妊娠过程 。正常情况下,受精卵会在子宫内着床并发育成胎儿,但在异位妊娠中,受精卵却在…...
CTF-WEB: 利用Web消息造成DOM XSS
如果索引中有类似如下代码 <!-- Ads to be inserted here --> <div idads> </div> <script>window.addEventListener(message, function(e) {document.getElementById(ads).innerHTML e.data;}); </script>这行代码的作用是将接收到的消息内容…...
【通俗易懂说模型】一篇弄懂几个经典CNN图像模型(AlexNet、VGGNet、ResNet)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...
Unity世界坐标转成UI坐标
Unity世界坐标转成UI坐标 介绍转换代码合并方法总结 介绍 在Unity中官方提供了很多坐标转换的API,但是还没有一个API是将世界坐标系转换成UI的坐标系,世界坐标系在屏幕中的位置是不固定的所以有时候需要转换成UI坐标系**(注意这里不是转换成…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...
如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
SpringCloud优势
目录 完善的微服务支持 高可用性和容错性 灵活的配置管理 强大的服务网关 分布式追踪能力 丰富的社区生态 易于与其他技术栈集成 完善的微服务支持 Spring Cloud 提供了一整套工具和组件来支持微服务架构的开发,包括服务注册与发现、负载均衡、断路器、配置管理等功能…...
视觉slam--框架
视觉里程计的框架 传感器 VO--front end VO的缺点 后端--back end 后端对什么数据进行优化 利用什么数据进行优化的 后端是怎么进行优化的 回环检测 建图 建图是指构建地图的过程。 构建的地图是点云地图还是什么信息的地图? 建图并没有一个固定的形式和算法…...
2025-06-01-Hive 技术及应用介绍
Hive 技术及应用介绍 参考资料 Hive 技术原理Hive 架构及应用介绍Hive - 小海哥哥 de - 博客园https://cwiki.apache.org/confluence/display/Hive/Home(官方文档) Apache Hive 是基于 Hadoop 构建的数据仓库工具,它为海量结构化数据提供类 SQL 的查询能力…...
