일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- coroutine
- google play console
- coroutinecontext
- collectLatest
- flowon
- Next Challenge
- TOSS 과제
- app-distribution
- Advanced LCA
- 백준2309
- 릴리즈 키해시
- hotStream
- conflate
- Product Flavor
- Android
- coroutinescope
- cancellationException
- withContext
- Algorithm
- Flow
- SDUI
- KAKAO
- monotone stack
- java
- ServerDrivenUI
- 안드로이드
- ShapeableImageView
- coldStream
- Kotlin
- 백준
- Today
- Total
루피도 코딩한다
Github Action을 통해 Firebase App Distribution에 자동으로 Android 앱 배포하는 방법 (+ Slack에 노티까지!?) 본문
Github Action을 통해 Firebase App Distribution에 자동으로 Android 앱 배포하는 방법 (+ Slack에 노티까지!?)
xiaolin219 2023. 8. 6. 17:27[한 줄 요약]
이 글은
Where) Android 프레임 워크에서
When) develop과 main branch에 Pull Request에 push가 일어날 때마다, (Gitflow 사용 중)
How) Github Action을 통해
What) Firebase App Distribution에 자동으로 apk 파일을 배포하는 방법을 담았습니다!
[CD를 구현 과정과 기록으로 남기게 된 이유]
기존에 SOPT에서 협업을 하며 나름 대규모(약 15명)로 협업을 하던 시기에는 QA기간이 따로 존재했습니다. 앱 릴리즈 직전에 기획자들이 엣지케이스를 테스트했으며, 디자이너들 또한 Design QA를 진행하곤 했습니다. 그러나 현재 SW마에스트로에서는 애초에 팀이 꽤나 소수인 4명(나(안드 1), 서버 2, 디자이너 1)으로 이루어져 있습니다. 많지 않은 인력과 빠른 릴리즈를 위해 평소에 기능 개발이 될 때마다 팀원들이 함께 수시로 QA를 진행하기로 했습니다.
매번 기능 개발이 될 때마다 apk를 추출하고, 슬랙이나 이메일 등을 통해 apk 파일을 전달하고, 이미 PR을 생성할 때 작성했던 변경사항을 또 전달하는 과정을 거치기에는 너무 번거롭다고 생각했기 때문에, CD를 구현하기로 결심했습니다.
사실 CD가 어려운 과정은 아니지만, Firebase App Distribution으로 배포 대상을 특정한 자료가 많지 않았고 시행착오를 몇 번 겪었기 때문에 다른 누군가에게 도움이 되었으면 하는 마음에 이 글을 작성하게 되었습니다 :)
[배경 설명]
1. 제가 개발 중인 LGTM Service는 Gitflow를 활용하고 있습니다.
- Develop branch에 Feature브랜치를 merge 해가며 기능을 추가하고 있음
- Develop -> Release -> Main 브랜치에 순차적으로 merge 하며 앱을 Play Store에 배포할 예정임
2. 기존에 제가 만들던 서비스에서는 CD를 붙이기 전까지 CI로 Build를 하는 것에 문제가 없는지 확인하는 과정을 가지고 있었습니다.
- Github Action으로 apk 추출하는 코드 실행 -> 성공/실패 여부를 팀 슬랙으로 알려줌
3. CI 코드에서 Firebase App Distribution으로 배포하는 코드를 추가함
[이미 되어있던 작업]
1. .github > workflow > 어쩌구.yml 에 CI코드가 작성되어 있었음.
2. CI가 적용된 기존 코드는 아래 링크를 참고하시면 됩니다!
[추가한 작업]
1. yml 코드 추가
# 기존 코드
# 1. Java version 17로 설정
# 2. gradle cache 설정
# 3. github secrets 가져오기
# 4. apk build 시키기
# [전체 코드] https://github.com/hellokitty-coding-club/LGTM-Android/blob/e1c0e73311b8b47be366032a9b1275b529f8cce0/.github/workflows/prBuilder.yml
- name: Upload apk to Firebase App Distribution
uses: wzieba/Firebase-Distribution-Github-Action@v1
with:
appId: ${{ secrets.FIREBASE_APP_ID }}
token: ${{ secrets.FIREBASE_TOKEN }}
groups: hello-kitty-coding-club
file: app/build/outputs/apk/debug/app-debug.apk
releaseNotes: |
${{ github.event.pull_request.title }}
${{ github.event.pull_request.html_url }}
${{ github.event.pull_request.body }}
# 기존 코드
# slack 에 성공 실패 여부 noti 날리기~!!
2. Github Secrets - FIREBAE_APP_ID 추가하기 ⭐️
프로젝트 개요 ⚙️ > 프로젝트 설정 > 스크롤 내리기 > 앱 ID
앱 ID값을 github secrets에 FIREBAE_APP_ID라는 이름으로 추가하면 된다.혹시나 해서 말하는데, token 값은 따옴표 없이 순수 값만 입력해줘야 한다.
(처음에 Project ID 등등 이상한 값을 넣느라 삽질을 계속했었다... 여러분은 한 번에 성공하세요.. good luck!^^)
3. Github Secrets - FIREBASE_TOKEN 추가하기
잠깐 terminal을 사용하며 간지나는 개발자 코스프레를 할 수 있는 시간이다.
1) Firebase CLI 설치하기
터미널에 아래 명령어를 입력한다.
curl -sL https://firebase.tools | bash
2) firebase login
Firebase CLI 설치가 완료되면 터미널에 아래 명령어를 입력한다.
필자의 경우 Chrome으로 바로 gmail 로그인 화면이 열리긴 했는데, 창이 바로 열리지 않는다면 terminal에서 보여주는 링크를 눌러서 브라우저에서 열면 된다.
Firebase Project를 생성한 gmail 계정으로 로그인을 진행한다!
firebase login
3) 로그인 성공 겸 Project 목록 겸사겸사 확인하기
아래 명령어를 터미널에 입력하면, 내가 만들어둔 Firebase Project 목록을 보여준다.
이 화면까지 나오면 뭔가 좀 성공한 것 같아서 기분이 좋아진다.
firebase projects:list
4) 마지막으로 token 가져오기!!!!🔥
아래 명령어를 입력해서 로그인을 완료한다면 terminal에 firebase 토큰을 알려준다!
이 값을 github secrets에 FIREBASE_TOKEN의 이름으로 추가해 주자!!
firebase login:ci
4. Groups 추가하기
필자의 경우 이미 만들어둔 test group이 있었다. 그렇기 때문에 yml 파일에 기존에 만들어둔 테스트 그룹(hello-kitty-coding)을 입력해 줬다.
만약 그룹을 미리 지정해두지 않았다면 yml 파일의 groups : 어쩌구 line은 삭제해도 된다.
조사한 바에 의하면 Default 값이 trusted-testers로 지정되는 것으로 알고 있다.
groups : trusted-testers
그러나 그룹을 지정하고자 한다면, 네이밍에 신경을 써야 한다.
내가 지정한 이름이 아닌, firebase에서 제공해 준 네이밍을 사용해야 한다. 아래 이미지의 파란 네모 우측 ?를 클릭해 보면 '명령줄 도구에서 그룹을 지정할 때 이 별칭을 사용하세요.'라고 나와있다. (이것도 몰라서 삽질을 좀 했다..ㅠ)
만약 test group이름을 코드상에서 직접 공개하고 싶지 않다면 github secrets를 활용하는 것도 하나의 방법이다!
groups : ${{ secrets.FIREBASE_DISTRIBUTION_GROUPS }}
5. 파일 경로 지정하기
필자는 기존 CI코드에서 build 방식을 debug로 설정해 뒀다.
때문에 CD에서 업로드 해줄 file의 경로도 debug용 apk가 생성되는 경로로 설정해 뒀다.
# 기존 CI 코드
- name: Build debug APK # 👈 여기서 debug apk 뽑으라고 시킴
run: ./gradlew assembleDebug --stacktrace
# 추가된 CD 코드
- name: Upload apk to Firebase App Distribution
uses: wzieba/Firebase-Distribution-Github-Action@v1
with:
appId: ${{ secrets.FIREBASE_APP_ID }}
token: ${{ secrets.FIREBASE_TOKEN }}
groups: hello-kitty-coding-club
file: app/build/outputs/apk/debug/app-debug.apk # 👈 debug apk 위치 여기서 가져옴
releaseNotes: |
${{ github.event.pull_request.title }}
${{ github.event.pull_request.html_url }}
${{ github.event.pull_request.body }}
Build 방식을 변경하지 않았다면 아래 내용을 보지 않고, 제 코드와 동일한 file 경로를 지정하시면 됩니다~
만약 build flavor를 활용해 다양한 build variants가 있는 유저면 경로를 변경해줘야 한다!
만약 어떤 경로에 apk파일이 생성되는지 모른다면 터미널에서 확실하게 테스트해보는 것을 추천한다!
1) Android Studio에서 build apk를 할 때 지정한 build variants를 선택한다. (필자의 경우 debug)
2) build > Build Bundle/Apk > Build Apk
3) APK 생성이 완료되면 Notification에서 알려준다. 이때 locate 버튼을 눌러 앱이 생성되는 실제 경로를 확인한다.
6. Release Note 생성
필자의 경우에는 Pull Request의 정보를 가져오는 코드를 작성했다.
이 부분은 본인이 원하는 대로 custum 하면 좋을 것 같다~!!
(참고) 타 블로그를 보다 보니 local에 작성해 둔 txt 파일을 가져오는 식으로 작성한 사람도 있었다.
releaseNotesFile: documents/release-note/default-note.txt
[참고 : 마주했던 에러코드]
- FIREBAE_APP_ID를 잘못 설정한 경우에는 400번 에러코드를 반환했었다.
- groups를 잘못지정한 경우에는 app distribution에 배포는 완료되었으나, tester 지정이 안되었고 404를 반환했다.
자 여기까지 완료했다면, PR을 생성해보자~!!!
Firebase App Distribution에 이쁘게 앱이 배포가 될 것이다👍
이상 삽질 해결 과정을 모두 다 작성해 보았다!
끝-!
'Android' 카테고리의 다른 글
Android Booting Sequence (0) | 2024.12.20 |
---|---|
(Part 1) Server-Driven UI: Android with Dynamic Views (0) | 2023.11.09 |
[Android] Product Flavor 사용환경에서 Crashlytics 적용하기 (feat. slack 알림 연동) (2) | 2023.06.01 |
[Android] ShapableImageView radius설정하기 (0) | 2022.11.27 |
앱을 출시를 했는데요, 출시를 못했습니다 (2편/ Kakao Login) (4) | 2022.10.06 |