현재 Firebase App Distribution에 앱 배포를 진행 중이며 CD를 구축하여 지속적인 배포를 하고 있는 상태이다
하지만 Google Play Store에 'MindSync' 앱이 등록되어 있고, 이를 통한 배포가 Firebase App Distribution
를 이용하는 것보다 더 자주 이루어질 것이라고 판단을 하였다.
따라서, 앞으로는 Google Play Store를 통한 앱의 지속적인 업데이트가 필수적이라고 생각하며, 이에 CD를 적용하기로 결정했다.
https://play.google.com/store/apps/details?id=boostcamp.and07.mindsync
CD(Continuous Delivery)를 구축하기 전에 Google Cloud Platform(GCP)에서 서비스 계정을 생성하는 것은 필수이다. 이 과정은 배포 권한을 부여하고, JSON 파일을 통해 Google Play Store에 애플리케이션을 배포할 수 있게 하기 위함이다.
서비스 계정을 생성하게 되면 이메일을 부여받게 된다.
GCP에서 서비스 계정을 생성한 이메일을 배포를 할 수 있도록 Google Play Console에서 권한을 부여해줘야 한다
Firebase App Distribution을 통한 CD 구성 시 이미 Keystore 파일, Keystore 비밀번호, 키 별칭, 키 비밀번호를 등록했으므로, 이 정보들을 다시 입력할 필요가 없다. 대신, 서비스 계정에서 생성한 Json 파일의 데이터를 GitHub Actions의 비밀 정보(Secrets)에 추가한다.
name: AOS-distribute
on:
push:
branches:
- distribute
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'corretto'
java-version: 17
- name: Create Properties File
env:
RELEASE_KEYSTORE: ${{ secrets.KEY_STORE_BASE_64 }}
KEYSTORE_PROPERTIES: ${{ secrets.KEYSTORE_PROPERTIES }}
LOCAL_PROPERTIES: ${{ secrets.LOCAL_PROPERTIES }}
run: |
echo "$RELEASE_KEYSTORE" | base64 -d > AOS/app/release.keystore
echo "$KEYSTORE_PROPERTIES" > AOS/keystore.properties
echo "$LOCAL_PROPERTIES" > AOS/local.properties
- name: Create google-services.json
run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > AOS/app/google-services.json
- name: Build Release AAB
run: ./gradlew bundleRelease
working-directory: ./AOS
- name: Upload AAB
uses: actions/upload-artifact@v2
with:
name: app-release.aab
path: AOS/app/build/outputs/bundle/release/app-release.aab
distribute 브랜치로 push 이벤트가 발생하면, 해당 GitHub Actions 워크플로우가 ubuntu-latest 환경에서 실행된다. 이 과정에서 먼저 actions/checkout@v4를 사용하여 저장소의 코드를 가져온다. 이어서, JDK 17을 설정하여 Java 기반의 Android 애플리케이션 빌드 환경을 준비한다.
빌드 과정에서 필요한 서명 파일을 생성하기 위해, Base64로 인코딩된 RELEASE_KEYSTORE 시크릿을 디코딩하여 AOS/app/release.keystore 파일을 만든다. 또한, KEYSTORE_PROPERTIES 시크릿의 내용을 AOS/keystore.properties 파일에, 그리고 LOCAL_PROPERTIES 시크릿의 내용을 AOS/local.properties 파일에 각각 작성한다.
Firebase와 같은 Google 서비스를 사용하기 위해, secrets.GOOGLE_SERVICES_JSON 값으로 google-services.json 파일을 생성한다. 그 후, ./gradlew bundleRelease 명령어를 실행하여 ./AOS 디렉토리에서 Android App Bundle(AAB) 형식의 릴리즈 빌드를 생성한다.
마지막으로, 생성된 app-release.aab 파일을 GitHub Actions 아티팩트로 업로드하여 배포할 준비를 마친다.
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Download AAB
uses: actions/download-artifact@v2
with:
name: app-release.aab
path: AOS/app/build/outputs/bundle/release/
- name: Create service_account.json
run: echo '${{ secrets.GOOGLE_PLAY_STORE_SERVICE_ACCOUT }}' > service_account.json
- name: Extract Release Version
run: echo "##[set-output name=version;]$(echo '${{ github.event.head_commit.message }}' | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')"
id: extract_version_name
- name: Create GitHub Release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.extract_version_name.outputs.version }}
release_name: ${{ steps.extract_version_name.outputs.version }}
files: |
AOS/app/build/outputs/bundle/release/app-release.aab
- name: Create whatsNewDirectory
run: |
mkdir -p ${{ github.workspace }}/distribution/whatsnew
echo '${{ secrets.WHATSNEW }}' > ${{ github.workspace }}/distribution/whatsnew/whatsnew-ko-KR
- name: Deploy to Google Play Store
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJson: service_account.json
packageName: boostcamp.and07.mindsync
releaseName: ${{ steps.extract_version_name.outputs.version }}
releaseFiles: AOS/app/build/outputs/bundle/release/app-release.aab
track: production
whatsNewDirectory: ${{ github.workspace }}/distribution/whatsnew
GitHub Actions를 통해 이전 빌드 작업에서 생성된 app-release.aab 파일을 다운로드하고, GOOGLE_PLAY_STORE_SERVICE_ACCOUT 시크릿 값으로 service_account.json 파일을 생성함으로써 Google Play Store에 앱의 자동 배포가 가능해진다. 커밋 메시지에서 버전 번호를 정규 표현식을 이용해 추출한 뒤, 이 번호를 사용하여 GitHub에 릴리즈를 생성하고 app-release.aab 파일을 포함시킨다. 마지막으로, 필요한 정보인 serviceAccountJson, packageName, releaseName, releaseFiles, track, whatsNewDirectory 등을 명시하여 AAB 파일을 Google Play Store에 성공적으로 배포한다.