React Native CICD using Bitrise (1) / Bitrise!

Published on

이 글은 Bitrise를 통한 모바일 환경에서의 CICD 구축 가이드입니다. 총 3편으로 구성되어 있으며, 어떤 편부터 읽더라도 괜찮습니다. 저의 삽질이 도움이 되시길 바랍니다.

  1. Bitrise!
  2. 청사진 그리기
  3. 실제 구현

Before get started

본격적으로 글을 시작하기 전에 으레 늘 그렇듯, CICD의 개념에 대해 간단하게 짚고 넘어가도록 하겠습니다. 이 글은 웹이 아니라 React Native를 사용한 모바일 환경에서의 CICD를 다룹니다. 참고해 주세요.


default

지속적인 통합(Continuous Integration)과 지속적인 제공(Continuous Delivery)은 코드, 빌드, 개발, 배포의 과정들을 자동화해서 어플리케이션을 빠른 주기로 제공하는 것을 뜻합니다.

지속적 통합은 많은 개발자가 같이 개발하는 환경에서 소스 코드의 변경으로 인해 일어날 수 있는 충돌 문제를 해결함으로써 개발과 빌드 과정을 빠르게 해 줍니다. 지속적 제공의 경우 배포와 출시의 과정을 자동화함으로써 소비자에게 더 빠른 제품 인도를 가능하게 합니다.

즉, CICD란 개발부터 출시까지의 일련의 과정들을 자동화 함으로써 개발자에게는 업무에 있어서 편리함을 가져다 주고 회사에게는 빠른 제품 출시를 가능케 해 주는 프로세스라고 할 수 있습니다.

그리고 모바일 환경에서는 이러한 CICD의 필요성이 더욱 부각됩니다. 웹에 비해 코드 사이닝과 같은 귀찮은 일들이 더 많고, 고객에게 빠르게 새로운 버전을 딜리버리 하는 것이 중요하기 때문입니다. 앱 스토어의 별점은 실시간으로 바뀌니까 말이죠.

예시를 하나 봅시다. 당신은 React Native 개발자로 크로스 플랫폼 어플리케이션을 만들고 있습니다. 열심히 어플리케이션을 만들었고 이제 세상에 공개할 시간입니다. 빌드를 하고, 각 플랫폼에 배포를 할 차례입니다.


Android

  • 키스토어를 만들고 앱을 사인한 후 빌드합니다.
  • 8분 정도 기다립니다.
  • 빌드된 apk 파일을 구글 플레이 콘솔에 업로드 합니다.
  • 용도에 따라 버전도 바꿔주고, 필요하다면 설명을 넣습니다.

iOS

  • 인증서를 만들고, 프로비저닝 프로파일도 만들고 코드 사이닝을 합니다.
  • 15분 정도 기다립니다.
  • 빌드된 ipa 파일을 앱 스토어 커넥트에 업로드 합니다.
  • 용도에 따라서 설명을 넣거나, 버전을 바꿉니다.

막상 쓰고 보니 별거 없는 것 같습니다. 그러나 그런 생각이 든다면, 우리가 다루고 있는 것이 지속적 통합 / 지속적 제공 이라는 것을 생각해 보세요! 이 귀찮은 일을 지속적으로 해야 합니다. 새로운 버전이 나올 때마다 각 플랫폼을 빌드 하고 배포하고 테스트하는 시간을 합치면 족히 1시간은 걸릴 겁니다.

하지만 당신은 열정과 인내심을 가진 개발자입니다. 혼자서 개발 중이라면이 정도는 excuse 하고 넘어갈 수 있습니다. 새 버전이 맨날 나오는 것도 아니고, 배포한 다음 테스트를 해도 됩니다.

그런데, 팀원이 있다면 어떨까요? 그리고 그 팀원이 100명이라면요? 누가 어떤 버전을 테스트 하는지, 팀원 한 명의 인증서가 맞지 않는다든지, 내 코드를저장소에 올렸더니 앱이 박살이 났다던지 지옥도가 눈에 선합니다.


default

A World with CI/CD

CICD를 도입하면 이 귀찮은 일들이 어떻게 바뀌게 될까요?

  • 원격 저장소에 코드를 푸쉬 합니다.
  • 끝!

조금 오버하긴 했지만 정말입니다. 원격 저장소의 푸쉬된 코드들을 자동으로 CICD 툴이 감지해서 테스트가 있다면 테스트를 하고, 클라우드 서버에서 빌드를 한 뒤 각 플랫폼에 알아서 넣어줍니다. 마지막으로 슬랙과 같은 곳에 결과 메세지를 날려주죠. 자세히 알아보면 다음과 같습니다.

  • 소스코드를 깃헙이나 빗버킷과 같은 원격 저장소에 저장합니다.
  • PR이나 코드 푸쉬와 같이 소스 코드 상에 변동이 생기면 CI 툴이 이 변동을 감지합니다.
  • 설정에 따라 변경된 소스 코드(브랜치)를 대상으로 빌드와 테스트, 배포 등을 실행합니다.
  • 위 과정이 완료되면 그 결과를 슬랙이나 메일 등으로 알려줍니다.

모든 귀찮음은 사라졌습니다. 개발자는 코드 충돌이나 빌드 실패를 걱정할 필요 없이 자신의 일에만 집중하면 됩니다. 나머지 상황은 CICD에서 모두 처리하고 알려줄 테니까요. 와우. 참 좋죠?

CICD는 개발자로 하여금 개발이라는 분야에 집중할 수 있게 해주는, 다시 말해서 관심사의 분리를 실현시켜주는 도구입니다. 저장소에서의 충돌, 빌드의 실패와 같은 요소들에서 해방시켜주는 무척이나 유용한 도구인 셈이죠.

