참조 

https://smilejsu.tistory.com/1528

 

Jenkins 젠킨스 + Unity 빌드

유니티 커멘드라인 인수 https://docs.unity3d.com/kr/530/Manual/CommandLineArguments.html빌드리포트 관련 : https://qiita.com/RyotaMurohoshi/items/dc8520aae16cabbe2be1keystore, alias 비밀번호 입력 관련 : https://answers.unity.com/ques

smilejsu.tistory.com

 

배치 스크립트 

echo %PATH%
 
echo %USERDOMAIN%\%USERNAME%
 
"C:\Program Files\Unity_2018_3_0f2\Editor\Unity.exe"  -projectPath "D:\WorkSpace\Unity\test" -quit -batchmode -logFile BuildLog.txt -buildTarget Android -executeMethod JENKINS.AutoBuilder.PerformWindowsMixedRealityBuild -keyaliasPass 123456 -keystorePass 123456 -appName IAPValidationRecipe.apk -buildFolder D:\workspace\unity\svn_savetheprincess2\IAPValidationRecipe\Apk

 

스크립트

 

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEditor.Build.Reporting;
using System.IO;

namespace JENKINS
{
    public class AutoBuilder : ScriptableObject
    {
        static string[] SCENES = FindEnabledEditorScenes();

        // Use real app name here
        /* Anyway the App will have the name as configured within the Unity-Editor
           This Appname is just for the Folder in which to Build */
        static string APP_NAME;
        static string TARGET_DIR;
        private static string logFilePath = "D:/WorkSpace/BuildTest/JenkinsBuildLog.txt";

        [MenuItem("Custom/CI/Windows Mixed Reality Build (UWP)", false, 0)]
        public static void PerformWindowsMixedRealityBuild()
        {
            Application.logMessageReceived += HandleLog;

            APP_NAME = GetArg("-appName");
            TARGET_DIR = GetArg("-buildFolder");
            Debug.Log("Jenkins-Build: APP_NAME: " + APP_NAME + " TARGET_DIR: " + TARGET_DIR);

            GenericBuild(SCENES, TARGET_DIR + "/" + APP_NAME, BuildTargetGroup.Android, BuildTarget.Android, BuildOptions.None);

            Application.logMessageReceived -= HandleLog;
        }

        private static string[] FindEnabledEditorScenes()
        {
            List<string> EditorScenes = new List<string>();

            foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes)
            {
                if (!scene.enabled) continue;
                EditorScenes.Add(scene.path);
            }

            return EditorScenes.ToArray();
        }

        private static void GenericBuild(string[] scenes, string app_target, BuildTargetGroup build_target_group, BuildTarget build_target, BuildOptions build_options)
        {
            //EditorUserBuildSettings.SwitchActiveBuildTarget(build_target_group, BuildTarget.Android);
            PlayerSettings.keyaliasPass = GetArg("-keyaliasPass");
            PlayerSettings.keystorePass = GetArg("-keystorePass");

            Debug.LogFormat("**** keyaliasPass : {0}", PlayerSettings.keyaliasPass);
            Debug.LogFormat("**** keystorePass : {0}", PlayerSettings.keystorePass);

            BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
            buildPlayerOptions.scenes = scenes;
            buildPlayerOptions.locationPathName = app_target;
            buildPlayerOptions.target = BuildTarget.Android;
            buildPlayerOptions.options = BuildOptions.None;

            Debug.LogFormat("**** app_target : {0}", app_target);

            var report = BuildPipeline.BuildPlayer(buildPlayerOptions);

            Debug.LogFormat("**** player : {0}", report);

            var summary = report.summary;

            Debug.LogFormat("**** summary.result : {0}", summary.result);

            if (summary.result == BuildResult.Succeeded)
            {
                Debug.Log("**** Succeeded!");
            }
            else if (summary.result == BuildResult.Failed)
            {
                Debug.Log("**** Failed!");
                foreach (var step in report.steps)
                {
                    foreach (var message in step.messages)
                    {
                        Debug.Log("****" + message);
                    }
                }
            }
            else if (summary.result == BuildResult.Cancelled)
            {
                Debug.Log("**** Cancelled!");
            }
            else
            { // Unknown
                Debug.Log("**** Unknown!");
            }
        }

        /**
         * Get Arguments from the command line by name
         */
        private static string GetArg(string name)
        {
            var args = System.Environment.GetCommandLineArgs();

            for (int i = 0; i < args.Length; i++)
            {
                if (args[i] == name && args.Length > i + 1)
                {
                    return args[i + 1];
                }
            }

            return null;
        }

        private static void HandleLog(string logString, string stackTrace, LogType type)
        {
            using (StreamWriter writer = new StreamWriter(logFilePath, true))
            {
                writer.WriteLine(logString);
                if (type == LogType.Exception || type == LogType.Error)
                {
                    writer.WriteLine(stackTrace);
                }
            }
        }
    }
}

+ Recent posts