Programmer:)

[Jenkins-Pipeline] Pipeline 구성 (commandline 인자 값 받아오기) 본문

DEV/Jenkins

[Jenkins-Pipeline] Pipeline 구성 (commandline 인자 값 받아오기)

ryeggg 2022. 4. 21. 16:53
반응형

전 게시물에서 gitlab 연동작업을 완료했다.

최신 브랜치를 받은 후 빌드까지 순차 작업 할 수 있도록 설정해보자

 

#Freestyle project job을 하나를 만든다. (난 windows32bit , 64bit 이렇게 빌드를 하기위해 각각 job을 생성했다.)

 

#빌드환경 - build에서 Invoke Unity3d Editor를 클릭한다.

editor command line arguments에는

-quit

-batchmode

-projectPath "unity project 파일 경로"   

//나는 테스트로 프로젝트경로로 했지만 jenkins gitlab 다운 경로로 연결하면 된다.

//C:\ProgramData\Jenkins\.jenkins\workspace 아마 이런 경로일것이다.

-executeMethod 클래스명.함수명

-logFile "로그파일이 생성될 경로"

를 입력한다.

 

-executeMethod 부분이 제일 중요한데 이 부분 함수가 실행되어야지 unity build가 진행된다.

내가 사용한 BuildTEST 스크립트를 예를 들어 설명하면

이 스크립트는 유니티 Assets/Editor 폴더안에 있어야하고 Build32 함수는 static으로 정의되어야한다.

스크립트는 하단 사진을 참조하여 작성하면 된다.

 

 

#이렇게 한 후 저장을 누른후 지금 빌드를 클릭하여 문제없이 구동되는지 확인한다.

#이제 이 생성한 job을 전에 생성한 파이프라인에 연결하여 깃랩 업데이트 후 빌드까지 진행해보자 

전에 생성한 파이프라인 job을 선택해 구성을 클릭한 후 스크립트를 아래와 같이 추가해주면 된다.

여기서 stage 이름은 임의로 지정해주면 되고 build '위에서 생성한 job 이름' 을 넣어주면 된다.

깃랩에서 다운로드 -> 32bit build 진행 -> 64bit build 진행 순으로 진행된다.

 

#잘된다면 아래와 같은 이미지를 볼 수 있다.

 

 

+++ 추가 +++

이렇게 하나로 만들어놓고 command line에서 인자값을 받아서 이름과 비트를 선택하여 빌드하고 싶었다.

 

#commandline에서 인자값을 추출하는 함수를 작성

 

#commandline에서 호출할 함수

 

#이런식으로 인자값을 넣어 사용할 수 있다.

-quit -batchmode -projectPath "D:\Ryeji\Dev\Test\jenkinsTEST" -executeMethod BuildTEST.BuildJenkins 

-bit "64" -name "test01" -logFile "D:\Ryeji\Dev\Test\jenkinsTEST\Build\logfile.log"

 

전체 코드

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class BuildTEST : MonoBehaviour
{
    public static void BuildJenkins()
    {
        string bit = GetArg("-bit");
        string name = GetArg("-name");

        Build(bit, name);
    }


    public static void Build(string _bit, string _name)
    {
        string[] scenes = { "Assets/Scenes/TEST.unity" };
        string path = "D://Ryeji/Dev/Test/jenkinsTEST/Build";
        string fullPath = "";
        BuildTarget buildTarget = BuildTarget.StandaloneWindows;
        
        if (_bit == "32")
        {
            buildTarget = BuildTarget.StandaloneWindows;
            fullPath = string.Format("{0}/{1}/{2}.exe", path, _bit, _name);
        }
        else if(_bit == "64")
        {
            buildTarget = BuildTarget.StandaloneWindows64;
            fullPath = string.Format("{0}/{1}/{2}.exe", path, _bit, _name);
        }

        BuildPipeline.BuildPlayer(scenes, fullPath, buildTarget, BuildOptions.None);

    }

    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;
    }
}
반응형
Comments