TeamCity에서 안드로이드앱 배포하기

TeamCity는 제가 좋아하는 CI(Continuous Integration)툴, 다시 말해 소프트웨어 빌드 자동화 프로그램입니다. 몇 일 전에 버전 9이 나왔습니다. 무료로는 빌드설정 20개, 에이전트 3개의 제한된 수준으로 사용할 수 있으니 상당히 많은 혜택을 주는 셈입니다. 스타트업들에게는 뒤집어쓸만큼인거죠.

본론으로 들어가서, TeamCity에서 안드로이드 앱을 배포하는 방법을 알아봅시다. 다음의 상황을 가정합니다. 팀 내에서 알파버전 테스트, 즉 개밥주기(Dogfooding)를 할 때 두가지 방법을 사용할 수 있습니다.

  1. 구글 Play스토어가 제공하는 알파버전 배포방법을 이용.
  2. 빌드서버에서 직원들에게 이메일로 apk를 다운로드하도록 제공.
    • 오늘 설명할 방법.
    • 장점: 개발자가 소스코드 push만 하면 끝. 배포는 즉시.
    • 단점: 받는 사람이 매번 새로 깔아줘야 함.
  3. 매번 동료들 핸드폰 똥구멍에 선꽂고 구워주기 (이런건 이제 그만~)

즉, 빌드서버를 이용하는 방법은 양해를 구할 수 있는 팀 내에서 빠른 배포 사이클을 원할 경우 절대적인 장점을 지닙니다. Play스토어를 이용하는 방법은 외부인이 개입되는 클로즈베타에 유용합니다.

이제 다음의 과정을 거쳐서 설정할 것입니다.

  1. git에서 소스 다운로드 및 실행
  2. Build Step 작성: gradle부터 파일정리까지 (총 4단계)
  3. apk를 artifact로 인식
  4. 빌드 성공시 이메일로 알림
  5. 이메일에 원클릭 다운로드 링크 제공

참고: 제 TeamCity 및 안드로이드는 모두 윈도우 기반셋팅입니다. 윈도우에서 안드로이드 코딩하고 윈도우서버용 TeamCity를 설치했으니 다른 플랫폼은 경로나 소소한 셋팅이 다를 수 있습니다.

1. git에서 소스 다운로드 및 실행

자세한 설명은 생략합니다. Version Control Setting에서 git 주소를 연결하시면 됩니다. 또한, Triggers 메뉴에서 VCS Trigger를 만들어서 git이 갱신될 때마다 구동되도록 합니다.

저는 Trigger에 Quiet Period: 180초를 걸어서 push하고 가끔 파일 빼먹을 때가 있어서 급히 넣곤 하니까 3분 후 굽도록 했습니다.

2. Build Step 작성: gradle부터 파일정리까지

2.1 Clean

Build Step의 첫번째로, Gradle Clean을 합니다. 이전에 빌드한 데이터와 꼬일 수 있으니 비워주면 좋습니다.

  • Runner type: Gradle
  • Gradle tasks: clean
  • Additional Gradle command line parameters: --info
  • Gradle Wrapper: Use gradle wrapper to build project → 체크합니다.
  • Stacktrace: Print stacktract → 체크합니다.

설정 스크린샷은 아래와 같습니다. “어? 나보다 항목이 많은데?”라고 하시는 분은 제일 아래 노란색 “Show advanced options”를 클릭하세요. 중간에 Working directory는 git 다운로드 폴더를 임의로 지정했을 경우이며 취향일 뿐입니다.
캡처e1

2.2 gradle assembleRelease

소스를 컴파일하고 apk로 만들기 위한 assembleRelease 명령을 실행합니다. “2.1 Clean”과 거의 유사하며 다음만 다릅니다.

  • Gradle tasks: assembleRelease

센스있는 분이라면, 첫번째 스텝을 실행해보시고 성공하면 Build Steps 표에 나오는 “Copy build steps” 버튼을 이용해서 복사하시면 됩니다.

여기까지 하고 일단 한 번 Run 해서 확인합니다. 빌드 결과를 다음 스텝에서 인식하면 편하기 때문입니다.
여기까지 성공하면 80% 완료한겁니다.

2.3 unaligned 파일 삭제하기

assembleRelease를 하면 apk파일이 두 개 나옵니다- aligned, unaligned. 둘의 차이는 제가 올린 stackoverflow 질답글에서 알 수 있습니다. 결론은 unaligned는 지워도 되는 파일입니다.

  • Runner type: Command LIne
  • Working directory: apk나오는 경로 지정. Working Directory는 우측에 트리 아이콘을 눌러서 지정하세요. 제 경우 project/build/outputs/apk이지만 경우에 따라 다릅니다.
  • Run: Command Executable with parameters 선택.
  • Command executable: del
  • Command parameters: *unaligned.apk

참고: 리눅스나 맥OS용 TeamCity는 다르겠지요. 목적은 같을테니 내용을 파악하여 적용하시면 됩니다.

2.4 Rename (옵션)

다운받는 사람들에게 버전을 명확히 인식시키기 위해 빌드버전이 파일명에 나타나도록 합니다. 그래야 나중에 메신저로 “15버전 받으세요~”라는 식으로 말할 수도 있으니까요.

TeamCity는 한 번 구울 때마다 build.counter라는 값이 1씩 올라가니까 이걸 이용합니다. 위에 2.3과 거의 동일하니 역시 Copy Build Step을 이용해서 복사합니다.

  • Runner type: Command Line
  • Working directory: 2.3과 동일
  • Command executable: rename
  • Command parameters: bapul-release.apk bapul-release-%build.counter%.apk

