Jenkins自动化打包

news2024/11/11 5:45:12

Jenkins自动化打包

下载安装

我们直接从官网https://www.jenkins.io/download/ 下载所需的Jenkins文件
在这里插入图片描述

如上图所示, 选择Windows版本,下面就是一路安装即可,需要注意的是,选择作为系统服务选项, 不要自己设置账号密码登录.

Web配置

安装完根据提示在浏览器打开 http://localhost:8080/ 即可进入Jenkins部署界面

在这里插入图片描述

按照上图中的红色路径找到initialAdminPassword文件并打开 将文件内容粘贴进去, 点击继续

在这里插入图片描述

这里我们选择推荐的插件进行安装

在这里插入图片描述

等待进度条跑完即可

在这里插入图片描述

我们选择Skip, 跳过设置继续使用admin用户登录

在这里插入图片描述

选择Save and Finish

在这里插入图片描述

选择Start using Jenkins

在这里插入图片描述

Unity每日定时打包

就是Jenkins的web界面, 我们在里面配置一个自动打包流程, 比如一个定时任务, 每天凌晨自动打包. 下面就演示如何操作

在这里插入图片描述

我们选择左边的New Item创建一个任务

在这里插入图片描述

按照上图的步骤1,2,3 点击OK之后创建任务

在这里插入图片描述

在上图中添加上任务描述, 然后滚动到后面的BuildSteps里面选择Execute Windows batch command

在这里插入图片描述

在Command里面填写上要执行的python脚本

在这里插入图片描述

点击Save保存

创建打包C#脚本

using UnityEditor;
using UnityEditor.Build.Reporting;
using UnityEngine;

namespace Jenkins
{
    public class BuildScript
    {
        [MenuItem("Build/Build for Android")]
        public static void BuildForAndroid()
        {
            var buildPlayerOptions = new BuildPlayerOptions()
            {
                scenes = new[]
                {
                    "Assets/LemonFramework/Jenkins/Sample/Sample.unity"
                },
                locationPathName = "Jenkins.apk",
                target = BuildTarget.Android,
                options = BuildOptions.None
            };
            var report = BuildPipeline.BuildPlayer(buildPlayerOptions);
            var summary = report.summary;
            if (summary.result == BuildResult.Succeeded)
            {
                Debug.Log("Build succeeded: " + summary.totalSize + " bytes");
            }

            if (summary.result == BuildResult.Failed)
            {
                Debug.LogError("Build failed");
            }
        }
    }
}

创建打包Python脚本

#coding:utf-8
import os
import sys
import subprocess
import time
from pathlib import Path
import subprocess
sys.path.append(os.path.abspath(os.path.join(os.path.realpath(__file__), "../")))

CUR_PATH = os.getcwd()
PROJ_PATH = os.path.join(CUR_PATH, "../")
BRANCH = 'gl-master'

# Unity的执行路径
unity_path = "C:/Program Files/Unity/Editor/Unity.exe"
# Unity项目的路径
project_path = "E:/Projects/Lemon/Lemon.Framework.Jenkins"
# 要执行的Unity编辑器自定义方法的名称,这个方法在Unity编辑器扩展脚本中定义
method_name = "Jenkins.BuildScript.BuildForAndroid"
# 打包后的APK文件路径
apk_output_path = "E:/Projects/Lemon/Lemon.Framework.Jenkins/Jenkins.apk"

# 拼接Unity命令行
cmd = [
    unity_path,
    "-quit",  # 表示Unity完成命令后关闭
    "-batchmode",  # 不显示界面和对话框
    "-nographics",  # 在支持的平台上不初始化图形设备
    "-silent-crashes",  # 自动处理崩溃情况
    "-projectPath", project_path,
    "-executeMethod", method_name,
    "-logFile",  # 可以指定日志文件路径,例如"-logFile", "unity.log"
    "-buildOutput", apk_output_path,
]

# 杀掉unity进程
def kill_unity():
    os.system('taskkill /IM Unity.exe /F')

