/ CONTINUOUS INTEGRATION, ANDROID, CIRCLECI

안드로이드 앱 품질 높이기 - (1) CircleCI를 사용한 지속적 통합

여타 소프트웨어 프로젝트와 마찬가지로, 안드로이드 앱 또한 소스 코드의 품질을 잘 관리해야 합니다.

안드로이드 앱 품질 관리에 필요한 항목과 이를 제공하는 서비스를 적용하는 방법을 몇 개의 글에 걸쳐 알아보겠습니다.

[연재 순서]

  1. 안드로이드 앱 품질 높이기 - (1) CircleCI를 사용한 지속적 통합
  2. 안드로이드 앱 품질 높이기 - (2) JaCoCo로 커버리지 측정하기
  3. 안드로이드 앱 품질 높이기 - (3) Coveralls와 CircleCI를 연동한 지속적 커버리지 측정

지속적 통합, 왜 필요한가요?

지속적 통합(Continuous Integration)은 소프트웨어 개발 과정에서 매우 중요한 역할을 담당합니다.

프로젝트를 혼자 개발하는 경우 이를 적용하는 수고 대비 효과가 크지 않아 중요성이 다소 여과될 수 있습니다. 하지만, 프로젝트의 복잡도가 높아지거나 팀원의 숫자가 많아지게 될 수록 소스 코드를 관리하는 수고는 기하급수적으로 증가하게 되고, 때문에 지속적 통합의 중요성 또한 매우 높아집니다.

지속적 통합 환경을 위한 서비스 선택

지속적 통합을 제공하는 솔루션은 꽤 여러 가지가 있습니다. 오래 전부터 많은 프로젝트에서 사용해 왔던 젠킨스(Jenkins)부터 트래비스(Travis) CI, 그리고 최근에 등장한 서비스인 버디빌드(buddybuild), 이 외에도 다양한 솔루션들이 서비스되고 있어 자신이 원하는 것을 얼마든지 선택할 수 있습니다.

젠킨스

설치형 서비스로 서버 세팅부터 젠킨스 설치, 플러그인 설치, 프로젝트 설치까지 모두 해 주어야 합니다. 서버를 구하는 것도 문제지만, 세팅 하는 데에만 상당히 오랜 시간이 걸리며 시행 착오를 많이 겪을 가능성이 높습니다.

트래비스 CI

솔루션 형태의 CI 서비스의 원조격으로, 빌드에 필요한 컨테이너를 필요할 때에만 사용합니다. 단, 안드로이드 프로젝트 빌드 시 빌드에 필요한 환경을 세팅하는 시간이 많이 소요되어 전체 빌드 속도가 매우 느려집니다.

버디빌드

트래비스 CI대비 빌드 속도가 빠릅니다. 단 저장소 단위가 아닌 애플리케이션 프로젝트를 하나의 단위로 사용하여 하나의 저장소 내 별개의 서브프로젝트로 구성되어있는 저장소에는 적합하지 않습니다.

서클 CI

서클CI는 트래비스나 버디빌드와 같이 서비스 형태로 제공되며, 트래비스와 같이 저장소 단위로 빌드를 관리할 수 있으면서도 빌드 속도는 어느 정도 만족할 수준을 보여줍니다.

또한, 빌드 결과물을 트래비스 CI 대비 쉽게 저장하고 관리할 수 있습니다. (트래비스는 아마존 S3를 연동해야 산출물을 저장할 수 있습니다)

무엇보다도, 서클 CI는 무료 계정에서도 비공개 저장소를 지원하므로 개인 프로젝트에 손쉽게 CI를 사용할 수 있습니다. 가격 정책에 대한 자세한 내용은 홈페이지를 참고하세요.

따라서 여기에서는 서클 CI(CircleCI)를 사용하여 지속적 통합 환경을 구축하는 방법에 대해 알아봅니다.

서클CI 빌드 환경 설정

서클CI를 사용하여 안드로이드 프로젝트를 빌드하려면 안드로이드 SDK 내 빌드 툴, 플랫폼 및 추가 라이브러리를 설정해야 하는데, 이는 저장소 최상위 경로에 circle.yml라는 설정 파일을 생성하여 설정할 수 있습니다.

다음은 앱 빌드에 플랫폼(안드로이드 7.0; API 24), 빌드 툴(24.0.3), 서포트 라이브러리(Appcompat, 24.2.1), 구글 플레이 서비스(9.6.1)이 필요한 경우 circle.yml에 추가해야 하는 내용을 보여줍니다.

[circle.yml]

