ETC/Unity

[Unity] Jenkins, Gitea를 활용해 유니티 자동빌드하기 - 1 -

Jade Choe 2024. 5. 20. 16:12
SMALL

진행중인 프로젝트는 macOS와 Windows 두가지 OS를 지원한다.

 

매번 빌드때마다 git push / pull 후 수동 빌드하기가 번거로워서 Jenkins로 자동 빌드 환경을 구성했다.

 

Github를 사용하지 않고 Gitea를 사용하는 이유는.....

LFS Bandwidth 무료 사용량을 초과해서..........

 

이지만, Github와 Gitea의 설정 방법은 완전히 동일하다. 

 

유니티 빌드 스크립트 작성

유니티 에디터의 CLI 빌드 시 빌드 스크립트가 있어야 한다.

 

- 유니티 스크립트 추가 : "Assets/Editor/CLIBuild.cs"

에디터 폴더에 작성해야 하며, 모든 멤버는 static이어야 한다.

 

using System.Linq;

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


public class CLIBuild : MonoBehaviour
{
    private static string WINDOWS_PATH = "Builds/Windows_x64";
    private static string MACOS_PATH = "Builds/macOS";

    private static string[] demoScenes = { 
        "Assets/Scenes/Title.unity",
        "Assets/Scenes/LoadingScene.unity",
        "Assets/Scenes/Credit.unity",
        "Assets/Scenes/MainScene.unity",
    };

    [MenuItem("Build/Build: Windows x64")]
    public static void BuildWindowsX64()
    {
        string TARGET_PATH = $"{WINDOWS_PATH}/{PlayerSettings.bundleVersion}";
        Directory.CreateDirectory(TARGET_PATH);

        PlayerSettings.SetScriptingBackend(BuildTargetGroup.Standalone, ScriptingImplementation.IL2CPP);

        BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
        buildPlayerOptions.scenes = demoScenes;
        buildPlayerOptions.locationPathName = $"{TARGET_PATH}/{PlayerSettings.productName}.exe";
        buildPlayerOptions.target = BuildTarget.StandaloneWindows64;
        buildPlayerOptions.options = BuildOptions.None;


        BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
        BuildSummary summary = report.summary;

        if (summary.result == BuildResult.Succeeded)
        {
            System.Console.WriteLine("===== Build succeeded: " + summary.totalSize + " bytes =====");
        }

        if (summary.result == BuildResult.Failed)
        {
            System.Console.WriteLine("===== Build failed =====");

            var errors = report.steps
                .SelectMany(step => step.messages)
                .Where(message => message.type == LogType.Error || message.type == LogType.Exception)
                .Select(message => message.content);

            foreach (var error in errors)
            {
                System.Console.WriteLine(error);
            }
            
        }
    }

    [MenuItem("Build/Build: macOS")]
    public static void BuildMacOS()
    {
        string TARGET_PATH = $"{MACOS_PATH}/{PlayerSettings.bundleVersion}";
        Directory.CreateDirectory(TARGET_PATH);


        BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
        buildPlayerOptions.scenes = demoScenes;

        buildPlayerOptions.locationPathName = $"{TARGET_PATH}/{PlayerSettings.productName}.app";
        buildPlayerOptions.target = BuildTarget.StandaloneOSX;
        buildPlayerOptions.options = BuildOptions.None;

        PlayerSettings.SetScriptingBackend(BuildTargetGroup.Standalone, ScriptingImplementation.IL2CPP);

        BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
        BuildSummary summary = report.summary;

        if (summary.result == BuildResult.Succeeded)
        {
            System.Console.WriteLine("===== Build succeeded: " + summary.totalSize + " bytes =====");
        }

        if (summary.result == BuildResult.Failed)
        {
            System.Console.WriteLine("===== Build failed =====");

            var errors = report.steps
                .SelectMany(step => step.messages)
                .Where(message => message.type == LogType.Error || message.type == LogType.Exception)
                .Select(message => message.content);

            foreach (var error in errors)
            {
                System.Console.WriteLine(error);
            }
            
        }
    }   
}

 

 

젠킨스 플러그인 설치

Jenkins 관리 - Plugin 관리에서 아래 플러그인을 설치해준다.

 - Unity 3D

 - Node And Label Parameter

 

Git API 관련 플러그인은 초반에 설치가 되어있어 넘어갔다.

 

유니티 에디터 경로 지정

Jenkins 관리 - Tools에서 아래로 내려보면 Unity3d Installations 항목이 있다.

추가 후 이름과 에디터 경로를 지정해주면 된다.

 

경로는 추후 빌드 환경에 따라 다시 바꿔줄 것이므로, 대충 아무거나 넣어줘도 무방하다.

 

빌드 노드 추가

Jenkins 관리 - Nodes에 들어가 빌드 머신의 노드를 추가해준다.

New Node

 - macOS

 - Windows-x64

 

빌드 환경 변수 추가

빌드할 플랫폼별 CLI 명령어의 인수가 달라지므로, 환경 변수를 설정해 주어야 한다.

 

Node 우측의 톱니바퀴 아이콘 클릭

 

- 중간의 Remote Root Directory에 Jenkins Workspace로 지정할 경로 추가

 

macOS : /Volumes/External/Jenkins

Windows: E:\Jenkins

 

경로는 본인 상황에 맞게 수정하면 된다.

 

 

- Node Properties 의 Environment variables 체크 후 값 추가

BUILD_TARGET:

- macOS : OSXUniversal

- Windows : Win64

 

EXECUTE_METHOD - 클래스명.메서드명

- macOS : CLIBuild.BuildMacOS

- Windows : CLIBuild.BuildWindowsX64

 

바로 아래에 있는 Tool Locations도 체크 후 전역으로 설정했던 유니티 에디터의 경로를 플랫폼에 맞게 수정해준다.

 

 

- macOS : /Applications/Unity/Hub/Editor/2022.3.19f1/Unity.app

- Windows: E:\2022.3.19f1

 

주의할 점은 macOS 버전은 Unity.app까지 설정해주어야 하고,

Windows 버전은 Editor가 있는 폴더까지만 설정해주어야 한다.

 

유니티 설치경로는 Unity Hub - Installs에서 볼 수 있다.

BIG