使用Jenkins进行Unity自动构建

作者: 归零者 分类: Unity3D工具箱 发布时间: 2018-09-01 09:45

目 录

1 Jenkins 介绍 …………………………………………………………………………………………………………………………………….3

2 下载安装 Jenkins ……………………………………………………………………………………………………………………………3

3 Unity 插件 ………………………………………………………………………………………………………………………………………..4

4 开始自动构建 …………………………………………………………………………………………………………………………………5

5 总结 …………………………………………………………………………………………………………………………………………………7

6 Unity 命令行参数 ……………………………………………………………………………………………………………………………8

6.1 -batchmode …………………………………………………………………………………………………………………………8

6.2 -cleanedLogFile …………………………………………………………………………………………………………………..8

6.3 -executeMethod ………………………………………………………………………………………………………………….8

6.4 -logFile …………………………………………………………………………………………………………………………………9

6.5 -projectPath …………………………………………………………………………………………………………………………9

6.6 -quit ………………………………………………………………………………………………………………………………………9

1 Jenkins 介绍

查找一些 Unity 自动构建的教程,基本都是使用的 Jenkins 实现,本文也将使用 Jenkins

尝试进行 Unity 自动构建。在开始之前先了解下 Jenkins 能做什么,还是从百科找点简介。

Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重

复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

Jenkins 功能主要包括两个部分,一个是持续的软件版本发布/测试项目,另一个是监控

外部调用执行的工作。

2 下载安装 Jenkins

Jenkins 的官网为:https://jenkins.io/。进入下载页选择 Windows 版本下载,安装后打

开 localhost:8080 端口,如下:

注意是用的 Chrome,本来这个页面总是打不开,后来发现是 IE 内核,切换到 Chrome

内核就正常了。根据提示,抄写密码后进入后面的管理界面:

其实 Windows 安装包安装之后还需要进行这些工作才能真正完成 Jenkins 的安装,先

选择第一项安装推荐的插件,安装完成后会要求创建管理员账户。最后进入管理页面如下:

这样 Jenkins 的安装就完成了。

3 Unity 插件

Jenkins 的默认安装了一堆插件,但是想要搭建Unity自动构建环境还是需要单独装Unity

支持插件,地址为 http://updates.jenkins-ci.org/download/plugins/。本地插件管理地址为

http://localhost:8080/pluginManager/,可以过滤选择 Unity 插件:

因为参考网上教程所以做这一步,至于该插件的作用这里还没细致研究。

4 开始自动构建

新建一个 item,选择自由风格。然后设置项目,在增加构建步骤中选择 Execute Windows

batch command,命令内容为:

“C:\Program Files\Unity2017.1.0f3\Editor\Unity.exe” -projectPath

“D:\workspace\unity\TestJenkins” -executeMethod JenkinsAdapter.Build -quit -batchmode –

logFile “D:\log.txt”

命令的要点是 Unity 路径,项目路径,执行的方法等。Unity 路径即安装在本地的 Unity,

可以选择最新版本,版本影响不大。然后是项目路径,写道项目顶层所在目录即可。执行方

法是自己写的一段代码,这里名字是 JenkinsAdapter 类的 Build 方法,所以需要在 Unity 中

编写脚本 JenkinsAdapter,并在其中写一个公共静态方法 Build,这个脚本需要在 Editor 目

录中。

这里是 Unity 里面的脚本情况:

HelloJenkins 不重要,只是随便生成一点场景内容,代码如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class HelloJenkins : MonoBehaviour

{

private Rect rect = new Rect(0f, 0f, Screen.width, Screen.height);

private void OnGUI()

{

GUI.skin.label.fontSize = 40;

GUI.Label(rect, "Hello Jenkins");

}

}

 

JenkinsAdapter 内容为:

using System.Collections;

using System.Collections.Generic;

using UnityEditor;

using UnityEngine;

public class JenkinsAdapter

{

[

MenuItem("Jenkins/JenkinsBuild")]

public static void Build()

{

EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Android,

BuildTarget.Android);

List sceneList = new List();

EditorBuildSettingsScene[] tmp = EditorBuildSettings.scenes;

for (int i = 0, iMax = tmp.Length; i < iMax; ++i)

{

sceneList.Add(tmp[i].path);

}

BuildPipeline.BuildPlayer(sceneList.ToArray(), "D:/TestJenkins.apk",

BuildTarget.Android, BuildOptions.None);

}

}

 

