Skip to content

[기술 공유] Android Project CD 적용

주재현 edited this page Dec 14, 2023 · 1 revision

Android Project CD 적용

Firebase로 테스트 앱 배포 및 CD 적용

적용 배경

  • 주차별로 release 될 때 마다 test app을 빌드하고, release 파일을 업로드 해야하는 번거로움이 발생했습니다 !
  • 빌드에 꼭 필요하지만, 원격 환경에 업로드되면 안되는 민감한 파일(google-services.json, mapApi key, local 변수 등)을 어떻게 보관할 지에 대한 문제가 발생했습니다.

image

  • 구현 방법

    • github actions를 통해 workflow를 설정했습니다.
    • 현재는 main 브랜치에 머지가 되었을 때 firebase distribution을 통해 테스트 앱을 배포할 수 있도록 구현했습니다.
    • secret 변수를 통해 job이 실행될 때 보안이 중요한 파일을 생성하거나, 환경 변수로 등록해 빌드가 될 수 있도록 구현했습니다.
  • 구현 코드

  • 이후 개발

    • Develop 브랜치에 PR이 들어왔을 때 CI를 적용해 단위 테스트 및 lint 적용을 하려고 합니다.

CD 적용기

참고

https://www.redhat.com/ko/topics/devops/what-is-ci-cd

애플리케이션 개발 단계를 자동화해 애플리케이션을 더욱 짧은 주기로 제공하는 방법.

CI/CD의 기본 개념은 지속적인 통합, 지속적인 서비스 제공, 지속적인 배포.

CI ( Continuous Intergration) - 지속적 통합

애플리케이션에 적용한 변경 사항이 병합되면, 변경이 애플리케이션을 손상시키지 않도록 자동으로 애플리케이션을 구축하고 각기 다른 레벨의 자동화된 테스트(일반적으로 단위 테스트 및 통합 테스트) 실행을 통해 변경 사항이 애플리케이션에 제대로 적용되었는지를 확인함.

자동화된 테스트에서 기존 코드와 신규 코드 간의 충돌이 발견되면 CI를 통해 이러한 버그를 더욱 빠르게 자주 수정할 수 있다.

장점

  • 코드 검증에 들어가는 시간이 줄어든다
  • 개발의 편의성이 증가한다
  • 항상 테스트 코드를 통과한 코드만이 레포지토리에 올라가기 때문에, 좋은 코드 퀄리티를 유지할 수 있다.

CD (Continuous Delivery) - 지속적 제공

CI의 빌드 자동화, 유닛 및 통합 테스트 수행 후, 이어지는 CD 프로세스에서는 유효한 코드를 리포지토리에 자동으로 릴리스한다.

그러므로 효과적인 지속적 제공 프로세스를 실현하기 위해서는 개발 파이프라인에 CI가 먼저 구축되어 있어야 한다.

CD의 목표는 프로덕션 환경으로 배포할 준비가 되어 있는 코드베이스를 확보하는 것

코드 변경 사항 병합부터 프로덕션에 적합한 빌드 제공에 이르는 모든 단계에는 테스트 자동화와 코드 릴리스 자동화가 포함됨.

CD (Continuous Deployment) - 지속적 배포

CI/CD 파이프라인의 마지막 단계.

프로덕션 준비가 완료된 빌드를 코드 리포지토리에 자동으로 릴리스하는 지속적 제공의 확장된 형태.

애플리케이션을 프로덕션으로 릴리스하는 작업을 자동화한다.

프로덕션 이전의 파이프라인 단계에는 수동 작업 과정이 없으므로, 지속적 배포가 제대로 이루어지려면 테스트 자동화가 제대로 설계되어 있어야 함.

firebase를 통한 지속적 배포를 위해서는,

  1. AAB - firebase를 프로젝트와 연결하고, 같은 패키지 이름의 앱을 google play에 등록해야 함.
  2. APK - google play에 등록하지 않아도 됨.

feature branch 의 작업을 develop branch에 머지할 때, CI 적용.

PR을 통해서만 머지를 하고, 머지를 할 때 github action을 만들어 테스트가 모두 통과되었을 때 머지가 수행될 수 있도록 설정

google-services.json 파일은 보안이 필요하기 때문에 github secrets로 저장하고, action이 실행될 때마다 ./app/ 아래에 google-services.json 파일을 만드는 형식으로 만들자.

적용 중 에러

Input required and not supplied: distribution

setup-java의 action을 실행 중 발생.

자바 버전을 지원하는 open JDK를 설정하는 부분이었는데,

distribution 속성에 temurin이라는 값이 있어서 임의로 지웠다가 발생했다.

다시 집어넣으니 동작함.

Process completed with exit code 1.

> The file '/home/runner/work/and01-SnapPoint/and01-SnapPoint/android/local.properties' could not be found

[local.properties](http://local.properties) 안에 googlemap sdk의 key 값이 저장되어 있다.

그래서 .gitIgnore에 추가해 github에 업로드되지 않게 설정을 했었다.

원격 환경에서는 해당 파일을 확인할 수 없기 때문에 생기는 오류

그래서, local.properties와 google-services.json 파일을 secrets에 저장한 뒤, actions가 실행이 될 때 해당 파일들을 생성해 빌드 할 수 있도록 수정했다.

Failed to authenticate, have you run firebase login?

firebase 프로젝트에 연결되어 있는 프로젝트의 서비스 계정의 key 값이 아니라, json 값을 모두 github의 secrets에 저장해서 serviceCredentialsFileContent 값에 넣어줘야 한다.

  1. file 이름이 달라 파일을 파일을 찾지 못하는 상태

build.gradle에 sign에 관한 정보가 없기 때문에 cli에서 build를 하면, 파일의 이름이 app-release-unsigned.apk가 된다. 그래서 찾지 못했던 것.

gradle에 sign에 관한 정보를 넣고, github secrets에 keystore 을 base 64로 인코딩한 한 값을 저장, actions에서 디코딩해 똑같이 파일을 생성해 연결한다.

key alias, password또한 저장하고, ./gradlew assembleRelease를 실행하기 전 env로 환경변수 값으로 전달해준다.

image

🚩SnapPoint🚩

Android 기술적 도전

Backend 기술적 도전

🤖기술 공유🤖

Android

Backend

📖회의록📖

스크럼
팀회고, 개인회고
Clone this wiki locally