물론 Command parameter는 맘에 드는 이름으로 지으세요. 저희 회사 이름 그대로 넣지 마시고요.

최종적으로, 빌드스텝 4개는 아래와 같아집니다.
캡처

3. apk를 artifact로 인식

Artifact가 사전에서는 말이 어려운데, 흔히 말하는 “산출물”입니다.
캡처

간단히 한 줄 설정이며, General Settings 메뉴에 들어가서 다음을 설정합니다.

  • Artifact paths: project\build\outputs\apk\bapul-release-%build.counter%.apk

역시 마찬가지로 우측 폴더트리 아이콘을 클릭하여 Step 2.4에 있던 경로를 참고하여 적어줍니다. 이러면 해당 apk 파일이 최종 산출물로 인식되어 원클릭 다운로드가 되도록 할 수 있습니다.

4. 빌드 성공시 이메일로 다운로드 링크 전송

빌드 성공시 서버가 Email을 보내려면 SMTP 설정이 되어있어야 겠지요. SMTP 설정은 사용하시는 메일서비스마다 다르겠고요. 저희는 구글앱스를 쓰는데 다음과 같습니다. 이 메뉴는 Administration > Email Notifier에 있습니다.
캡처

SMTP 설정은 했다치고, Notification은 개인마다 또는 그룹마다로 지정할 수 있습니다. 본인에게 먼저 테스트해보려면, 우상단 자기 profile을 들어간 후, Email Notifier에 “Add New Rule” 버튼을 클릭합니다.

“Builds from the selected build configurations”를 체크한 후 트리에서 원하는 프로젝트를 선택한 후, 우측 체크박스에서는 빌드 성공했을 때만 보내야 하니까 “Build is successful”에만 체크합니다.

아마도 메일이 잘 갈텐데 메일 받는건 다음과 같이 갑니다.

2014-12-13-14-01-25

위에 #15라는 링크를 클릭하면 브라우저가 뜨고 로그인을 하면 teamcity의 프로젝트 화면으로 갑니다. 거기서 Artifacts 탭에 간 후 파일을 선택하고 다운로드를 클릭하면 받아지지요.
그룹이나 특정 사람에게 보내려면 Administration > Users > 특정 사람 또는 Groups에서 해당 소속에게 일괄전송이 가능합니다.

5. 이메일에 원클릭 다운로드 링크 제공 (옵션)

TeamCity에 로그인은 한 번만 하면 그 후엔 자동로그인이 되니까 양해를 구할 수 있지만, 뭔지 알 수도 없는 프로젝트 화면을 팀원들이 보도록 하는건 어쩐지 불친절합니다. 받은 이메일에서 원클릭으로 apk를 받을 수 있도록 해야 할겁니다.

저는 TeamCity에 대해 무한히 좋아하는 마음을 가지고 있지만, 단 하나 부족한게 이메일 템플릿이 고정적이라는겁니다. 즉, Successful 메시지는 하나의 템플릿 파일에만 의존합니다. 그러므로, 이메일 템플릿을 요리하려면, 해당 템플릿에 if문을 넣어서 특정 프로젝트 결과에 대해서만 처리를 해줘야 합니다.

해당 이메일 템플릿 파일은 TeamCity 서버에 다음의 경로에 있습니다.
ProgramData라는 폴더는 숨김폴더임을 주의하세요.
Untitled-1

스크린샷에서 보이는 build_successful.ftl 파일을 수정합니다. 이 템플릿은 “FreeMaker”라는 자바기반 템플릿 언어에 기반합니다. 전체 파일은 제가 gist(클릭:열기)에 올려놓았습니다.

보면 아래와 같은 부분이 추가되었습니다. (제 프로젝트에 맞게 if문을 수정했습니다)

<#-- MODIFICATION START -->
  <#if buildType.externalId = "Android_BapulCube">
    <br>
    <a href='http://www.your-company.net/repository/download/${buildType.externalId}/.lastSuccessful/bapul-release-${build.buildNumber}.apk'>Click here to download APK.</a>
    <br>
  </#if>
<#-- MODIFICATION END -->

참고로, buildType.externalId는 해당 Build Configuration의 ID입니다. 해당 빌드셋팅가서 볼 수도 있고, 주소창에 http://www.your-company.com/viewType.html?buildTypeId=Android_BapulCube 형태로 보이기도 합니다. 빌드셋팅의 고유ID니까 특정 빌드 결과에 대한 것만 받는 경우이며, 다른 센스를 부리자면 project.name=”Android”와 같이 할 경우 Android라고 이름지은 프로젝트의 모든 빌드 결과에 대해 받게 되겠지요.

더 멋지게 꾸밀 분은 TeamCity Notification 설명서를 참고하세요.

여하간, 이렇게 설정하면 아래와 같이 소박하게 다운로드 링크가 나옵니다. “Click here to download APK.”라는 부분 보이시죠? 이제 팀원들은 (로그인을 했다면) 원클릭으로 apk를 다운받고 앱을 테스트할 수 있겠지요.

2014-12-13-14-00-36

더 센스를 부리자면 앱에 업데이트 프로그램을 구동시켜서 할 수도 있을겁니다. 그에 대한 방법은 여기서 다루지는 않겠습니다.

휴~ 끝났습니다.

Advertisements

3 thoughts on “TeamCity에서 안드로이드앱 배포하기

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중