Github를 이용하여 언리얼 엔진 프로젝트를 관리하고 있었는데, 프로젝트의 용량이 거대해지다보니 깃허브에는 소스코드 위주로 올리게 되었습니다.
이런 경우에 소스코드가 문제가 있는지 없는지 깃허브에서는 파악할 수 없기 때문에 올려놓은 코드가 이상해지거나 문제가 발생하면(에초에 문제가 발생한지도 모를 수 있습니다) 대처하는데 많은 시간이 발생하게 됩니다.
이 문제를 해결하기 위해서 CI/CD로 프로젝트를 관리하는 체계를 구축하고 백그라운드에서 컴파일을 진행하고자 했습니다.
이 과정에서 CI/CD 툴을 선택해야 했었는데, 가장 많이 사용하는 툴인 Jenkins와 Github Actions 중, 오픈소스에 무료로 제공해주는 Jenkins를 선택했습니다.
아 물론 Github Actions를 적용해보기도 했습니다. 사실 Github Actions와 관련된 포스팅을 하려고 했으나 수십번의 시행착오 끝에 Jenkins를 선택할 수 밖에 없었습니다.😭😭
CI 테스트는 별개의 브랜치에서 진행하는 것이 올바른 방법이였는데, 당시에는 몇번하면 되겠거니하고 테스트를 하다보니 커밋도 미친듯이 불어나게 되었습니다. 😅😂😔😢(여러분은 부디 테스트는 브랜치를 따로 파셔서 하시길...)
간단하게 차이점에 대해서 짚어볼까 합니다.
젠킨스는 오픈 소스이며, 로컬 또는 서버에 설치하여 사용합니다. 여기서 로컬이 중요합니다.
반면 Github Actinos는 GitHub에서 호스팅되며, 깃허브 리포지토리와 직접 통합되어 있어서 깃허부와의 연동성 측면에서 정말 유리합니다.
하지만 깃허브는 자체 호스팅 서비스를 이용해야 하기 때문에 언리얼 엔진의 경우, 저희가 이용하는 클라우드에는 빌드된 엔진이 존재하지 않습니다.
그러니 Github Actions를 이용하려면 자체 엔진을 클라우드에 구축하는 작업이 테스트 과정에 포함되어야 하는 것이죠.
아시다시피 언리얼 엔진은 빌드할 때 최소 30분에서 1시간이상이 걸리기 때문에 테스트 한 번 하는데 1시간이라는 시간을 소모하는 것은 정말 비효율적입니다.
그렇기 때문에 언리얼 개발자 입장에서는 Github Actions보다 로컬 호스트로 테스팅이 가능한 Jenkins가 유리한 것입니다.(하루 동안의 시행착오를 통해 겪은 경험이기에 더 좋은 방법이 있을 수 있습니다.)
Jenkins를 시작하려면 먼저 설치를 해야겠죠.
1. 설치 링크 받기
제 작업환경은 windows이기 때문에 아래 링크의 파일을 받아서 실행해줬습니다.
https://www.jenkins.io/download/thank-you-downloading-windows-installer/
2. 젠킨스 설치
순서대로 진행해줍니다.
2-1. JDK 설치
Jenkins의 경우 Java환경에서 동작하기 때문에 JDK도 설치해줘야합니다. 젠킨스 2.456기준으로 JDK는 11, 17, 21만 지원하기 때문에 저는 21을 받았습니다.
JDK Oracle : https://www.oracle.com/kr/java/technologies/downloads/#java21
설치 후 설치한 JDK 경로를 입력한 뒤 Next 클릭
3. 설치 완료 및 실행 체크
설치를 완료하면 작업 관리자에서 젠킨스가 실행되는 것을 확인할 수 있습니다. (실행중이 아니라면 설치된 폴더에서 Jenkins.exe를 실행시켜주면 됩니다.)
설치와 관련해서는 https://youtu.be/XuMrEDA8cAI?t=381 이 영상을 참고하셔도 좋습니다.
1. 설치 폴더 확인
젠킨스가 설치된 폴더로가면 아래와 같이 로그파일이 잔뜩 있는걸 확인할 수 있습니다.
2. 로그 확인
jenkins.err.log를 열어보면 아래처럼 키코드가 하나 있고 아래쪽에 Jenkins is fully up and running
이 떠있다면 아무 문제가 없다는 의미입니다. 여기서 Key만 복사해둡니다. 나중에 필요합니다.
3. localhost:포트번호
설치할 때 포트번호를 이용해서 Test Port
한 포트 번호를 인터넷 브라우저에 localhost:포트번호
형식으로 입력해줍니다. 그러면 아래와 같은 창이 나오고 여기에 아까 복사해둔 Key를 입력하면 됩니다.
3. Install suggested plugins를 선택합니다.
4. 기다립니다.
5. 입력창이 나오는데 순서대로 어드민이름, 패스워드 + 패스워드 확인, 풀네임(어드민이름으로 했습니다), 이메일입니다. 원하는 대로 입력하면 됩니다. 패스워드는 입력하지 않으면 아까 저희가 복사한 Key를 매번 사용해야 하므로 꼭 입력해줍시다.
6. Jenkins URL은 그대로 두고 넘어갑니다.
이렇게하면 젠킨스 환경은 모두 구축했습니다.
이제 밑작업이 다 끝났으니 젠킨스 프로젝트를 생성해줍시다.
젠킨스 브라우저에서 좌측란에 새로운 Item
을 눌러줍니다.
프로젝트를 선택하는 곳에서 원하는 프로젝트 명을 넣어준 다음, Freestyle project
를 선택하고 OK를 눌러줍니다.
General란에서 Github project
를 체크해주고 url에 작업할 프로젝트 링크를 넣어줍니다.
소스코드 관리에서 Git
을 선택해주고 위에서 URL에는 프로젝트 링크에 .git이 포함된 링크를 넣어줍니다. https://github.com/프로필이름/프로젝트명.git
처럼 만들어주면 됩니다.
그리고 토큰을 넣어줘야 하는데, 토큰을 생성해주면 Credentials
에서 선택해서 사용할 수 있습니다.
마지막으로 빌드할 Branch를 설정해줍니다. 테스트가 필요한 경우 테스트용 branch를 설정해주면 됩니다.
여러 옵션들이 존재하지만 Github hook trigger for GITScm polling
을 선택해줍니다. 이 옵션은 push를 시도할 때 변경점이 있으면 빌드를 실행합니다.
여기선 실제로 빌드할때 실행할 명령어를 입력할 수 있는데, 저는 윈도우 Cmd환경이 익숙해서 Add build step
에서 Execute Windows batch command
를 선택했습니다.
Command란에는 아래의 명령어를 넣어줬습니다. 이대로 실행하면 프로젝트 파일 생성 → 컴파일 → 패키징
순으로 테스트를 진행합니다.
rem @echo off
setlocal
# 설치된 언리얼 엔진 경로 셋팅(로컬)
set enginepath=C:\UE_5.3\Engine
# 설치된 MSBuild 경로 셋팅
set msbuild=C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe
set projectname=프로젝트 이름
set nowdir=%WORKSPACE%
set outputdir=패키징 output경로
rd /s /q "%nowdir%\Binaries"
rd /s /q "%nowdir%\Intermediate"
rd /s /q "%nowdir%\Saved"
# 프로젝트 파일 생성
if exist "%nowdir%\Source" ("%enginepath%\Binaries\DotNet\UnrealBuildTool.exe" -projectfiles -project="%nowdir%\%projectname%.uproject" -game -rocket -progress)
# 프로젝트 컴파일
if exist "%nowdir%\%projectname%.sln" ("%msbuild%" "%nowdir%\%projectname%.sln" /t:build /p:Configuration="Development Editor";Platform=Win64;verbosity=diagnostic)
# 프로젝트 패키징
"%enginepath%\Build\BatchFiles\RunUAT.bat" BuildCookRun -project="%nowdir%\%projectname%.uproject" -noP4 -platform=Win64 -clientconfig=Development -serverconfig=Development -cook -allmaps -build -stage -pak -archive -archivedirectory=%outputdir%
%WORKSPACE% 는 아래 Workspace에서 보이는 것처럼 최상단 경로를 뜻합니다. 여기선 ProjectR_Build
가 되겠네요.
저장하면 프로젝트 셋팅은 끝났습니다.
토큰 생성은 본인의 Github에서 우측 위에 있는 [Github 프로필] → [Settings] 으로 들어갑니다.
그리고 [Developer settings] 으로 들어가면 [Personal access tokens] 란이 있습니다.
토큰 생성에는 [Fine-grained tokens] 과 [Tokens(classic)] 2가지 방법이 있는데, 저는 [Tokens(classic)] 으로 생성했습니다.
토큰을 생성하기 위해 Gegerate new token
을 클릭합니다.
Note는 원하는 이름을 적고 맨 아래의 Generate token
으로 생성해줍니다. 저는 repo와 admin기능 중 일부를 활성화했습니다.
그리고 생성된 토큰의 키를 복사해둡니다. 이 페이지를 벗어나면 토큰 키를 더이상 사용할 수 없기 때문에 무조건 복사해두셔야합니다.
유사한 방법으로 https://blog.pocu.academy/ko/2022/01/06/how-to-generate-personal-access-token-for-github.html 에서도 다루고 있으니 참고하시면 좋습니다.
대시보드의 [Jankins 관리] → [Credentials] 에 들어간 후 순차적으로 진행해줍니다.
마지막으로 Create
로 생성한 후, 프로젝트의 소스 코드 관리에 생성한 토큰을 넣어주면 됩니다.
이제 프로젝트를 실제로 빌드해볼 차례입니다. 대시보드에서 생성된 프로젝트를 클릭하고 지금 빌드를 선택하면 바로 빌드를 테스트해볼 수 있습니다.
여기서 주의 사항은 언리얼의 일부 모듈이 간혹 링크 에러가 발생하는 경우가 있습니다. 이경우에는 해당 파일만 빌드에서 제외시켜주면 됩니다.(왜 문제가 발생하는지는 모르겠습니다.)
빌드를 누르면 Build History
에 해당 빌드가 진행상황이 나타나고 #8 을 선택해 빌드 상태를 자세히 확인할 수 있습니다.
빌드 상태 창에서 콘솔 출력을 통해 로그를 확인하며 잘못된 부분을 즉각적으로 확인이 가능하고 빌드 성공시 대시보드에서 성공여부를 확인할 수 있습니다.
젠킨스는 Github Actions보다 훨씬 간편하게 작업할 수 있어서 편했습니다. 이런식으로 자동화를 진행하면 보다 편리하게 작업할 수 있고 유지 보수에도 유용하다는 장점이 있습니다. 실제로 배포과정도 자동화 할 수 있다고하니(아마도요) 정말 강력한 툴인 것 같습니다.
이 글에는 잘못되거나 누락된 내용이 일부 있을 수 있습니다. 언제나 피드백은 환영입니다.
긴 글 읽어주셔서 감사합니다! 내잔이였습니다.