dependencies:
  pre:
    - echo y | android update sdk --no-ui --all --filter "android-24"
    - echo y | android update sdk --no-ui --all --filter "build-tools-24.0.3"
    - echo y | android update sdk --no-ui --all --filter "extra-android-m2repository"
    - echo y | android update sdk --no-ui --all --filter "extra-google-m2repository"

위 스크립트의 각 문장 마지막에 들어가는 문자열(android-24, build-tools-24.0.3)이 안드로이드 SDK에서 설치할 구성요소인데, 이는 필요한 패키지에 따라 달라집니다.

다음은 주요 패키지를 사용하기 위한 안드로이드 SDK 구성요소를 보여줍니다.

패키지 구성요소 이름
서포트 라이브러리 (Appcompat 등) extra-android-m2repository
구글 서비스 (Play services 등) extra-google-m2repository
안드로이드 플랫폼 android-{API레벨}
안드로이드 빌드 툴 build-tools-{빌드 툴 버전}

별도로 빌드시 수행할 작업을 지정하지 않을 경우 테스트 태스크 (./gradlew test)가 수행됩니다.

테스트 대신 다른 명령을 수행하도록 하려면 override:를 사용하여 실행할 작업을 지정하면 됩니다. 다음은 테스트 대신 디버그 APK만 빌드하도록 설정한 예를 보여줍니다.

[circle.yml]

test:
  override:
    - ./gradlew assembleDebug

서클CI에 계정 연결하기

서클CI는 깃헙 혹은 Bitbucket 계정을 연동하여 사용할 수 있습니다. 여기에서는 깃헙 계정을 사용하는 방법을 알아봅니다.

서클CI 홈페이지로 접속한 후, ‘Sign up for free’ 버튼을 누릅니다. (추후 홈페이지 업데이트로 인해 화면이 변할 수 있습니다)

sign up

다음, 깃헙 계정 연동이 필요합니다. ‘Authorize with Github’ 버튼을 누르면 다음과 같이 권한 승인을 확인하는 화면이 표시됩니다.

authorize

‘Authorize application’ 버튼 눌러 권한 승인 절차를 완료하면 서클 CI에 계정을 연동하는 절차가 모두 완료됩니다.

프로젝트 추가 및 빌드하기

계정 연동을 완료한 후 서클CI에 접속하면 다음과 같이 새 프로젝트를 추가할 수 있는 화면이 표시됩니다. (만약 표시되지 않는 경우 왼쪽 메뉴에서 ‘Add projects’를 선택하세요)

Add project

서클CI에 추가할 프로젝트를 찾아 오른쪽의 ‘Build now’를 선택하면 프로젝트가 추가됨과 동시에 빌드가 시작됩니다.

왼쪽 메뉴에서 ‘Builds’ 메뉴를 누르면 프로젝트 및 빌드 현황을 다음과 같이 확인할 수 있습니다.

Builds

이제 저장소에 소스 코드를 커밋할 때 마다 서클CI에서 빌드(./gradlew test)를 수행하므로 빌드가 실패하는 경우 얼마 지나지 않아 바로 알 수 있게 됩니다.

간단한 프로젝트의 경우 한 번 빌드에 약 8분 가량 소요되며, 프로젝트 규모에 따라 빌드 시간은 차이가 날 수 있습니다.

테스트 결과 분석 추가하기

서클CI 빌드 과정에서 JUnit 테스트를 수행한 경우, 테스트 결과에 대한 간략한 분석 결과를 생성할 수 있습니다.

circle.yml에 다음 내용을 추가하면 테스트 결과를 서클CI가 분석하도록 할 수 있습니다.

[circle.yml]

test:
  post:
    - mkdir -p $CIRCLE_TEST_REPORTS/junit/
    - find . -type f -regex ".*/build/test-results/debug/.*xml" -exec cp {} $CIRCLE_TEST_REPORTS/junit/ \;

테스트 분석 결과는 빌드 결과 내 ‘Test Summary’ 탭에 표시됩니다.

Test Summary

이것으로 서클CI를 사용하여 지속적 통합 환경을 구축하는 방법을 알아보았습니다.

다음 포스트에서는 프로젝트의 품질을 측정하는 척도 중 하나인 커버리지(Coverage)를 분석하는 방법에 대해 알아보겠습니다.

기타 참고하면 좋은 자료:

kunny

커니

안드로이드와 오픈소스, 코틀린(Kotlin)에 관심이 많습니다. 한국 GDG 안드로이드 운영자 및 GDE 안드로이드로 활동했으며, 현재 구글에서 애드몹 기술 지원을 담당하고 있습니다.

Read More