def git_reset_pull():
	os.chdir(PROJ_PATH)
	cmd = 'git fetch --all' #git 拉取命令
	result = os.system(cmd)	
	cmd = 'git reset --hard HEAD' #git reset命令
	result = os.system(cmd)
	cmd = r"{0}{1}".format("git checkout ",BRANCH)
	result = os.system(cmd)
	cmd = 'git clean -fd' #git clean 命令
	result = os.system(cmd)
	cmd = 'git pull --rebase' #git pull命令
	result = os.system(cmd)

	if result == 0:
		print('git update succes')
	else:
		print('git update fail')

# 调用unity中我们封装的静态函数
def build():    
	# 执行命令行
	# subprocess.call(cmd) 注释掉这行,并替换为下面的代码,以阻塞直到命令完成并捕获输出
	process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
	stdout, stderr = process.communicate()

	if process.returncode == 0:
		print("Build succeeded")
		print(stdout.decode("utf-8"))  # 显示标准输出
	else:
		print("Build failed")
		print(stderr.decode("utf-8"))  # 显示错误输出
		sys.exit(1)
 
if __name__ == '__main__':	
	now = time.time() 
	kill_unity()
	#git_reset_pull()
	build()
	print(f'total take time {time.time()-now} seconds')
	print("Done!")

在这里插入图片描述

点击左侧Build Now即可生成Android Apk

定时任务

在Configure里设定每天早上6点定时打包,这样一大早有有热乎的apk给QA做测试了

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1421827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解SpringCloud微服务技术栈:深入ElasticSearch(1)——数据聚合

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:ElasticSearch实战(旅游类项目) 📚订阅专栏&#x…

【RT-DETR改进涨点】ResNet18、34、50、101等多个版本移植到ultralytics仓库(RT-DETR官方一比一移植)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文是本专栏的第一篇改进,我将RT-DETR官方版本中的ResNet18、ResNet34、ResNet50、ResNet101移植到ultralytics仓库,网上很多改进机制是将基础版本的也就是2015年发布的ResNet移植到ultralytics仓库中,但是其实…

【Emgu CV教程】6.6、图像平滑之GaussianBlur()高斯滤波

文章目录 一、介绍1.原理2.函数介绍 二、举例1.原始素材2.代码3.运行结果 一、介绍 1.原理 高斯滤波是Emgu CV里面最常用的滤波,因为它在平滑图像的同时,可以更好的保留轮廓和边缘信息。下面这段来自百度百科的介绍: 高斯滤波是一种线性平滑…

思腾合力深思系列「IW4230-4GR」可扩展处理器的多场景适配服务器

思腾合力深思系列IW4230-4GR,采用第四代Intel Xeon Eagle Stream可扩展处理器的多场景适配服务器,支持4张双宽GPU卡。 思腾合力深思系列IW4230-4GR GPU服务器/工作站支持双路第四代IntelXeon Eagle Stream系列可扩展处理器,具有高性能、高密度…

【史上最全的接口与抽象类】

Java异常处理与try-catch-finally 抽象类和接口是Java中用于实现抽象和多态的关键概念。 抽象类的定义和语法:接口的定义和语法:接口和抽象类的区别主要在以下几个方面: 抽象类和接口是Java中用于实现抽象和多态的关键概念。 抽象类的定义和…

【Java异常处理与try-catch-finally】

Java异常处理与try-catch-finally try块是被监视的代码块,可能会发生异常的地方。当try块中的代码抛出了异常,程序会立即转入catch块,catch块根据捕获的异常类型进行处理。 Java异常处理是一种机制,用于捕获并处理在程序执行过程中…

用GPT写PHP框架

参考https://www.askchat.ai?r237422 写一个mvc框架 上面是简单的案例,完整的PHP框架,其核心通常包含以下几个关键组件: 1. 路由(Routing):路由组件负责解析请求的URL,并将其映射到相应的控制…

CAD-autolisp(四)——编译

目录 一、编译1.1 界面操作1.2 生成的应用程序(二选一) 二、后续学习 一、编译 编译:lsp后缀名为原文件,后缀名为fas、vlx为编译后文件,其会把sld、dcl、lsp等文件都编译进一个应用程序文件中加载:cad命令…