为了保险起见,需要先自己在做了基础场景后在 Unity 中编译 Apk,这样如果成功了说

明 Android SDK 及包名等配置无误,然后在 Jenkins 中自动构建。

这里是自动构建的结果:

使用了最新的 Unity2017 版,自动构建成功。

5 总结

Jenkins 自动构建还是刚接触,许多功能还不了解。前面记录的成功测试案例也只是一

个最基础的,并没有添加太多命令控制。后面会继续深入学习使用这个工具,有新的收获再

记录。

这里记录部署 Jenkins 自动构建过程中的一个主要问题,也就是安卓 SDK 配置。在我完

成了基础配置后进行自动构建总是失败,多次失败后我尝试使用命令行执行命令,结果确是

成功的,可以输出 apk 文件。通过 BeyondCompare 比较使用命令行执行与 Jenkins 构建得

到的 log 文件内容,我发现 Jenkins 失败在安卓 SDK 的配置上。我的电脑配置有些复杂,首

先为了 Unity 能编译安卓而下载了安卓 SDK,同时当时并不想要安装 Android Studio,所以

用了命令行方式安装和管理安卓 SDK。后来安卓 build-tools 有了新的版本 26,因某些修改

导致 Unity5.5 不能使用。在后来学习 Android Studio 后,不得不保留两份安卓 SDK,对

Unity5.5 和 Unity5.6 都使用 25 版的 build-tools,Android Studio 则使用最新的 26 版。待到

学习 Unreal 引擎的时候,又要使用 codeworks 来管理配置安卓 SDK。我曾尝试将 Android

Studio 中齐全的 SDK 及工具配置到 Unreal4,然而多次尝试各种失败。不得已使用了其要求

的 codeworks 来安装 SDK,这样我电脑上的安卓 SDK 也就有了三份了。

在 codeworks 安装后,它自动给添加了一些环境变量:

这个貌似优先级比较高,所以我在 Jenkins 中设置安卓路径也无济于事,设置如下:

Unity 中确实设置的是这个 D 盘的安卓 SDK,在 Unity 编译使用都是正确的。同样,在

命令行中执行也是会调用该 D 盘的安卓 SDK。奇怪的是在 Jenkins 中相同的 Unity 命令,相

同的 Unity 版本,居然使用了 C 盘 codeworks 的安卓 SDK。这可能是 Jenkins 的某些配置除

了我还不了解,所以这个问题的解决也比较丑陋,就是 Jenkins 中就默认使用 C 盘的 SDK,

Unity Editor 中编译则使用 D 盘的 25 版 build-tools。

之前的编译在命令行中成功而在 Jenkins 中失败是因为 Jenkins 中执行的 C 盘的 SDK 中

缺少 Unity Editor 中设定的 API 等级。因此安装好该等级的 API 后就能够在 Jenkins 中构建

了。

6 Unity 命令行参数

6.1 -batchmode

批处理模式可以保证不会有弹窗出现,无需人工干预,应该与其他命令一起使用。如果

出现异常,Unity 立即退出并返回 1。注意在批处理中,Unity 会很少向终端发送信息,但是

可以输出完整日志到文件中。另外如果 Editor 中打开了项目,那么则无法使用批处理对其进

行自动编译。

6.2 -cleanedLogFile

详细 debugg 特性,可以设置为 None,Script Only 和 Full。

6.3 -executeMethod

执行方法项在 Unity 开始的时候执行一个静态方法,可以用于持续集成、单元测试构建

及准备数据。返回错误可以通过抛出异常或者调用 EditorApplication.Exit 并给一个非零参数

来 完 成 。 传 输 参 数 可 以 将 其 加 入 命 令 行 , 然 后 通 过

System.Environment.GetCommandLineArgs 来获取参数。使用-executeMethod 参数需要将

脚本放在 Editor 目录,执行的方法必须是静态方法。

6.4 -logFile

写入日志信息到文件中,后面紧跟日志文件路径及文件名,如-logFile “D:\build.log”。

6.5 -projectPath

项目路径项标记打开所指定路径的项目。

6.6 -quit

其他命令执行完后退出 Unity Editor,注意到这可能会导致错误信息被隐藏,但是错误

信息仍然会记录到日志文件。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

说点什么

avatar
  Subscribe  
提醒
跳至工具栏