[MindSync] Google Play Store CD 적용기

hegleB·2024년 2월 14일
0
post-thumbnail

CD(Continous Delivery)

  • 지속적인 배포

현재 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에 성공적으로 배포한다.

profile
성장하는 개발자

0개의 댓글

관련 채용 정보