写作业考试用ChatGPT,留学如何防范“学术不端”危机?

近日,哈佛校长克洛迪娜盖伊在校园“反犹风波”中因立场问题被迫辞职。此外,哈佛大学相关调查委员会还发现盖伊在学术论文中存在错误引用资料来源等问题。对于种种学术不端行为,留学生如何防范?在ChatGPT时代,出国留学如…

C++ 数论相关题目,博弈论,SG函数,集合-Nim游戏

给定 n 堆石子以及一个由 k 个不同正整数构成的数字集合 S 。 现在有两位玩家轮流操作,每次操作可以从任意一堆石子中拿取石子,每次拿取的石子数量必须包含于集合 S ,最后无法进行操作的人视为失败。 问如果两人都采用最优策略,…

保护医疗数据不受威胁:MPLS专线在医疗网络安全中的角色

随着数字技术的快速发展,医疗行业正在经历一场革命。从电子健康记录到远程医疗服务,数字化不仅提高了效率,也带来了前所未有的挑战--尤其是关于数据安全和隐私保护的挑战。在这样的背景下,如何确保敏感的医疗数据安全传输&#xf…

Qt6入门教程 14:QToolButton

目录 一.简介 二.常用接口 1.void setMenu(QMenu * menu) 2.void setPopupMode(ToolButtonPopupMode mode) 3.void setToolButtonStyle(Qt::ToolButtonStyle style) 4.void setArrowType(Qt::ArrowType type) 5.void setDefaultAction(QAction * action) 三.实战演练 1…

C/C++ (stdio.h)标准库详解

cstdio,在C语言中称为stdio.h。该库使用所谓的流与物理设备(如键盘、打印机、终端)或系统支持的任何其他类型的文件一起操作。 在本文将会通过介绍函数参数,举出实际的简单例子来帮助大家快速上手使用函数。 目录 一、流 二、库函数 1、F…

Zerosync:构建基于STARK的Bitcoin证明系统

1. 引言 前序博客: BitcoinSTARK: ZeroSync & Khepri Robin Linus、Tino Steffens、Lukas George 等人成立了一个名为 ZeroSync 协会(ZeroSync Association)的瑞士非营利组织,该组织将牵头开发比特币证明系统。ZeroSync 于…

STM32——ADC

STM32——ADC 1.ADC介绍 ADC是什么? 全称:Analog-to-Digital Converter,指模拟/数字转换器! ADC性能指标 量程:能测量的电压范围分辨率:ADC能辨别的最小模拟量,通常以输出二进制数的位数表示&#xf…

春季选品策略:如何在Shopee平台上脱颖而出

在Shopee平台上进行春季选品时,卖家需要制定有效的策略来吸引消费者的注意并提高销售业绩。本文将介绍一些关键的选品策略,帮助卖家在春季市场中脱颖而出。 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址(复制浏览器打开&#xf…

嵌入式——模拟/数字转换器(ADC)补充

目录 一、ADC简介 二、ADC功能 1.电压输入范围 2.输入通道 3. 转换顺序 (1)规则序列 (2) 注入序列 4.触发源 5. 转换时间 (1) ADC时钟 (2) 采样时间 6. 数据寄存器 &am…

回归预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络多变量回归预测

回归预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络多变量回归预测 目录 回归预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-B…

字符串中的单词反转【leetcode】

本题选自leetcode图解算法数据结构一书 你在与一位习惯从右往左阅读的朋友发消息,他发出的文字顺序都与正常相反但单词内容正确,为了和他顺利交流你决定写一个转换程序,把他所发的消息 message 转换为正常语序。 注意:输入字符串…

python 标准库random生成随机数

当前版本: Python 3.8.4 文章目录如下 1. random的特点 2. random的用法 2.1. 随机整数 2.2. 随机小数 2.3. 随机元素 2.4. 随机字符串 1. random的特点 random 提供了生成伪随机数的功能,可以用于各种随机相关的操作,如生成随机数、…