Unity Jenkins打包 部署

Jenkins 打包Unity APK

新建一个Unity 工程,添加编辑器打包脚本

编辑器脚本 APKBuild.cs 
编辑状态下调用 APKBuild中 Build 方法,执行打包, 
测试成功开始编写 批处理脚本 Unity.bat 通过批处理脚本调用 APKBuild中 Build 方法 执行打包 
执行批处理打包成功开始在Jenkins新建项目

APKBuild.cs 代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;


public class APKBuild : Editor
{

    [MenuItem("Tool/APKBuild")]
    public static void Build()
    {
        BuildTarget buildTarget = BuildTarget.Android;
        // 切换到 Android 平台
        EditorUserBuildSettings.SwitchActiveBuildTarget(buildTarget);

        // keystore 路径, G:\keystore\one.keystore
        PlayerSettings.Android.keystoreName = "G:\\keystore\\one.keystore";
        // one.keystore 密码
        PlayerSettings.Android.keystorePass = "123456";

        // one.keystore 别名
        PlayerSettings.Android.keyaliasName = "bieming1";
        // 别名密码
        PlayerSettings.Android.keyaliasPass = "123456";

        List<string> levels = new List<string>();
        foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes)
        {
            if (!scene.enabled) continue;
            // 获取有效的 Scene
            levels.Add(scene.path);
        }

        // 打包出 APK 名
        string apkName = string.Format("./{0}.apk", "Test");
        // 执行打包
        string res = BuildPipeline.BuildPlayer(levels.ToArray(), apkName, buildTarget, BuildOptions.None);

        AssetDatabase.Refresh();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

在编辑器下可以调用 Build() 方法执行打包 APK

新建批处理脚本 Unity.bat

H:\Unity\Unity\Editor\Unity.exe -projectPath G:\MyProject\AndroidSDKUnityDemo\AndroidSDKDemo -quit -batchmode -executeMethod APKBuild.Build -logFile build.log
  • 1

参数介绍

H:\Unity\Unity\Editor\Unity.exe 为Unity 安装执行文件

-projectPath 执行Unity游戏工程

G:\MyProject\AndroidSDKUnityDemo\AndroidSDKDemo 为Unity 工程目录 Assets 上一层目录

-quit 表示执行结束自动退出

-executeMethod 表示执行 编辑器方法

APKBuild.Build  APKBuild 为编辑器脚本 APKBuild.cs , 中APKBuild.cs Build 函数名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

最终 Unity.bat 脚本

@echo off  

echo 正在生成APK文件...  

REM H:\Unity\Unity\Editor\Unity.exe -projectPath G:\MyProject\AndroidSDKUnityDemo\AndroidSDKDemo -quit -batchmode -executeMethod APKBuild.Build -logFile build.log

%1 -projectPath %2 -quit -batchmode -executeMethod APKBuild.Build -logFile build.log

echo APK文件生成完毕!  
pause 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

上面 %1 %2 我通过在执行批处理脚本的时候将参数传递进来

将 Unity.bat 放在 Unity 项目根目录(和 Assets 同级) 
Unity Jenkins打包 部署_第1张图片

将Unity 工程上传到 SVN服务器

开始Jenkins 
新建一个新工程 
Unity Jenkins打包 部署_第2张图片

Unity Jenkins打包 部署_第3张图片

下一步弹出配置界面 
Unity Jenkins打包 部署_第4张图片

源码管理

中选择 SubVersion 配置SVN 路径和用户名密码 
Unity Jenkins打包 部署_第5张图片

点击 Add 添加一个用户名和密码 
Unity Jenkins打包 部署_第6张图片

Check -out Strategy 中配置每次构建时执行的 SVN update命令(每次构建时会将SVN 中最新的项目更新到 Jenkins 的工作空间WORKSPACE)

如我本地的Jenkins 工作空间位置,Jenkins新建的项目都会放在 workspace 下

C:\Users\Dev\.jenkins\workspace\
  • 1

构建中选择 Windows 批处理, 
Unity Jenkins打包 部署_第7张图片 
第一行打印一个 HelloWorld 
第二行执行 Unity.bat 后边两个参数 分别传递给批处理中 %1,%2

%WORKSPACE% 是Jenkins 中可用的环境变量,表示该项目在Jnekins 中的目录位置
本项目在Jenkins 为 TestDemo则 %WORKSPACE% 在我本地为 C:\Users\Dev\.jenkins\workspace\TestDemo
  • 1
  • 2

配置完成保存,执行构建(构建时要将 Unity 关掉) 
Unity Jenkins打包 部署_第8张图片

可以查看日志 
Unity Jenkins打包 部署_第9张图片

等待构建 
构建完成后打开工作空间,发现目录下生成一个 Test.apk 表示 APK 生成成功 
Unity Jenkins打包 部署_第10张图片

下面来看下我的 Unity 工程和 Jenkins 工程的关系

Unity Demo工程目录如下 
Unity Jenkins打包 部署_第11张图片

Unity Demo工程上传到 SVN 服务器

在 Jenkins 中新建TestDemo项目,在 TestDemo配置中 添加 Demo工程上传的 SVN 服务器路径

Jenkins 在构建构建时会从 SVN 服务器将 Demo 工程 CheckOut 到 Jenkins 的工作空间中 TestDemo 项目下 
Unity Jenkins打包 部署_第12张图片

打开 TestDmeo 文件夹,我已经执行过构建了, Jenkins 已经从 SVN 上更新了最新的项目到 工作空间中 
Unity Jenkins打包 部署_第13张图片

然后我在执行 Unity.bat 时,将 %WORKSPACE% 在我本地为(C:\Users\Dev.jenkins\workspace\TestDemo)传递了进去,即执行的 打包工程是Jenkins 工作空间的这个工程

每次修改Unity Demo 工程,将修改提交到 SVN,然后再执行 Jenkins 构建






mac部署

