My Avatar

omxian

好好学习,天天向上

2-Unity Jenkins自动化构建

2018年11月16日 星期五, 发表于 深圳

如果你对本文有任何的建议或者疑问, 可以在 这里给我提 Issues, 谢谢! :)

配置

坑: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