테스트는 프로젝트에서 빠질수 없는 부분입니다. 테스트를 위해 변경된 앱을 설치해야 합니다. 설치 방법에는 여러가지가 있습니다. 여러가지 방법 중 Hey 프로젝트에서 적용한 방법을 공유하려고 합니다.
Hey?
Hey는 글로벌 버전 소셜데이팅 서비스입니다. 매일 오전 10시 3명의 이성의 프로필을 확인하고 서로 호감이 있으면 채팅을 할 수 있습니다.
테스트 버전 배포
앱스토어에 업로드가 아니라 테스트를 위해 사내에 배포할때 어떤 방법을 사용하시나요?
이음에서는 두가지 방법을 이용했습니다.
- 디바이스를 연결하고 Xcode에서 직접 실행해서 앱를 설치해준다.
- Adhoc을 이용하여 사내 메일로 공유한다.
1번 방법은 작업중에 설치해줘야 할 경우 방해를 받게 됩니다. 그리고 테스트 디바이스로 등록되지 않은 디바이스때문에 Provisioning을 새로 생성해야 하는 문제가 발생합니다. Debug/Release로 빌드했는지 확인해야 합니다.
2번 방법은 1번 보다 더 효과적입니다. 한번 메일을 공유하면 앱을 설치해주느라 방해받지 않아도 됩니다. 하지만 불편한 배포과정이 남아 있습니다. Archive -> Distribute -> Adhoc 이런 방법으로 Adhoc버전으로 바이너리를 만듭니다. 그리고 생성된 ipa, plist 파일을 미리 입력한 url에 맞게 서버에 업로드합니다. 여기까지가 끝이지만…. 제대로 올렸는지 확인하기 위해 직접 다운로드해봐야 합니다.
두가지 방법 다 만족스럽지 못합니다.
그래서 새로운 기능인 Bots에 관심이 생겨서 직접 적용해 보았습니다.
Bots ?
Xcode Bots 은 Xcode5에 새로 추가된 기능입니다. Bots은 Xcode만을 위한 CI입니다. Bots은 간편하게 설정할 수 있습니다. XCTest를 사용할 경우 실제 등록된 디바이스에서 테스트를 실행하고 결과를 리포트해주는 기능도 있습니다.
Bots 설치방법
http://meetkei.com/?p=3196
프로젝트 적용
HeyRelease Bot 생성
Hey Scheme 의 Bot을 생성합니다.
일일 빌드를 위해 매일 오후 5시에 빌드되도록 일정을 설정합니다.
빌드 성공시 프로젝트원 모두 메일을 받을 수 있도록 설정합니다.
실패시 개발자들만 메일을 받도록 설정합니다.
Create Bot 클릭하면 바로 통합이 진행됩니다.
통합 결과에 맞게 실패, 성공 메일을 받습니다.
디바이스에서 성공 메일을 확인한 후 제품 다운로드를 클릭하면 설치가 진행됩니다.
이제 통합을 매일 하는 일만 남았습니다!
문제 발생
통합메일에서 다운로드받은 앱을 실행해보니 서비스중인 서버(RealServer)로 접속하고 있었습니다. 테스트를 위해서 RealServer와 테스트 서버(TestServer) 모두 테스트가 가능해야 합니다. 이대로면 TestServer에서 테스트하기 위해서는 기존 방법을 이용해야 합니다.
RealServer로 접속하는 이유
Bot은 통합과정에서 Release build를 하게 됩니다. Build Settings 와 Server Host를 결정하는 Macro때문에 HeyRelease는 RealServer로만 접속됩니다.
Build Settings > Preprocessor Macros 의 설정을 보면 Debug 에서 DEBUG=1 이 존재합니다. Release 에는 DEBUG가 존재하지 않습니다.
1 2 3 4 5 |
#ifdef DEBUG # define API_HOST @"http://192.168.0.10" #else # define API_HOST @"http://api.server.com" #endif |
Header 에 적용한 Macro입니다. DEBUG가 존재하면 TestServer로 아니면 RealServer로 API_HOST가 정해집니다. 통합 중에는 Release 로 빌드가 되므로 API_HOST는 TestServer가 됩니다.
그럼 테스트 서버로 연결하려면?
Release에서도 DEBUG를 설정하면 됩니다.
그럼 RealServer, TestServer 를 모두 테스트하고 싶으면?
음…..
Hey에 적용한 방법
여러가지 방법을 생각해본 결과 제가 선택한 방법은 Target을 하나 더 생성하는 것입니다. HeyRelease는 RealServer로 HeyDebug는 TestServer로 접속하도록 하였습니다. Bot을 2개 생성해서 필요할때 둘중 하나를 배포합니다.
- 현재 Target을 복사해여 새로운 Target을 만듭니다.
- Preprocessor Macros 를 설정합니다.
- HeyDebug 이름으로 Bot을 생성합니다.
단점
- build settings이 변경되면 두개의 Target 에 적용해야 함
- 파일 생성 및 추가시 두개의 Target 을 지정해야 함
언급한 단점이 있지만 Bots을 빠르게 적용할 수 있는 방법입니다. 개선된 방법은 조금 더 고려해 볼 예정입니다.
Bots Error
처음 Bots을 사용하면 많은 오류들과 만나게 됩니다. 몇가지 오류 해결 방법을 정리하였습니다.
Provisioning Profile 관련 오류
iOS Team Provisioning Profile 을 사용하면 문제가 해결됩니다.
그래도 해결되지 않는 경우 Target > General > Identity 에 위와 같이 Provisioning Profile 오류로 인한 Fix Issue버튼이 표시되는 경우가 있습니다. 이 버튼을 클릭하고 수정된 상태에서 통합을 진행해 보세요.
Reason: XCSCredentialSSHKey: private key is missing from the credential
xcode bots User interaction is not allowed.
- Open the Keychain Access
- Right click on the private key
- Select “Get Info”
- Select “Access Control” tab
- Click “Allow all applications to access this item”
- Click “Save Changes”
- Enter your password
http://stackoverflow.com/questions/577750/running-xcodebuild-from-a-forked-terminal
Bots 오류 모음
- Repositories that require an SSH key to access
- Code Signing and Provisioning Profiles
- Submodules
- I made a mistake and now I can’t fix the repository from Xcode!
http://ikennd.ac/blog/2013/10/xcode-bots-common-problems-and-workarounds/