하나의 모바일 앱이 마켓에 출시되기까지는 수많은 빌드와 배포 과정을 거치게 됩니다. 더 자주, 더 빠르게, 더 높은 품질의 서비스를 출시하기 위해서는 효율적인 빌드와 배포는 필수적입니다. 카카오에는 모바일 앱을 지속적으로 통합(Continuous Integration)하고 지속적으로 배포(Continuous Delivery)하기 위해 자체 개발한 플랫폼 모빌(MobiL)이 있습니다.
이 글에서는 모빌이 어떻게 개발되었고, 어떻게 활용되고 있는지를 소개합니다.
모빌의 시작
모빌의 초기 버전은 2013년에 개발이 시작되었습니다. 당시 서버 애플리케이션의 빌드와 배포는 자동화가 많이 적용된 상황이었지만 모바일 앱은 그렇지 않았습니다. 일부 조직에서는 Jenkins를 이용해 CI 환경을 구축했지만, 대부분은 로컬 빌드 후 수동 배포하는 경우가 많았습니다. 사내 배포 방식 또한 메일, 메신저, JIRA, 리모트 저장소 등 다양했습니다. 이렇게 빌드부터 배포까지 전체 릴리스 과정이 통합되어 있지 않다 보니 비효율적인 부분들이 많았고, 개발자와 QA담당자 사이의 커뮤니케이션 비용이 많이 발생하고 있었습니다.
“빌드와 배포 과정에서 비효율적인 부분들을 제거하고 자동화를 통해 전체 릴리스 과정이 매끄럽게 진행될 수 있다면 높은 품질의 카카오 서비스들이 더 자주 사용자들을 만날수 있겠다.” 라는 생각이 모빌을 개발하게 된 시발점이었습니다.
살펴본 도구들
최근에는 Greenhouse CI, CircleCI 등의 모바일 앱을 위한 CI/CD 도구들이 속속 등장하고 있지만, 모빌을 개발하기 시작할 당시에는 모바일 앱에 특화된 도구는 전무했습니다. 그리고 애플에 인수된 TestFlight이나 Twitter Fabric에 통합된 Crashlytics Beta라는 도구도 있었지만, 앱 배포 과정에만 특화된 도구였습니다.
빌드부터 배포까지 전체 릴리스 단계를 모두 포함하는 입맛에 맞는 도구는 찾지 못했고, 결국 직접 개발을 하기로 결정했습니다.
목표와 원칙
> 개발자는 개발에만 집중할 수 있게 하고, QA와 테스터는 테스트에만 집중할 수 있도록 하자.
비효율적인 부분이나 투명하지 않은 프로세스는 CI/CD를 적용하면 대부분 해소가 되는 부분이었습니다. 따라서 개발자와 테스터는 본연의 업무에 충실할 수 있게 되고 생산성과 품질은 높아지게 됩니다. 개발과 사용자 테스트 외의 모든 작업들은 모빌이 대신하도록 하고, 릴리스 과정의 모든 모든 부분을 자동화하는것을 목표로 모빌 개발을 시작했습니다.
“Easy”
사용하기 쉽게 만드는 것은 모빌 개발을 시작하면서 세운 대원칙입니다.
모빌을 통해 CI, CD를 적용하려고 할 때 최대한 쉽게 적용할 수 있도록 만들자.
아무리 좋은 도구일지라도 도입하고 사용하기 위한 러닝커브가 높다면 좋은 도구가 아니라고 생각합니다. 빌드를 위한 최소한의 정보(저장소, 빌드 설정)만 입력하면 바로 모빌을 사용할 수 있게 만들었습니다.
누구나 쉽게 빌드를 실행할 수 있도록 하자.
CI에서는 모든 커밋에 대해 빌드를 하는 것이 원칙이지만, CD에서는 조금 달라집니다. 모든 커밋에 대한 빌드 산출물이 QA나 테스터에게 의미 있는 산출물은 아니기 때문입니다.
모빌은 모든 커밋에 대해 빌드를 하고 사용자가 직접 원하는 빌드를 찾아서 사용하는 방식이 아닌, 누구나 쉽게 원하는 때에 원하는 코드로 빌드를 할 수 있는 방식을 선택했습니다. CI 빌드를 기본으로 하되, 다양한 방법으로 빌드를 실행할 수 있도록 설계되었습니다.
모빌은 3가지 빌드 설정 타입과 6가지 빌드 실행 방법을 제공하고 있습니다. ###### 빌드 설정 타입 - CI : 지속적인 통합을 위한 빌드 설정 타입 - PRERELEASE : 사내 배포를 위한 빌드 설정 타입 - RELEASE : 마켓 배포를 위한 빌드 설정 타입
빌드 실행 방법
- CI Build : 지정된 Branch에 대해 Push 발생 시, Push의 head Commit을 빌드.
- Smart Commit : 모든 Branch, Tag Push 발생 시 Commit Message에 특정 문구가 포함된 경우 빌드. 예) “모빌 빌드해!”
- Smart Tag : 지정된 정규표현식에 매칭되는 Tag가 Push될 경우 빌드.
- Manual Build : Commit History에서 특정 Commit을 빌드.
- Scheduled Build : 예약된 시간에 지정된 Branch의 Head Commit을 빌드.
- Release Build : 마켓에 배포될 Release Build를 만들어내는 기능입니다. Release Build는 QA가 완료된 최종 QA빌드로부터 만들어집니다. 이는 실수로 잘못된 Commit에서 빌드가 만들어지는 것을 미연에 방지하기 위해서 입니다.
“Agile Testing”
Manual Build는 담당 개발자가 아니더라도 코드의 변경사항을 확인하고 빌드 실행이 가능한 방법입니다. 이 빌드 방법은 Agile Testing을 가능하게 합니다.
차기 릴리스를 위한 개발이 모두 완료되었을 때 QA가 진행되는 것이 아니라, 개발 진행 중에 담당 QA가 함께 참여해서 Feature 단위로 개발이 완료될 때마다 즉시 빌드를 하고, 테스트를 할 수 있는 환경을 제공합니다.
빌드 산출물을 쉽게 배포하고 설치할 수 있도록 하자.
모빌은 빌드가 완료되면 빌드 정보를 쉽게 확인하고 배포할 수 있도록 설계되었습니다. 몇 번의 클릭만으로 사내 사용자에게 배포할 수 있는데요. 다양한 배포 유형을 제공함으로써 앱이 노출되는 방식이나 설치할 수 있는 대상 사용자가 달라지게 됩니다. 몇 번의 클릭이 귀찮을 경우에는 빌드 설정에서 자동 배포 설정을 활성화하기만 하면 빌드 완료와 동시에 자동으로 배포가 이루어집니다.
“카카오앱센터”
모빌에서의 앱 배포는 OTA(Over The Air)방식으로 진행됩니다.
애플 앱스토어나 구글 플레이스토어처럼 카카오앱센터(모빌 iOS/Android 클라이언트)라는 사내 전용 앱으로 배포가 이루어집니다. 카카오앱센터에서는 앱의 최신 배포 버전뿐만 아니라 지난 배포 이력을 확인할 수 있으며 특정 버전의 앱을 쉽게 설치할 수 있습니다. 또한 카카오톡을 이용하여 사내 사용자들끼리 쉽게 앱을 공유할 수 있는 기능도 제공하고 있습니다.
“모빌에서 받으시지 말입니다.”
이제 카카오에서는 아래와 같은 대화는 더 이상 없습니다.
“모빌에서 받으세요” 한마디면 끝!
사실 이것도 필요 없긴 합니다. 모빌의 여러 이벤트(빌드 완료, 배포 등)발생 시 알림을 발송할 수 있고, 카카오앱센터의 앱 푸시 알람을 통해서도 사용자에게 알림이 전송되기 때문에 굳이 직접 커뮤니케이션을 하지 않아도 되지 말입니다.
모빌의 아키텍처
모빌은 크게 앱을 등록하고 빌드하고 배포하는 과정을 관리하는 웹 서비스와, 안드로이드&iOS용 클라이언트인 카카오앱센터로 구성되어 있습니다. 그리고 빌드 관리를 위한 Jenkins 서버와 실제 빌드가 실행되는 MacPro로 구성되어 있습니다.
빌드 실행 이벤트 발생시 모빌에 등록된 빌드 설정으로 Jenkins에 BuildJob이 생성되고 빌드가 실행됩니다. 빌드 실행 과정에서 Jenkins는 일종의 Stub 역할만을 하게 됩니다. 실제 빌드는 Jenkins의 Slave Machine으로 등록되어 있는 MacPro 장비에서 통합 빌드 스크립트에 의해 빌드가 실행됩니다. 빌드가 완료되면 빌드 산출물은 케이지(KAGE - 카카오가 자체 개발한 분산 스토리지 플랫폼)에 저장되며, 카카오앱센터로 자동/수동으로 배포됩니다.
그리고 모카(MOCA - 카카오가 자체 개발한 모바일앱 크래시 분석 시스템)로 빌드 산출물을 배포하게 됩니다. 모카는 Crashlytics 처럼 앱 크래시 분석을 위해 만들어진 사내 플랫폼으로 모카에서 앱 크래시 분석을 위해 필요한 빌드 산출물(iOS dSYM, android mapping.txt)을 매 빌드 시 모카로 자동으로 배포하게 됩니다.
모빌은 사내 이슈 트래킹 시스템인 JIRA와도 연결을 하고 있습니다. 대부분의 서비스는 JIRA를 통해 버그나 개발 이슈들을 관리하고 있는데요. 모빌에서 코드<->빌드<->관련된이슈 정보를 한눈에 쉽게 파악할 수 있도록 하기 위해 JIRA와의 연결도 점차 확장해 나가고 있습니다.
모빌의 미래
모빌의 다음 단계는 UI Test Automation on Real Devices 입니다. 모빌에서 빌드 후 다양한 종류와 버전의 실제 기기에서 자동화된 테스트를 수행하고 테스트 결과물을 받아볼 수 있도록 하는 것이 목표입니다만, 아직 모빌의 대원칙인 “쉬운”방법을 찾지 못해서 열심히 찾아보고 있는 중입니다.
함께 모빌의 미래를 만들어보고 싶으신 분을 모시고 있습니다. 특히 Android, iOS UI 테스트 자동화에 관심 있으신 분의 많은 지원 바랍니다. 지원하기
모빌 사용기 - Testimonials
모빌을 적용한 서비스 조직의 “훈훈한” 사용기로 마무리하겠습니다.
카카오톡
- @trudy : 모빌이 없으면 안 될 정도로 많은 부분을 제공해주었습니다. 빌드 말리는(?) 시간도 단축되었고, 빌드 공유 또한 간편해져서 일의 효율을 한층 높여주었어요.
- @yama : QA를 진행함에 있어 ‘빌드의 실시간성’과 ‘배포 원스탑’ 부분이 가장 크게 와 닿았습니다.
- @shanks : 원샷으로 빌드 및 업로드 관리가 편리해졌고, PHASE별 앱 빌드 및 관리가 편리해졌습니다.
카카오택시
- @damon : 개발 담당자가 배포를 하지 않아도 담당 QA분이 배포를 하거나, 배포 이력을 확인할 수 있어서 편합니다.
카페앱
- @young : 현재까지 작업된 버전을 tag로 만들면 자동으로 빌드를 해주고, 배포를 직접 하지 않아도 돼서 편리합니다.
- @bruno : 간단한 조작으로 빌드와 배포를 한 번에 할 수 있어 편해졌습니다.
다음앱
- @ted : 모빌 사용 후로는 Github에 직접 들어가서 브랜치를 찾아 수정내역을 파악해볼 필요 없이, 빌드된 아이템에서 바로 커밋 내역으로 찾아 들어가 수정된 부분을 체크 해볼 수 있어 좋습니다. 또한 제한된 테스터 만으로 테스트 할 수 있는 환경 조성도 쉽게 할 수 있어 테스트 환경을 구성 하는 것도 편리합니다. 그리고 QA종료 후 릴리즈 빌드 생성을 버튼 하나로 할 수 있고, Rollback 빌드도 쉽게 생성되어 배포관리도 편해졌습니다.
- @warren : github의 commit 중 하나를 선택하여 빌드할 수 있어 편리했습니다. 특히 빌드 결과물을 다른 팀에 쉽게 공유할 수 있어 좋았습니다.
카카오티비
- @libby : Github 연동으로 변경사항을 파악할 수 있고, 언제든 원하는 빌드를 설치해서 확인할 수 있어 업무의 효율성과 편리성을 높여줬습니다.
이 글은 카카오에서 모빌을 포함한 다양한 개발 플랫폼을 개발&운영하면서 틈틈히 회사 텃밭을 일구고 있는 benedict.lee를 졸라서 쓴 글입니다. 저자가 2013년 데브온에서 발표한 Code Review - What, 2 Whys & How는 몇 년이 지난 지금 봐도 - 발표를 직접 듣고 싶은 - 훌륭한 자료입니다.
기술 블로그를 통해서 카카오의 다양한 개발 플랫폼을 소개합니다. 현재로썬 카카오 내부에서만 사용할 수 있다는 점이 아쉽지만, 함께 나눌 수 있는 부분들은 지속적으로 발굴하고 공개할 계획이니, 관심을 갖고 지켜봐주세요.
물론, 카카오 크루가 되시면 지금이라도 사용하실 수 있고 또 개발에 참여하실 수 있습니다 ^^;