CI-CD/Jenkins

유니티 프로젝트 젠킨스로 빌드 자동화

게임만드는학생 2025. 4. 10. 13:01

https://tpree.tistory.com/208

 

벡터 기초 2

https://tpree.tistory.com/207 벡터 기초벡터는 크기와 방향으로 이루어졌다. 크기는 length 또는 Magnitude 라고 한다. 방향은 Normalized 로 표시한다. 왜냐하면 벡터에서 크기요소를 1로 고정해서 영향을

tpree.tistory.com

 

https://github.com/gxtxhm/VectorPracticeWithJenkins

 

 

간단하게 CI/CD를 실습해보기로 했다. 

게임잡에서 요구사항이나 우대사항 중 젠킨스라는 단어가 보였기 때문이다. 

 

빌드 및 배포 자동화라는 개념이며 뭐든 해보는 것이 중요하다 생각해 실습해보았다. 

 

젠킨스를 위해 여러가지 설치를 하고 윈도우 계정 정보를 입력한다. 

이는 젠킨스가 백그라운드로 작업하기 위해서라고 한다. 

 

젠킨스를 설치하고 빌드 자동화를 먼저 해본다. 

 

D:\2022.3.57f1\Editor\Unity.exe" ^
-quit -batchmode ^
-projectPath "D:\UnityProject\VectorPractice" ^
-executeMethod BuildScript.BuildWindows ^
-logFile build.log

 

 

빌드를 하라는 명령어이다. 

이 때 executeMethod는 Assets/Editor/ 안에 스크립트를 만들고 함수를 만들면 된다. 

Editor안에 있어야 인식할 수 있다. 

 

public class BuildScript
{
    public static void BuildWindows()
    {
        string[] scenes = { "Assets/Scenes/SampleScene.unity" };
        BuildPipeline.BuildPlayer(
            scenes,
            "Build/MyGame.exe",
            BuildTarget.StandaloneWindows64,
            BuildOptions.None
        );
    }
}

스크립트의 코드이다. 

 

빌드를 해보았으니 젠킨스의 새 아이템을 만들고 직접해보았다. 

먼저 freestyle로 진행했는데 add build step 에 명령어를 입력하고 now build 를 해보니 정말 빌드가 되었다. 

확실히 너무 편리하긴 하다. 

물론 혼자하는 입장에서 체감이 확 느껴지는 정도는 아니지만 협업이라고 생각하면 너무 편리할 것이라고 생각된다. 

 

다음은 깃허브 연결이다. 

누군가 깃허브에서 push -> 자동으로 빌드 및 디스코드 알림보내기 까지가 이번 프로젝트이다. 

푸시한 걸 감지하기 위해 webhook 이란 기능을 사용한다. 

따라서 깃허브 프로젝트에서 webhook을 추가해야하는데 이  때, 로컬에선 localhost 로 접근하지만, 외부에선 젠킨스에 접근할 수 없으므로 포트포워딩을 진행해야한다. 외부에서 접근 가능한 url로 변경해주는 건데 ngrok 를 알아보면 된다. 

 

이를 webhook으로 추가하고 젠킨스에 이를 연결한다. 

트리거에서 GitHub hook trigger for GITScm polling 를 체크하고 소스코드관리에서 git 저장소를 연결하면 된다.

 

그리고 push를 하면 자동으로 build 되는 것을 볼 수 있다.

 

마지막으로 discord 알림이다. 

slack을 현업에서 사용한다지만 실습진행을 위해 discord로 대체했다. 

이 경험으로 개인적인 프로젝틀르 진행할 때 discord와 젠킨스를 이용해 자동화하면 될 것 같다.

 

본론으로 돌아와서 discord 알림을 위해 discord 채널 설정을 보면 webhook 설정이 있는데 여기서 관련 코드를 복사하고

기존 젠킨스 아이템에 add build step 으로

powershell 
-ExecutionPolicy Bypass 
-Command "[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
$headers = @{ 'Content-Type' = 'application/json' }; 
$body = @{ content = ' Unity build succeeded! `n 
Output: Builds/Windows/MyGame.exe`n  please verify!' } | 
ConvertTo-Json -Compress; Invoke-RestMethod 
-Uri 'https://discord.com/api/webhooks/1234/LyUF7-3ogYCq-hJpGJ' 
-Method Post -Headers $headers -Body ([System.Text.Encoding]::UTF8.GetBytes($body))"

이런식으로 추가하면 body 내용이 알림으로 그 채널에 도착하는 것을 볼 수 있다. 

 

근데 여기서 빌드 성공, 실패를 분기하기 위해서 파이프라인을 이용해야했다. 

 

새 아이템을 만들고

pipeline {
    agent any

    triggers {
        githubPush()
    }

    environment {
        DISCORD_WEBHOOK = 'https://discord.com/api/webhooks/1/LgUrWGVQkyUF7-3odCq-h82J'
    }

    stages {
        stage('Checkout') {
            steps {
                git url: 'https://github.com/gxtxhm/VectorPractice.git', branch: 'master'
            }
        }

        stage('Unity Build') {
            steps {
                bat '"D:\\\\2022.3.57f1\\\\Editor\\\\Unity.exe" -quit -batchmode -projectPath "D:\\\\UnityProject\\\\VectorPractice" -executeMethod BuildScript.BuildWindows -logFile build.log'
            }
        }
    }

    post {
        success {
            echo ' Build succeeded, sending Discord message.'
            bat 'powershell -ExecutionPolicy Bypass -Command "[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; $headers = @{ \\"Content-Type\\" = \\"application/json\\" }; $body = @{ content = \\"Build succeeded.\\nOutput: Builds/Windows/MyGame.exe\\nQA please verify.\\" } | ConvertTo-Json -Compress; Invoke-RestMethod -Uri \\"%DISCORD_WEBHOOK%\\" -Method Post -Headers $headers -Body ([System.Text.Encoding]::UTF8.GetBytes($body))"'
        }

        failure {
            echo ' Build failed, sending Discord message.'
            bat 'powershell -ExecutionPolicy Bypass -Command "[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; $headers = @{ \\"Content-Type\\" = \\"application/json\\" }; $body = @{ content = \\"Build failed.\\nPlease check the Jenkins logs.\\" } | ConvertTo-Json -Compress; Invoke-RestMethod -Uri \\"%DISCORD_WEBHOOK%\\" -Method Post -Headers $headers -Body ([System.Text.Encoding]::UTF8.GetBytes($body))"'
        }
    }
}

 

이런식으로 명령어를 입력하면 된다. 

 

이렇게 알림을 받아볼 수 있다. 

 

협업할 일이 생기면 써봐야겠다. 

깃 푸시했을 때 매번 뭐가 올라왔는지 확인하는 것도 그렇고 뭐 올렸다고 확인하는 것도 번거로운데 slack이나 디스코드에

알림을 보내놓으면 편할 것 같다. 

 

안드로이드 빌드나 빌드파일 압축 등 뭔가 더 있는데 추후 진행해봐야겠다.

또 이걸 하기 위해 세팅과정이 꽤나 번거로웠는데 알기로는 docker 가  이런 것들을 한번에 세팅해주는 기능이 있다고 한다. 

docker도 공부해봐야겠다.