Unity3D使用Jenkins进行自动打包

  最近研究了一下JenKins自动打包,遇到了一些网上教程上没有提到的一些坑,于是决定也写一篇教程,希望能帮助到后来的开发者。

  我主要参考的教程有:
  雨松: Unity3D研究院之Jenkins的使用
  钱康来: Jenkins自动化出包流程分享

1.Jenkins的安装与启动

  首先在Jenkins的官网下载Jenkins软件,这里选择12周更新版还是1周更新版看你的喜好,我选择的是1周更新版。
  安装后程序会自己启动,手动启动的方法是
  java -jar /Applications/Jenkins/jenkins.war -httpPort=8080

  这样就默认在8080端口启动了,第一次启动会问你要密钥,将Jenkins提示的地址从Finder中用快捷键就可以很快打开了
  CMD + SHIFT + G

  输入密钥之后会提示让你创建管理员账号,这里要注意所有的输入框都要填写内容,我就是邮件没有填就点了提交,结果等了很久也没有反应。   

2.破解版MAC Unity的安装

  下一步就是安装Unity了,已经会破解Unity的可以跳过这一步,我在找教程的时候走了一些弯路,觉得还是有必要介绍一下。

  教程可以参考这篇

  我把破解文件公开出来,这样就不必在蛮牛上繁琐的回复可见了
  破解时要注意一定要把Unity和破解文件按照版本对应好,如果不匹配的话,很可能打包出错但是很久找不到原因。

3.Android SDK的安装与第一个坑

  我一开始是使用的Android Studio下载SDK的办法,这里遇到一个坑,就是安装好的Android Studio就是获取不到Android SDK的地址,不管选择什么目录都提示Android已安装,下一步之后又丢失掉Android SDK 的路径。

  这个我后来的解决办法是放弃使用Android Studio而是直接使用它的命令行工具,使用工具下载了几个Android SDK之后,再使用Android Studio访问这个目录就可以正确识别了
  这里提供几个命令:
  sdkmanager --list(获取全部SDK列表)
  sdkmanager "platforms;android-14"(下载 14版本的SDK)

4.配置Unity与第二个坑

  接下来就是配置Unity了,主要就是配置JDK和Android SDK
  这里我遇到一个坑是Unity打包总是提示
  Error:Invalid command android

  通过查阅资料得知这个错误的原因是,Android SDK 26以后版本的打包API有变更,而Unity还是使用的旧版本的API导致。
  这个解决方法有两个一个是使用新版本Unity,另一个是使用旧版本的Android SDK,我选择后者,安装了24版本的SDK,解决了这个问题。

5.配置Jenkins

  接下来是配置Jenkins,这里首先先安装两个插件
  Manage Jenkins--> Manage Plugins --> Available -->Xcode integration && Unity3d plugin

  然后在Jenkins->系统管理->Global Tool Configuration ->Unity3d 中填写Unity的安装路径,如果有多个Unity版本,可以填写多个,用别称区分。

  然后就可以配置打包工程了,选择 Jenkins->新建->构建一个自由风格的软件项目->ok
  在General->参数化构建->添加参数 这里可以添加你想要的参数,我目前使用了这些参数,这些参数可以在后面的脚本中通过 $ + 参数名获取到

    ChannelName(Choice)
    AppMode (Choice)
    UseAssetsBundle (Bool)
    UseLua (Bool)
    ExportPath (string)

  然后在源码管理中输入你的项目地址,如果有密码,则还需要输入账户密码,这里允许读取多个库合并成一个项目,很方便。

  最后在构建项目中点击 增加构建步骤 -> Invoke Uinty3d Editor 我使用的参数是

 -quit -batchmode -executeMethod ProjectBuildService.BuildForAndroid  ChannelName-$ChannelName AppMode-$AppMode UseAssetsBundle-$UseAssetsBundle ExportPath-$ExportPath UseLua-$UseLua`

  可以看到把前面声明的参数全部使用到了,这些参数的意思是调用ProjectBuildService.BuildForAndroid方法,并将以上参数传入

  下面还需要在Unity中接收并解析这些参数,这里试举一例

public static bool isUseAssetsBundle
{
    get 
    {
        //这里遍历所有参数,找到 UseAssetsBundle 开头的参数,
        // 然后把-符号后面的字符串返回,
        foreach (string arg in Environment.GetCommandLineArgs())
        {
            if (arg.StartsWith("UseAssetsBundle"))
            {
                return bool.Parse(arg.Split("-"[0])[1]);
            }
        }
        return false;
    }
}

6.Tips

  1 MAC获取文件夹路径的简便方法:将文件夹拖入终端
  2 参考这篇教程共享MAC文件夹

kisence

潮落江平未有风。