新建一个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();
}
}
在编辑器下可以调用 Build() 方法执行打包 APK
新建批处理脚本 Unity.bat
H:\Unity\Unity\Editor\Unity.exe -projectPath G:\MyProject\AndroidSDKUnityDemo\AndroidSDKDemo -quit -batchmode -executeMethod APKBuild.Build -logFile build.log
参数介绍
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 函数名
最终 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 我通过在执行批处理脚本的时候将参数传递进来
将 Unity.bat 放在 Unity 项目根目录(和 Assets 同级)
将Unity 工程上传到 SVN服务器
Check -out Strategy 中配置每次构建时执行的 SVN update命令(每次构建时会将SVN 中最新的项目更新到 Jenkins 的工作空间WORKSPACE)
如我本地的Jenkins 工作空间位置,Jenkins新建的项目都会放在 workspace 下
C:\Users\Dev\.jenkins\workspace\
构建中选择 Windows 批处理,
第一行打印一个 HelloWorld
第二行执行 Unity.bat 后边两个参数 分别传递给批处理中 %1,%2
%WORKSPACE% 是Jenkins 中可用的环境变量,表示该项目在Jnekins 中的目录位置
本项目在Jenkins 为 TestDemo则 %WORKSPACE% 在我本地为 C:\Users\Dev\.jenkins\workspace\TestDemo
等待构建
构建完成后打开工作空间,发现目录下生成一个 Test.apk 表示 APK 生成成功
下面来看下我的 Unity 工程和 Jenkins 工程的关系
Unity Demo工程上传到 SVN 服务器
在 Jenkins 中新建TestDemo项目,在 TestDemo配置中 添加 Demo工程上传的 SVN 服务器路径
Jenkins 在构建构建时会从 SVN 服务器将 Demo 工程 CheckOut 到 Jenkins 的工作空间中 TestDemo 项目下
打开 TestDmeo 文件夹,我已经执行过构建了, Jenkins 已经从 SVN 上更新了最新的项目到 工作空间中
然后我在执行 Unity.bat 时,将 %WORKSPACE%
在我本地为(C:\Users\Dev.jenkins\workspace\TestDemo)传递了进去,即执行的 打包工程是Jenkins 工作空间的这个工程
每次修改Unity Demo 工程,将修改提交到 SVN,然后再执行 Jenkins 构建
mac部署
下载Jenkins war安装包
Jenkins下载地址,下载war安装包
安装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)
如果mac下已经安装多版本JDK,可以按照Mac下多版本JDK安装来设置/切换使用版本
Tomcat安装包选择tar.gz版: Tomcat下载地址
安装Tomcat完成后:
将下载的Jenkins war包,放入之前Tomcat文件夹下/webapps文件夹中。
打开浏览器输入http://localhost:8080/jenkins
加载成功会让输入密码,密码在图中红色的路径文件里面
建议点击推荐安装 Install suggests plugins
code 128:Permission denied (publickey)
git配置主要是设置credentials,常用的有2种方式:
如何验证这种方式是否有效呢?
新建 自由风格的软件项目
只需配置源码管理这一项,注意URL要HTTPS(在github上创建一个repositories 或者使用 测试使用:github UnityJenkins工程地址),credentials选择刚刚创建的Username and password,保存。
立即构建,若成功,在~/.jenkins/workspace中可以看到clone到的工程;若失败,检查账号密码。
使用SSH这种方式,需要明白什么是ssh?什么是公钥?什么是私钥?什么是数字签名、数字证书?
如果都明白,可以跳过下面3个链接:
接下来生成一个SSH Username private key credentials
如何生成:
GitHub 的 SSH 密钥指南 : https://help.github.com/articles/generating-ssh-keys。
这个GitHub官方ssh链接 说明的非常详细,能看懂就参照这个链接一步步做
大概分为以下几步:
ssh -T [email protected]
Mac 终端创建ssh key并添加到GitHub
Mac下git通过SSH进行免密码安全连接github
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.
解决完code 128:Permission denied (publickey)
报错,按1.1的方式验证是否能成功clone工程。
区别是URL要SSH,例如[email protected]:GeWenL/UnityJenkins.git
,如“git ssh正确情况截图.png”所示。