脚本自动定时打开链接_自动化构建系统

238575f28a338eab8d86cd63a00ac6a2.png

在软件开发过程中,特别是在一些大型多人合作开发的项目中,如何将各个人开发的不同模块集合为一个完整的系统,最终输出一个完整的目标文件,这个过程包括编译,发布,自动化测试等环节。这一过程的完善程度和流畅程度将会影响整个发布过程,如果整个过程都需要人为干预,那么每次需要构建版本的时候都会是一场灾难。

笔者刚进入游戏行业时,曾经在一个初创手游团队工作过,当时所有版本的发布都是由我负责,在开发前期只有一个版本维护,仅仅是在验收的时候发布一个PC版,但是到了后期需要维护IOS和Android两个平台,其中Android版本在接入渠道后,针对每个渠道都要分别打包,整个过程都需要我手动控制,虽然写了几个自动化脚本但是整个流程并不是完全自动化,常常是之前搭建好的构建环境,在经过几次提交后又会出现若干错误,这时候又需要我一个一个解决。项目虽然还是在有条不紊的进行中但是整个发布过程却是异常痛苦。

后来又参与了一款端游的研发,项目的负责人利用Windows的定时任务和批处理脚本制作了一套自动化构建脚本,每次需要构建版本时只需要运行下批处理脚本,这个过程会锁定SVN的提交权限,任何人都无法提交任何东西,直到构建完毕,如果在构建过程中出现错误脚本会自动将错误信息发送到开发人员的IM工具。虽然端游只需要发布到一个平台,但是整个构建过程是不需要人为干预的完全不影响开发人员当前的工作。在每天的凌晨2点工具会自动构建当前最新的版本,这样测试组在上班后就可以立即用最新版本的游戏进行测试,并反馈测试结果。

因此一个完善的构建系统对于整个团队的开发效率是有很大影响的,通俗来讲构建系统(build system)是用来从源代码生成用户可以使用的目标(targets)的自动化工具,一个灵活的构建系统应该可以支持任意扩展和随意配置,并且支持流水线作业。目前市面上的几款自动化构建系统都已经非常完善强大了。

  1. Jenkins:Jenkins是一个老牌开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
  2. Travis CI :Travis CI 是目前新兴的开源持续集成构建项目,它与jenkins,GO的很明显的区别在于采用yaml格式,简洁清新独树一帜。

Jenkins

本文主要以Jenkins为例讲解如何在Windows环境配置自动化构建系统,Linux环境的配置可自行搜索相关文献。作为一款持续集成工具Jenkins不仅提供了基本的持续构建功能,还提供了很多强大的额外功能,比如:打包后使用开源软件FileZilla进行上传、下载部署;可以编写单元测试脚本自动执行打包后版本进行汇总性能分析;打包失败自动发送邮件给相关负责人等等。不仅如此Jenkins提供的插件功能更是涵盖了持续化集成的方方面面,这些功能基本可以满足任何项目的持续化集成与交付需求。