구축에 있어서 시간이 들고 돈을 지불해야 할 수 있다는 단점이 있지만 이 편리함에 비할 바는 아닙니다. 자 그렇다면, 이렇게 좋은 CICD는 어떻게 구현할 수 있을까요?

어떤 툴을 골라야 할까요?

굉장히 복잡하고 어려워 보이지만 이미 시중에는 프로세스 구축을 도와주는 많은 툴들이 나와 있습니다. 정말 복잡한 자동화 프로세스가 요구되지 않는다면 툴의 선택은 꽤 자유롭습니다. 어느 툴이든 일정 수준의 기능을 제공하고 요금 정책도 많이 차이가 나지 않으니까요.

그러나 가장 좋은 선택은 GitHub Actions이나 Bitbucket Pipelines 을 사용하는 것입니다. 코드 베이스의 저장소부터 시작되는 CICD의 과정을 한가지 플랫폼에서 시작하고 끝낼 수 있다는 것은 굉장한 장점입니다. 관련 레퍼런스도 많구요.

다만 깃허브 액션의 경우 공개 저장소가 아니라면 한달 단위로 2000분까지 빌드 시간이 제한되며 빗버킷 파이프라인은 1달에 50분까지 제한이 걸립니다. 즉 동시 빌드가 필요하다던가, 팀의 규모가 크다면 유료 티어를 고려해야 합니다.

이 둘을 사용하지 않을 거라면 Circle CI 나 Travis, App center를 선택할 수 있습니다. Travis는 더 많은 환경에서 테스트를 해볼 수 있다는 것이 장점입니다. Circle CI는 다른 툴보다 더 빠른 실행 속도를, App center의 경우 모바일 친화적임과 동시에 사용하기 편한 GUI를 가지고 있습니다.

무료 툴을 찾고 있다면 오픈 소스 CICD 툴인 Jenkins가 있습니다. 역사가 오래 된 소스인 만큼 레퍼런스가 많고 프로세스를 설정하는데 있어서 자유도가 높습니다만, 러닝 커브가 높다는 것이 단점입니다. 또한 컴퓨터의 리소스를 많이 잡아먹어서 Jenkins 가 굴러갈 서버를 로컬이나 aws에 만들어 주어야 합니다.


default

Bitrise

..그러나 저는 상기한 툴들이 아닌 Bitrise를 선택했습니다. 오잉? 분명 위에서 GitHub Actions이나 Bitbucket Pipelines을 사용하라고 추천하지 않았나요? 맞습니다. 회사에서 이미 Bitbucket을 사용하고 있었으므로 자연스럽게 Bitbucket Pipelines을 선택하려고 했으나, 치명적인 문제가 있었습니다.

바로 Bitbucket Pipelines은 맥 os를 지원하지 않는다는 것입니다. 애플은 맥 os가 맥 이외의 단말에서 돌아가는 것을 허용하지 않는데, Bitbucket의 경우 이해가 되지 않지만 데이터 센터에 맥이 없었나 봅니다. 결국 xcode를 통한 iOS빌드가 되지 않으므로 다른 대안들을 고려해야 했습니다.

그렇게 다른 옵션들을 고민하다가 찾은 것이 바로 Bitrise 입니다. 다른 툴들과 비교하였을 때 Bitrise의 강점은 단순합니다.

  • 모바일의, 모바일을 의한, 모바일을 위한
  • 직관성
  • 커뮤니티

Bitrise의 슬로건은 다음과 같습니다. Build better mobile applications, faster. 모바일 어플리케이션 개발자라면 선택하지 않을 수 없는 문구죠. 말마따나 비트라이즈는 코틀린, 스위프트, 자바, 오브젝트-C, 리액트 네이티브, 플러터, 자마린 등 모바일 앱의 언어들을 모두 완벽 지원합니다. 처음에 어떤 언어를 사용할지 선택만 해주면 초기 세팅에 관한 것도 모두 자동으로 된다는 점도 엄청나죠.

Bitrise의 장점은 이것뿐만이 아닙니다. 낮은 러닝커브와 훌륭한 GUI를 통해 프로세스를 구성하는 데 있어 매우 높은 수준의 직관성을 보장합니다.


default

단순히 주어져 있는 step들을 순서에 따라 옮기는 것 만으로 하나의 워크 플로우를 구성할 수 있습니다. 즉 원격 저장소에서 코드를 가져오고, npm 패키지를 설치하고, 코드 사이닝을 하는 등의 모든 프로세스를 YAML을 건들지 않고도 구현할 수 있습니다.

또한 가이드와 문서, 그리고 의외로 커뮤니티에 답변을 매우 빨리 달아줘서 빌드나 관련 설정에 어려움을 겪을 때 더 쉽게 해결할 수 있다는 것도 장점입니다.


저의 경우는 CICD 파이프라인 구축에 많은 시간을 쏟을 수 없는 상황이었으므로 이러한 장점이 무척이나 매력적이라고 느꼈습니다. React Native를 완전하게 지원한다는 것도 좋았구요.

결국 Bitrise를 선택하게 되었고, 짧지 않은 시간동안 써온 바로는 굉장히 만족스럽습니다. 웹이 아닌 모바일 환경이라면 CICD 툴로써 고려해볼 가치가 충분하다고 생각됩니다. Bitrise의 무료 플랜은 빌드 시간을 90분까지 지원하므로 크로스 플랫폼의 경우도 작은 규모의 팀이라면 여유롭게 사용할 수 있을 것입니다.

그러면 다음 글에서는 구축한 CICD의 전체 플로우를 알아보고, CD에서 중요한 역할을 차지하는 Fastlane에 대해서 알아보도록 하겠습니다.