GitHub: https://github.com/gsk120/UnityAutoBuild_iOS
유니티 빌드 자동화에 대한 설명을 다룬 ppt 입니다.
빌드 자동화에대해 고민이 많으신 분들을 위해 조금이나마 도움이 되고자 이렇게 자료를 공유합니다.
루비 Rakefile을 이용하여 Unity build -> Xcode 수정 -> Xcode build -> ipa 추출까지 한번에 진행하는 과정을 설명하였습니다.
Xcode 빌드가 안드로이드에 비해 상당히 느리기 때문에 수동으로 빌드하는 경우 신경써야 하는 일이 상당히 많습니다. 이 시간을 절약하여 개발에 좀더 투자할 수 있다면 개발자는 더욱 높은 퀄리티의 프로그램을 구현할 수 있을 것입니다. 하지만 빌드 자동화에 대한 정보가 많이 부족하고, 매뉴얼 형식의 자료가 별로 없어 구축하는데 꾀나 많은 조사와 분석이 필요합니다.
수동으로 빌드하며 고생하시는 분이나, 자동화 구축을 위해 고생하시는 분들께 같은 고민을 한 입장으로써, 부족하지만 도움이 되고자 이렇게 빌드 자동화 ppt를 공유합니다.
3. Chapter 1 빌드 자동화 필요성
자동화 이전
- 반복되는 세팅
- 긴 시간의 빌드 타임
- 인간의 실수
자동화 이후
- 명령어 한 줄
- 개발자는 개발만
- 릴리즈 버전관리
무엇 보다도 사람이 편해야 한다!
4. Chapter 1 빌드 자동화 필요성
목표
단 하나의 명령어로 원하는 세팅의 빌드가 나오는 것!
5. Chapter 2 빌드 자동화 구현
개발 환경
Xcode
5.1.1
Unity
4.2.2f1
Ruby
2.0.0-p247
Mac OSX
10.9.5
6. Chapter 2 빌드 자동화 구현
Unity 3D iOS 빌드 과정
Unity Build
• Unity를 빌드하여 Xcode 프로젝트를 생성한다.
Xcode Setting
• framework, library, app icon, provisioning 등 빌드하기 위한 설정
Xcode Build
• Xcode 빌드를 통해 최종적으로 ipa 파일을 추출
11. Chapter 2 빌드 자동화 구현 – 1. unity build
1. Unity Build
#{UNITY} -batchmode -projectPath #{PROJECT_DIR} -executeMethod #{BUILD_METHOD} –quit
-projectPath 빌드할 유니티 프로젝트의 경로
• 유니티 프로젝트의 절대경로를 루트 부터 입력
• ex) /Users/giseok/unity/test_proj
12. Chapter 2 빌드 자동화 구현 – 1. unity build
1. Unity Build
#{UNITY} -batchmode -projectPath #{PROJECT_DIR} -executeMethod #{BUILD_METHOD} –quit
-executeMethod 실행할 빌드 함수
• 빌드를 수행하는 static함수의 이름을 입력한다. (C#으로 이동)
• ex) ExecuteMethods.IOSBuild
13. Chapter 2 빌드 자동화 구현 – 1. unity build
1. Unity Build
#{UNITY} -batchmode -projectPath #{PROJECT_DIR} -executeMethod #{BUILD_METHOD} –quit
-quit 함수 실행 후 종료
• 실행할 함수를 완료한 후 유니티를 종료하는 옵션이다.
14. Chapter 2 빌드 자동화 구현 – 1. unity build
1. Unity Build - excuteMethod
Xcode
생성
ExecuteMethods
Pbxproj
수정
Info.plist
수정
15. Chapter 2 빌드 자동화 구현 – 1. unity build
1. Unity Build - excuteMethod
Xcode
생성
ExecuteMethods
Pbxproj
수정
Unity에서 제공하는
BuildPipelie.BuildPlayer 함
수를 이용하여 빌드!
Info.plist
수정
16. Chapter 2 빌드 자동화 구현 – 1. unity build
1. Unity Build - excuteMethod
Xcode
생성
ExecuteMethods
Pbxproj
수정
Unity에서 제공하는
BuildPipelie.BuildPlayer
함수를 이용하여 빌드!
Info.plist
수정
BuildPipeline.BuildPlayer (
string[] levels,
string locationPathName,
BuildTarget target,
BuildOptions options
)
17. Chapter 2 빌드 자동화 구현 – 1. unity build
1. Unity Build - excuteMethod
Xcode
생성
ExecuteMethods
Pbxproj
수정
Info.plist
수정
Xcode 빌드에 필요한
framework, Code Signing,
필요한 파일 import
18. Chapter 2 빌드 자동화 구현 – 1. unity build
1. Unity Build - excuteMethod
Xcode
생성
ExecuteMethods
Pbxproj
수정
App 아이콘, URL Type 등
Info.plist
수정
Info.plist 수정
20. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
projmod 파일
빌드에 필요한 framework, library, header, file, folder를 적어둔 파일.
유니티 빌드 시 이 파일들을 모두 읽어 Xcode Project를 설정해 준다.
따로 폴더에 projmod파일들을 저장해두고, 빌드 시 projmod파일 전
부를 읽어 자동으로 설정한다.
좀더 상세한 내용은 Github의 XcodeProjectModifier 참고.
21. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
projmod 파일 (key value)
* group: Xcode 프로젝트 루트에 해당 이름의 그룹 폴더 생성 후 아래서 지정하는 라이브러리, 프레임워크, 파일 등을 저장
* libs: dylib와 같은 추가할 라이브러리 입력
* frameworks: 추가할 framework 입력 => iOS SDK로 부터 해당 프레임워크를 찾음
* headerpaths: 추가할 헤더파일의 경로를 입력 (실제 헤더파일은 files를 이용해 추가 즉, 경로만 설정해줌)
* files: 추가할 파일의 리스트를 입력 (코드 및 icon 파일, iOS SDK 외 별도 framework와 .a 파일도 이곳에 추가)
* folders: 입력한 경로에 있는 폴더를 추가 => 재귀적으로 하위 폴더 및 파일 모두 추가함
* excludes: 폴더를 추가할 때 추가하지 않아도 되는 파일의 확장자명을 적는 부분
22. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
projmod 파일 – 작성 예시
iOS SDK에서 제공하는 framework 추가
{
"frameworks": ["MessageUI.framework","StoreKit.framework","iAd.framework",
"CoreData.framework“,"Security.framework","AdSupport.framework"]
}
23. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
projmod 파일 – 작성 예시
광고 SDK와 같은 framework 추가
{
"files": ["/Users/giseok/framework/Partytrack.framework“,
"/Users/giseok/framework/Adbrix.framework"]
}
=> iOS의 framework와는 다르게 files 키워드로 추가한다.
25. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
projmod 파일 – 작성 예시
Libraries 폴더에 필요 앱 아이콘, .a 등 각종 필요 파일 추가 (해당 폴더가 없다면 만듬)
{
"group": "Libraries",
"files": ["/Users/giseok/resources/Icon-60.png“,
"/Users/giseok/resources/Icon-72.png“
"/Users/giseok/resources/libOMGGameBar.a"],
}
26. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
projmod 파일 – 작성 예시
리소스 폴더를 통째로 Xcode 프로젝트에 추가
{
"folders": ["/Users/giseok/resources/API/“,
"/Users/giseok/resources/Function/“
"/Users/giseok/resources/UI/"],
“excludes“: ["^.*.meta$","^.*.mdown",“^.*.pdf$"]
}
- group 키워드를 사용하면 지정한 폴더 내부에 폴더를 추가한다.
- excludes는 폴더를 추가할 때 필요 없는 파일을 제외시킨다.
27. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
projmod 파일 – 작성 예시
라이브러리 파일 추가
{
"libs": ["libsqlite3.dylib"]
}
28. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
projmod 파일 – 작성 예시
{
"group": "Services",
"libs": ["libsqlite3.dylib"],
"frameworks": ["MessageUI.framework","StoreKit.framework"],
"headerpaths": ["Editor/iOS/GameCenter/**"],
"files": ["/Users/giseok/Documents/Partytrack/Partytrack.framework",
“/Users/giseok/Documents/libOMGGameBar.a",
"Editor/iOS/GameCenter/GameCenterController.h",
"Editor/iOS/GameCenter/GameCenterController.mm"],
"folders": ["iOS/Store/","iOS/GoogleAnalytics/"],
"excludes": ["^.*.DS_Store$","^.*.meta$", "^.*.mdown^", "^.*.pdf$", "^.*.svn$"]
}
- 이렇게 한 파일에 모아도 되고 이전 예시처럼 기능별 관리를 해도 상관 없다.
29. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
Code Signing
iOS 심사용 인증서와 개발 테스트용 인증서는 별개로 존재한다.
심사용 빌드는 ipa를 설치하여 실행해 볼 수가 없기에 빌드 자동화 시
개발용 빌드도 함께 빌드 해야한다.
overwriteBuildSetting 함수를 사용하여 빌드 타입에 맞는 프로비저닝
을 설정해 줄 수 있다.
30. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
Code Signing – overwriteBuildSetting 함수
overwriteBuildSetting( // 함수 형태
string settingName,
string newValue,
string buildConfigName = “all”
)
- settingName에 해당하는 설정을 newValue 값으로 변경
- buildConfigName으로 Release, Debug 개별 설정
33. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
Code Signing – overwriteBuildSetting 함수
overwriteBuildSetting( // 함수 형태
string settingName,
string newValue,
string buildConfigName = “all”
)
newValue
=> 프로비저닝의 UUID는 프로비저닝 마다 고유.
=> 프로비저닝 등록 후
~/Library/MobileDevice/Provisioning Profiles/
위 디렉토리에서 확인 가능.
34. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
Code Signing – overwriteBuildSetting 함수
overwriteBuildSetting( // 함수 형태
string settingName,
string newValue,
string buildConfigName = “all”
)
buildConfigName
=> 해당 Code Sign을 적용할 빌드 타입.
=> Release | Debug | all
35. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (pbxproj)
실제 사용 예시
36. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (Info.plist)
빌드하고자 하는 설정에 맞게 Info.plist를 수정.
App icon naming을 설정하여 projmod 파일로 추가한 앱 아이콘이 자동
으로 등록 되도록 할 수 있다.
URL Type을 설정할 수 있다.
Github의 PlistCS를 사용하여 간편하게 수정.
37. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (Info.plist)
기존 Info.plist 읽기
var plist = (Dictionary<string, object>)Plist.readPlist(plistPath);
=> Unity 빌드로 생성된 Info.plist의 경로를 통해 내용을 읽어온다.
38. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (Info.plist)
Info.plist 변경 (데이터 추가)
plist[“keyValue"] = new List<object>{
new Dictionary<string, object> {
……
}
};
=> 추가하고 싶은 KeyValue를 이용하여 값을 새로 추가한다.
=> plist 의 <dic>은 Dictionary 타입<array>는 List 타입으로 관리.
39. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (Info.plist)
Info.plist 변경 (데이터 수정)
var CFBundleIconFiles = (List<object>)plist["CFBundleIconFiles"];
CFBundleIconFiles.Add(PlistValue.APP_ICON_76);
CFBundleIconFiles.Add(PlistValue.APP_ICON_120);
CFBundleIconFiles.Add(PlistValue.APP_ICON_152);
=> 기존 속성을 변경할 때는 먼저 해당 데이터를 받아온 후 변경한다.
40. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (Info.plist)
Info.plist 변경 사항 저장
Plist.writeXml(plist, plistPath);
=> writeXml 함수를 이용하여 변경된 내용(plist)을 기존 경로(plistPath)
에 저장한다.
41. Chapter 2
빌드 자동화 구현 – 2. Xcode Setting
2. Xcode Setting (Info.plist)
실제 사용 예시
42. Chapter 2
빌드 자동화 구현 – 3. Xcode build
3. Xcode build
Command line을 이용하여 빌드
빌드의 2 Step
- Xcode archive 생성
- ipa 실행 파일 추출
=> 둘다 xcodebuild 명령어를 사용하여 수행.
43. Chapter 2
빌드 자동화 구현 – 3. Xcode build
3. Xcode build (xcarchive)
Command line
xcodebuild -project #{XCODEPRJ_FPATH} -scheme Unity-iPhone archive -archivePath #{ARCHIVE_FPATH}
Apple Submit / ipa 파일 추출을 위해 Xcode를 빌드하여 xcarchive를 생성
55. Chapter 3
빌드 자동화를 공유 하며
인턴 기간 동안 약 4개월에 걸쳐 수동으로 빌드 했습니다. 서브미션 용과 테스트
용 빌드 등 3번의 빌드를 해야 했습니다. 기본 1시간 30분의 시간이 걸렸고, 어쩌다
빌드가 잘못되면 처음부터 다시 해야 하여 어떤 날은 하루 종일 빌드하거나, 야근
까지 해가며 빌드를 하는 경우도 있었습니다.
그러던 중 선임 개발자 분이 빌드 자동화를 하는 것이 어떻겠냐는 제안을 하셨고,
더 이상 이 상황을 지속시키는 것은 아니다 싶어 직접 해보겠다고 지원했습니다.
인터넷 검색도 해보고, 혼자 머리를 쥐어짜 보기도 하며, 힘들 때는 선임 개발자께
물어 빌드 자동화를 완성할 수 있었습니다. 이 과정에서 가장 힘들었던 것이 매뉴
얼의 부재였습니다. 여기저기 단편화된 정보는 많은데, 일련의 과정으로 명확하게
정리된 자료는 부족했기 때문입니다.
빌드 자동화를 완성하고 저처럼 수동 빌드로 고생한 분이나, 빌드 자동화 자료 조
사로 고생하고 계신 분들의 부담들 조금이나마 덜어드리고자, 이렇게 ppt로 매뉴얼
을 만들었습니다. 부족한 점이 많지만, 조금이나마 도움이 되길 바랍니다.
참고 Github) https://github.com/gsk120/UnityAutoBuild_iOS