Jenkins 젠킨스 + Unity 빌드
유니티 커멘드라인 인수 https://docs.unity3d.com/kr/530/Manual/CommandLineArguments.html
빌드리포트 관련 : https://qiita.com/RyotaMurohoshi/items/dc8520aae16cabbe2be1
keystore, alias 비밀번호 입력 관련 : https://answers.unity.com/questions/1453570/command-line-build-for-android-strips-out-used-ass.html
타겟그룹 : https://docs.unity3d.com/ScriptReference/BuildTargetGroup.html
젠킨스 빌드 관련 배치 스크립트 : https://superuser.com/questions/1271138/how-to-build-unity3d-projects-for-holo-lens-using-jenkins-and-msbuild-on-windows
빌드파이프라인 : https://docs.unity3d.com/ScriptReference/BuildPipeline.BuildPlayer.html
윈도우 배치 스크립트 : https://www.tutorialspoint.com/batch_script/batch_script_environment.htm
젠킨스 유니티 플러그인 : https://wiki.jenkins.io/display/JENKINS/Unity3dBuilder+Plugin
젠킨스 유니티 빌드 : https://slway000.tistory.com/74
유니티 커멘드라인 인자 (executeMethod ) https://docs.unity3d.com/kr/current/Manual/CommandLineArguments.html
젠킨스 자동빌드 : https://hkn10004.tistory.com/36
autobuilder.bat
1 2 3 4 5 6 7 8 9 | echo %PATH% echo %USERDOMAIN%\%USERNAME% "C:\Program Files\Unity_2018_3_0f2\Editor\Unity.exe" -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 | cs |
AutoBuilder.cs
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | using UnityEngine; using UnityEditor; using System.Collections; using System.Collections.Generic; using System; using UnityEditor.Build.Reporting; 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; [MenuItem("Custom/CI/Windows Mixed Reality Build (UWP)")] public static void PerformWindowsMixedRealityBuild() { 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); } 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; } } } | cs |