ETC

Jenkins 젠킨스 + Unity 빌드

일등하이 2019. 2. 8. 16:38
반응형


유니티 커멘드라인 인수 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


반응형