  1. 下载Jenkins war安装包
    Jenkins下载地址,下载war安装包

    Unity Jenkins打包 部署_第14张图片
    mac jenkins war安装包.png

  2. 安装Tomcat

要注意的是jdk版本,选择jdk8,不然运行jenkins会报错:jdk下载地址

报错日志:Stack trace
java.lang.AssertionError: InstanceIdentity is missing its singleton
org.jenkinsci.main.modules.instance_identity.InstanceIdentity.get(InstanceIdentity.java:133)
at org.jenkinsci.main.modules.instance_identity.InstanceIdentityRSAProvider.getKeyPair(InstanceIdentityRSAProvider.java:23)
at jenkins.model.identity.InstanceIdentityProvider$KeyTypes.get(InstanceIdentityProvider.java:161)
at jenkins.model.identity.InstanceIdentityProvider$KeyTypes.getKeyPair(InstanceIdentityProvider.java:210)
at jenkins.model.identity.IdentityRootAction.getUrlName(IdentityRootAction.java:42)
at jenkins.model.Jenkins.getDynamic(Jenkins.java:3635)
...
Caused: javax.servlet.ServletException
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:765)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:845)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649)
at org.kohsuke.stapler.Stapler.service(Stapler.java:238)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)

Unity Jenkins打包 部署_第15张图片
jdk9报错截图.png

如果mac下已经安装多版本JDK,可以按照Mac下多版本JDK安装来设置/切换使用版本

Tomcat安装包选择tar.gz版: Tomcat下载地址

安装Tomcat完成后:

  1. 将下载的Jenkins war包,放入之前Tomcat文件夹下/webapps文件夹中。

  2. 打开浏览器输入http://localhost:8080/jenkins

  3. 加载成功会让输入密码,密码在图中红色的路径文件里面


    密码路径,copy.png
  4. 建议点击推荐安装 Install suggests plugins

Unity Jenkins打包 部署_第16张图片
tomcat启动.png
Unity Jenkins打包 部署_第17张图片
jenkins默认工作目录.png