用到的软件或工具

  1. JRE :Java Runtime Environment(下载链接:Java SE Runtime Environment 8)
  2. Jenkins:(下载链接:http://mirrors.jenkins.io/war-stable/latest/jenkins.war)
  3. Python :Python2.7版本(https://www.python.org/ftp/python/2.7.14/python-2.7.14.msi)
  4. 7z:压缩package工具(下载链接:http://www.7-zip.org/)

环境搭建

  • Python运行环境配置:下载并安装Python,将安装后python.exe所在的目录附加到PATH环境变量中,我的电脑->右键属性->高级系统设置->高级->环境变量,PATH中新增C:Python27(Python所在目录)。
  • Java运行环境配置:按照对应操作系统下载并安装jre,如果未自动配置Java环境变量,手动配置方法同Python。
  • 7z环境配置:下载安装好7z,环境变量 PATH中新增C:Program Files7-Zip(Python所在目录)条目。
  • Jenkins运行及配置:下载 jenkins.war,进入所在目录运行java -jar jenkins.war ,然后在浏览器中打开http://localhost:8080,复制以上密码,进行jenkins初次设置。
  • 配置环境:把刚刚复制的password粘贴到Administrator password,安装好必备的plugin,创建一个初始Admin User,Jenkins 环境就配置完成了。

448da62de0925d3846f5e3c3edabd0d2.png
解锁Jenkins

如果遇到“该Jenkins实例似乎已离线”

9ad754bcbf866a9e6105072ae1e897ba.png

可以参考以下方式解决:

打开一个新的tab,输入网址http://localhost:8080/pluginManager/advanced。 将最下面的“Update Site”中Jenjins默认地址http://updates.jenkins.io/update-center.json改为其他国内备用地址:

  1. https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  2. http://mirror.esuni.jp/jenkins/updates/update-center.json

最后在浏览器输入http://localhost:8080/restart ,再启动就可以正常下载插件了。

c4d5c2b86f07684b484265d078147ab9.png
安装插件

创建Job

在Jenkins主页下可以点击New Item 创建一个新的Job,Jekins提供了多种模板,选择第一个Freestyle project 。Item Name建议最好与你的项目相同。Job 配置有General,源码管理,构建触发器,构建环境,构建,以及构建后操作几个部分。

4d67fe2801c1b84f480d31ae1d3d3ff6.png
创建Job

打开Jenkins主页左侧系统管理,选择系统设置,在主目录下方一行点击高级按钮,显示出工作空间根目录,更改到你的Workspace中:E:You Project Name${ITEM_FULLNAME}

编写Build脚本

构建脚本可以是Python也可以是Windows的批处理命令或者其他语言编写的脚本,整个过程主要是通过在Jenkins中配置好的参数,调用脚本最终脚本调用对应的编译工具进行打包,如果是Unity项目最终会调用ProjectBuild.cs进行对应平台的打包操作。如果是Unreal项目则会调用Unreal Engine的打包工具进行打包。例如新建一个UnityBuild.bat的Unity构建文件:

UnityBuild.bat 内容如下REM UNITY程序的路径
SET UNITY_PATH="D:Program Files (x86)Unity2019.2.0f1EditorUnity.exe"REM 游戏程序路径
SET PROJECT_PATH="E:JenkinsworkspaceAutoBuild"REM 在Unity中构建apk
%UNITY_PATH% -projectPath %PROJECT_PATH% -quit -batchmode -executeMethod ProjectBuild.BuildForAndroid %1 -logFile build.logecho "Build生成完毕"
PAUSE

配置Jenkins job

jenkins job 配置官方有详细的文档,在Jenkins主页选择创建好的job,左边进入Configure

  1. General:勾选 “参数化构建过程”。添加参数 Choice Parameter, 填写Name为Configuration,Choices填Development和Shipping两个选项换行隔开,Description 添加一些描述语言。添加参数 String Parameter,填写Name为 Engine_Root,默认值为引擎目录,我的是“D:Program Files (x86)Unity2019.2.0f1Editor” 。再次添加Choice Parameter,填写Name为Platform,Choices填写Win64和Win32。
  2. 源码管理:以Git为例,Repository URL填写远程地址,Credentials点击Add添加git账户密码,其他选项按照需求填写。如果填写正确,每次build前会自动获取最新版本,选择None则跳过这一步。
  3. 构建触发器:Jenkins 提供了多种自动检查代码,自动构建的功能,这里比如设置项目每天1点构建,Build periodically 中填写:H 1 * * *
  4. 构建环境:这个模块主要做构建的一些相关设置以及一些Plugin提供的功能,勾选了Add timestamps to the Console Output 选项,会再build log 中增加时间戳。
  5. 构建:新增一个 Execute Windows Batch Command,命令行中填写:
UnityBuild.bat “D:Program Files (x86)Unity2019.2.0f1EditorUnity.exe” “%WORKSPACE%”

Build

配置完成保存,然后左边选择 Build with Parameters,可以看到配置中添加的参数列表,点击开始构建执行打包操作。同时还可以打开Console Output 查看日志,以及打开变更记录查看此次打包变更内容。打包后可以在配置好的release_path 目录下看到压缩后的版本。

参考文献

  • Jenkins+Unity踩坑日记(详细下载安装手册):https://blog.csdn.net/alph258/article/details/86075956
  • Jenkins集成unity一键打安卓包:https://zhuanlan.zhihu.com/p/87964476

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

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

相关文章

++ba--运算结果解析

int db&&a--; 此运算其实的操作为&#xff1a; db&&a,然后aa-1,所以d0&#xff0c;a-1. #include<stdio.h> void main() {/*double a97.3;double b98;double c;int c1;printf("%d\n",(int)(a/b));printf("%f",a/b);*/int a0,b2,…

python docker_Docker实践:python应用容器化

一、前言 容器使用沙箱机制&#xff0c;互相隔离&#xff0c;优势在于让各个部署在容器的里的应用互不影响&#xff0c;独立运行&#xff0c;提供更高的安全性。本文主要介绍python应用&#xff08;django&#xff09;跑在docker容器里&#xff0c;编写dockerfile实现镜像构建自…

mysql 默认事务隔离级别_上个厕所的功夫,搞懂MySQL事务隔离级别

“隔离级别” 出于MySQL四大特性(ACID)中的“I”&#xff0c;也就是隔离性。目的是实现数据、事务一致性“C”。MySQL在多线程并发场景下&#xff0c;可能会出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)这类并发问题&#xff0c;为了解决这些问…

Tg5032smn:高稳定性105℃高温

TG5032SMN是一款频率范围10MHz ~ 54MHz,具有高稳定的TCXO晶振&#xff0c;可与CMOS或限幅正弦输出。外部尺寸5.0 3.2 1.45mm&#xff0c;超小型,质地轻。该系列晶振的额定工作范围-40℃~&#xfe62;105C内可高稳定性工作&#xff0c;使得信号频率的误差很小。TG5032SMN与其他…

泰坦尼克号数据集_机器学习入门—泰坦尼克号生存率预测

项目名称&#xff1a;泰坦尼克号生存率预测1.导入数据这里使用kaggle kernel编写代码数据下载地址为&#xff1a;https://www.kaggle.com/c/titanic2.数据统计分析通过describe和info方法&#xff0c;我们可以发现Age&#xff0c;Cabin&#xff0c;Embarked和Fare的数据都有不同…

firefox flash插件_巧用firefox下载视频资源

技术应用场景&#xff1a;1. 免广告播放视频(含vip)2. 下载各大视频网站的视频资源步骤&#xff1a;1.提前下载安装以下程序&#xff1a;火狐浏览器(Firefox)https://www.lanzous.com/i98jfne火狐flash插件 https://www.lanzous.com/i98jercVideo DownloadHelper插件 https://w…

sdr 软件_无线电爱好者系列-1.通过SDR获取周围无线电信号及应用

一、什么是SDR?SDR就是Software Defined Radio,即软件定义无线电。之前的无线电通信系统都是基于特殊的硬件元器件完成无线电信号的接收和解码&#xff0c;例如混频器、滤波器、放大器、调制器和解调器、检波器等。而SDR是基于计算机完成相同的工作&#xff0c;也就是把无线电…

c python 内存冲突_Python在计算内存时应该注意的问题?

我之前的一篇文章&#xff0c;带大家揭晓了 Python 在给内置对象分配内存时的 5 个奇怪而有趣的小秘密。文中使用了sys.getsizeof()来计算内存&#xff0c;但是用这个方法计算时&#xff0c;可能会出现意料不到的问题。 文档中关于这个方法的介绍有两层意思&#xff1a; 该方法…

notepad多行编辑_Windows 10 UWP 推荐 | 极具现代感的轻量化文本编辑器:Notepads

柒才也许你正在用VS Code, Notepad或者Sublime&#xff0c;但是相信很多小伙伴跟我一样&#xff0c;在快速记录笔记或者修改配置文件的时候还是会用Windows系统自带的记事本Notepad.exe&#xff08;毕竟启动速度快&#xff0c;界面清爽&#xff09;可是问题在于Windows 10自带的…

python中读取txt文件、统计其中所有字母出现的频度_Python编程小技巧:如何统计序列中元素的出现频度...

原标题&#xff1a;Python编程小技巧&#xff1a;如何统计序列中元素的出现频度实际案例 某随机序列中&#xff0c;找到出现次数最高的三个元素&#xff0c;他们的出现次数是多少&#xff1f; 对某英文文章的单词进行词频统计&#xff0c;找到出现次数最高的10个单词&#xff0…

adsl服务器客户端配置cisco_【干货】Cisco路由排错经典案例分析

关注我&#xff0c;你的眼睛会怀孕对于网工来说&#xff0c;熟悉与掌握路由排错的思路和技巧是非常必要的。接下来&#xff0c;将对三例典型的路由故障排错案例进行分析。一、不堪重负&#xff0c;路由器外网口关闭1、网络环境某单位使用的是Cisco路由器&#xff0c;租用电信30…

centos sudo不能运行_如何在Linux中配置sudo访问权限

Linux 系统中 root 用户拥有 Linux 中全部控制权力。Linux 系统中 root 是拥有最高权力的用户&#xff0c;可以在系统中实施任意的行为。如果其他用户想去实施一些行为&#xff0c;不能为所有人都提供 root 访问权限。因为如果他或她做了一些错误的操作&#xff0c;没有办法去纠…

html文件中文在浏览器中显示乱码问题解决

利用浏览器打开html文件时&#xff0c;中文显示乱码&#xff0c;如下是原文件的内容 1 <html> 2 <head> 3 <title>狗熊王</title> 4 </head> 5 6 <body> 7 <p>狗熊王…

highscore软件_软件|标准物质PDF卡片查找HighScore

有宝物的柜子实用、有趣、干货2019.5.15 前面&#xff0c;我们介绍了Jade软件|MDI Jade 安装包、安装教程、使用手册软件|CasaXPS安装包、安装教程、基本操作&#xff01;今天分享↓↓↓HighScore的安装与简单使用(如有侵权&#xff0c;联系后台删除&#xff01;)第一部分&am…

js图片转二进制流_V8是如何执行一段JS代码的?

汇编器 编译器 解释器解释执行和解释执行什么是V8&#xff1f;V8执行Js代码的过程汇编器 编译器 解释器众所周知&#xff0c;计算机只能理解机器语言&#xff0c;而我们平时编程用的通常是高级语言&#xff0c;所以源代码通常都要经过层层转换最终变成机器语言运行。早期只有汇…

mockito mock void方法_一文让你快速上手 Mockito 单元测试框架

前言在计算机编程中&#xff0c;单元测试是一种软件测试方法&#xff0c;通过该方法可以测试源代码的各个单元功能是否适合使用。为代码编写单元测试有很多好处&#xff0c;包括可以及早的发现代码错误&#xff0c;促进更改&#xff0c;简化集成&#xff0c;方便代码重构以及许…

vs winform常用函数_使用.net core3.0 正式版创建Winform程序

前阵子一直期待.net core3.0正式版本的出来&#xff0c;以为这个版本出来&#xff0c;Winform程序又迎来一次新生了&#xff0c;不过9.23日出来的马上下载更新VS&#xff0c;创建新的.net core Winform项目&#xff0c;发现并没有Winform窗体设计器。而微软目前则是通过插件的方…

VScode中编写运行C/html文件

VScode运行C程序的所需配置 VScode只是一个编辑器&#xff0c;并不自带C编译器&#xff0c;所以需要 下载mingw 下载安装版本或者压缩文件&#xff0c;解压缩后&#xff0c;配置系统的环境变量。 path中添加mingw/bin的路径 新建include变量&#xff0c;添加mingw/include的路径…

linq结果转换object_你知道Object.entries(),但你还知道有Object.fromEntries()吗?

我们得到 object.entries()&#xff0c;它转换一个object → array。但是&#xff0c;如果您想做相反的事情怎么办&#xff1f;不用再想了&#xff01; 使用 Object.fromEntries() 来array → object 。const keyValuePair [ [cow, ], [pig, ],];Object.fromEntries(keyValu…

C语言中数组越界访问造成死循环现象

大家请看这样一段代码&#xff08;工具&#xff1a;VC6.0&#xff09;&#xff1a; #include <stdio.h> int main(int argc, char *argv[]) { int i; int arr[10];/* 这里注意循环变量i与数组arr的定义顺序 */ for(i 0; i < 10; i)/* 这里越界了 */ …