빌드 자동화를 위해 Jenkins와 Unity를 연동해보고자 한다.
로컬에서 테스트 용도로 사용할 것이기 때문에 윈도우에 설치
사용자 setting -> Developer settings -> Personal access tokens
generate new token을 클릭
Token description에 토큰 이름, Select scopes에서 repo와 admin:repo_hook 체크 후 생성
생성된 access token을 복사해둔다. 한번 발급받으면 다시 같은 키를 해당 페이지에서 못보고, 잊어버린다면 재발급을 받아야한다.
(Jenkins 시스템 설정에서 사용된다)
젠킨스 관리 - 시스템 설정에 들어간다.
시스템 설정 하단에 GitHub Server 탭으로 간다.(Ctrl+F로 찾는 것을 추천)
나는 이미 연동해둔 상태이지만, 초기에는 아무것도 없을 것이다. GitHub Server를 눌러주고 Credentials를 생성해야한다.
입력 후 Add로 Credentials 추가
-none-에서 방금 생성한 Credentials로 바꿔준다.
(Test Connection으로 연결 확인 가능)
https://drehzr.tistory.com/605?category=343061
https://letterbox.tistory.com/6?category=883863
https://m.blog.naver.com/raveneer/221351916274
https://letterbox.tistory.com/m/6
Unity3d plugin, GitHub Integration Plugin, Publish Over SSH
plugin 설치
Jenkins 관리 - Global Tool Configuration - Unity3d
name : 유니터 버전 이름으로 적어주면 나중에 구분하기 쉽다(다른 유니티 버전도 추가할 경우)
Installation directory : 로컬 컴퓨터에 있는 유니티 설치 경로 넣어준다.
General
github project 주소 작성
소스 코드 관리
마찬가지로 깃허브 레포지토리 주소 작성
Credentials
Kind : SSH Username with private key
Private Key에서 Enter directly 선택
-> 깃허브 ssh pub키 입력
하단의 Github ssh 세팅 참고!!
빌드 유발
github webhook으로 빌드 유발을 할 것이기 때문에
Github hook trigger for GITScm polling에 체크
빌드
- plugin에서 설정한 유니티를 넣어준다.
- command line
quit : 커맨드 실행이 끝나면 Unity 에디터 종료
batchmode : 배치 모드로 Unity 실행
logFile "< pathname >" : 주어진 경로에 로그파일 생성
buildTarget "< name >" : 빌드 타겟 지정
projectPath "< pathname >": 주어진 경로의 프로젝트 열어서 수행 -> 유니티 폴더 이름까지 적어주면 됨
executeMethod < ClassName.MethodName > : Unity가 프로젝트를 열자마자 주어진 메소드를 실행. 해당 스크립트는 무조건 Editor 폴더에 배치
Unity 프로젝트 열어서 Assets 밑에 Editor 폴더 생성
Editor 폴더 내에 스크립트 작성
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEditor.Build.Reporting;
// Output the build size or a failure depending on BuildPlayer.
public class BuildPlayer : MonoBehaviour
{
[MenuItem("Build/Build AOS")]
public static void MyBuild_AOS()
{
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.scenes = new[] { "Assets/Scene1.unity", "Assets/Scene2.unity" };
buildPlayerOptions.locationPathName = $"Builds/AOS_{PlayerSettings.bundleVersion}.apk";
buildPlayerOptions.target = BuildTarget.Android;
buildPlayerOptions.options = BuildOptions.None;
BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
BuildSummary summary = report.summary;
if (summary.result == BuildResult.Succeeded)
{
Debug.Log("Build succeeded: " + summary.totalSize + " bytes");
}
if (summary.result == BuildResult.Failed)
{
Debug.Log("Build failed");
}
}
}
~ 주의점
https://m.blog.naver.com/zeboll/221134011377
https://haenny.tistory.com/128
https://kwonyeeun.tistory.com/81
https://choiiii-dev.tistory.com/17
https://jayy-h.tistory.com/30
https://kitty-geno.tistory.com/91
깃 push 시 자동빌드 하도록 설정해보겠다.
로컬로 진행할 경우 젠킨스 주소가 localhost:{포트번호}일 것이다.
주소가 localhost이면 깃허브에서 웹훅 설정을 할 때 연결할 수 없기 때문에
로컬 아이피를 고정시켜서 특정 주소와 포트번호로 젠킨스에 들어올 수 있도록
현재 컴퓨터의 아이피를 고정시켜줘야 한다.
(왜 이런 과정이 필요한지 궁금하면 포트포워딩에 대해 검색해보는 것을 추천)
서비스할 컴퓨터(Web Server)가 재 부팅될 경우 공유기(LG U+)가 새로운 IP를 할당하기 때문에
해당 컴퓨터(Web Server)의 물리적인 주소를 얻어와서 IP 주소를 고정시켜 놓는다.
ipconfig /all
->랜카드의 물리적 주소 확인
공유기에 따라 DHCP를 고정할당하는 방법과 포트포워딩하는 방법이 다르다.
나는 U+ 공유기를 쓰기 때문에 따로 검색해서 설정했다
포트포워딩 시 처음에 젠킨스 설치 시 열어뒀던 포트를 포트포워딩 해야한다.
나는 8080 포트를 열었기 때문에 8080 포트를 포트포워딩 했다.
1번 과정을 거쳤는데도 포트가 열리지 않은 경우에 실행한다.
Windows Defender 방화벽 실행
고급 설정
인바운드 규칙 생성
포트 선택
TCP 선택
특정 로컬 포트 선택 -> 위에서 열어줬던 젠킨스 포트(나는 8080포트)
연결 허용
프로필은 모두 선택, 이름은 본인이 구분하기 쉽게 짓는다(나는 Jenkins로 지어뒀다)
나는 윈도우 방화벽도 풀어줬는데 포트가 안열렸다.
이것저것 삽질했는데 결국은 백신 프로그램에서 방화벽을 막아줘서 안된 것이었다.
백신 프로그램마다 방화벽 푸는 방법은 다를 테니 방법은 넘어간다.
만약 포트포워딩으로도 포트 접속이 안되면 백신 방화벽을 의심해보자.
Jenkins - 시스템 관리 - Jenkins Location
깃허브 유저의 Setting - SSH and GPG keys
에서 로컬에서 만든 ssh 키를 등록해준다.
위에서 만든 ssh키의 퍼블릭키를
project - 구성 - 소스코드 관리 - Credentials에 넣어야 한다.
private key에 id_rsa(pub)의 코드를 넣어준다.
레포지토리 세팅 - webhook에 들어가서 Add webhook
push 할 때만 빌드를 원한다면 Just the push event에 체크
본인이 원하는 설정이 있으면 Let me select individual events 체크 -> 원하는 항목에 체크
정상적으로 연결이 됐으면, 웹훅이 작동하며 초록색 체크표시가 뜰 것이다.
젠킨스로 돌아가서 빌드가 완료됐으면 성공한 것이다.
system -> github server 가 안보입니다