2-Unity Jenkins自动化构建
2018年11月16日 星期五, 发表于 深圳
如果你对本文有任何的建议或者疑问, 可以在 这里给我提 Issues, 谢谢! :)
配置
- 环境为windows10,Unity2018
- 安装Jenkins,安装默认插件,按照流程走这里不表
- Unity里面写构建脚本,见下面代码
- Windows下写批处理脚本,见下面代码
- 测试阶段可以直接执行批处理脚本,但注意Unity需要关闭,否则脚本无法执行
- Unity批处理文档
- Jenkins GUI界面中选择执行批处理,并将脚本填入
坑:Jenkins环境变量问题
在Jenkins中取不到Unity中定义的环境变量,导致发生无法定位sdk/ndk的错误。在Jenkins环境变量中配置ANDROID_HOME可以解决sdk的问题,但是ndk的问题无法解决(配置了ANDROID_NDK_HOME,但是还是提示无法定位ndk)。因此在使用时自行定义环境变量,绕过这个坑,见Unity构建代码。参考资料
代码
Unity构建代码
using UnityEngine;
using UnityEditor;
using System;
using System.IO;
using System.Collections.Generic;
using UnityEditor.Build.Reporting;
using Unity.Framework;
/// <summary>
/// 命令行批处理示例
/// </summary>
public class Batchmode
{
public class EditorSetup
{
public static string AndroidSdkRoot
{
get { return EditorPrefs.GetString("AndroidSdkRoot"); }
set { EditorPrefs.SetString("AndroidSdkRoot", value); }
}
public static string JdkRoot
{
get { return EditorPrefs.GetString("JdkPath"); }
set { EditorPrefs.SetString("JdkPath", value); }
}
// This requires Unity 5.3 or later
public static string AndroidNdkRoot
{
get { return EditorPrefs.GetString("AndroidNdkRoot"); }
set { EditorPrefs.SetString("AndroidNdkRoot", value); }
}
}
public static void BuildAndroid()
{
/* Jenkins 无法拉到Unity配置,因此在此重新设置 */
EditorSetup.AndroidSdkRoot = @"C:\worksapce\sdk\androidSDK";
EditorSetup.AndroidNdkRoot = @"C:\worksapce\sdk\android-ndk-r13b";
EditorSetup.JdkRoot = @"C:\Program Files\Java\jdk1.8.0_151";
#region 处理keystore
string keystoreFile = @"D:\workspace\UnityFramework\keystore\password.txt";
if (!File.Exists(keystoreFile))
throw new Exception("Not find keystore file");
StreamReader sr = File.OpenText(keystoreFile);
string password = sr.ReadToEnd().Trim();
PlayerSettings.Android.keystorePass = password;
PlayerSettings.Android.keyaliasPass = password;
#endregion
//可根据需要处理Plugins, AssetBundles等
//处理场景
List<string> levels = new List<string>();
foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes)
{
if (!scene.enabled) continue;
levels.Add(scene.path);
}
//切换平台
EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Android, BuildTarget.Android);
//构建APK
BuildReport report = BuildPipeline.BuildPlayer(levels.ToArray(), string.Format("{0}/AutoBuild/{1}.apk", EditorTool.GetUnityRootFile(), Util.GetCurrentDate()), BuildTarget.Android, BuildOptions.None);
if (report.summary.result != BuildResult.Succeeded)
{
throw new Exception("BuildPlayer Failure!");
}
}
}
Windows 批处理脚本
@echo off
@set unity="C:\Program Files\Unity2018\Editor\Unity.exe"
echo 正在生成APK文件...
%unity% -batchmode -quit -nographics -executeMethod Batchmode.BuildAndroid -logFile D:\Editor.log -projectPath "D:\workspace\UnityFramework"
echo APK文件生成完毕!
pause