目录:

  1. credentials使用kind: Username and password
  2. credentials使用kind: SSH Username private key
    2.1 SSH基础;什么是ssh?什么是公钥?什么是私钥?什么是数字签名、数字证书?
    2.2 配置SSH Username private key credentials的5个步骤
    2.3 git ssh正确情况截图
    2.4 报错情况处理:code 128:Permission denied (publickey)

git配置(GitHub)

git配置主要是设置credentials,常用的有2种方式:

1. kind: Username and password

Unity Jenkins打包 部署_第18张图片
kind-userName with password.png

如何验证这种方式是否有效呢?

  1. 新建 自由风格的软件项目


    构建自由风格的软件项目.png
  2. 只需配置源码管理这一项,注意URL要HTTPS(在github上创建一个repositories 或者使用 测试使用:github UnityJenkins工程地址),credentials选择刚刚创建的Username and password,保存。

    Unity Jenkins打包 部署_第19张图片
    git credentials-userName and password.png

  3. 立即构建,若成功,在~/.jenkins/workspace中可以看到clone到的工程;若失败,检查账号密码。


    Unity Jenkins打包 部署_第20张图片
    Jenkins git clone成功到workspace.png

2. kind: SSH Username private key

2.1 SSH基础

使用SSH这种方式,需要明白什么是ssh?什么是公钥?什么是私钥?什么是数字签名、数字证书?

如果都明白,可以跳过下面3个链接:

  1. 数字签名是什么?--作者阮一峰
  2. 密码学笔记 --作者阮一峰
  3. SSH原理与运用(一):远程登录 --作者阮一峰

2.2 配置SSH Username private key credentials的5个步骤

接下来生成一个SSH Username private key credentials

如何生成:
GitHub 的 SSH 密钥指南 : https://help.github.com/articles/generating-ssh-keys。

这个GitHub官方ssh链接 说明的非常详细,能看懂就参照这个链接一步步做

大概分为以下几步:

  1. Checking for existing SSH keys,检查SSH keys是否已存在,如果id_dsa(私钥)、id_dsa.pub(公钥)已存在,跳过2、3步骤,若不存在则生成
  2. Generating a new SSH key and adding it to the ssh-agent,生成新的SSH key,并添加到ssh-agent。这时候按第一步检查,id_dsa(私钥)、id_dsa.pub(公钥)已存在则成功。
  3. Adding a new SSH key to your GitHub account,将生成id_dsa.pub(公钥)copy到GitHub
  4. Testing your SSH connection,验证是否配置成功:ssh -T [email protected]
  5. Jenkins配置credentials,将id_dsa(私钥)的内容copy到SSH Username private key credentials中(private key选择enter directly),Username、ID随意。

Mac 终端创建ssh key并添加到GitHub
Mac下git通过SSH进行免密码安全连接github

Unity Jenkins打包 部署_第21张图片
kind-ssh private key.png

2.3 git ssh正确情况截图

Unity Jenkins打包 部署_第22张图片
git ssh正确情况截图.png

2.4 报错情况处理:code 128:Permission denied (publickey)

若出现code 128:Permission denied (publickey)的报错,说明ssh key credentials没有配置对。

按照上面5个步骤检查一遍。用第四步检查GitHub上是否配置成功,若成功,检查id_dsa(私钥)的内容copy过程有没有遗漏,private key是否正确。

构建失败日志: ERROR: Error cloning remote repo 'origin'
hudson.plugins.git.GitException: Command  returned status code 128:
stdout: 
stderr: Permission denied (publickey).
fatal: Could not read from remote repository.
Unity Jenkins打包 部署_第23张图片
git ssh key设置有误报错.png

解决完code 128:Permission denied (publickey)报错,按1.1的方式验证是否能成功clone工程。
区别是URL要SSH,例如[email protected]:GeWenL/UnityJenkins.git,如“git ssh正确情况截图.png”所示。





你可能感兴趣的:(Unity3d)