본문 바로가기
안드로이드

[안드로이드] Github Actions으로 구글 플레이스토어 배포 with google-services.json

by keel_im 2021. 8. 26.
반응형

---이전 글---

2021.02.17 - [안드로이드] - [안드로이드] Github Actions으로 구글 플레이스토어 배포

 

[안드로이드] Github Actions으로 구글 플레이스토어 배포

안녕하세요!! 오늘은 간단하게 CI/CD를 구성하여 안드로이드 앱을 Signing 하여 배포하는 방법을 알아보려고 합니다. 사실 이 글의 발단은 저의 노트북이 너무 열 받아서 이제 힘을 못쓴다는 것입니

keelim.tistory.com

 

안녕하세요 오늘은 Github Action 으로 배포 하는 이야기를 해보려고 합니다. 

먼저 문제의 상황은 Github Actions 으로 배포를 하는 것은 좋은 데, google-services.json 이나 Map key 를 어떻게 숨기겠느냐? 라는 문제 상황입니다. 

저도 이러한 부분이 보안에 치명적일 수 있음을 인지를 하였고 항상 해결책을 찾으려고 했습니다. 

제가 여기서 해결한 방법은 2가지 입니다. 

1. local.properties, google-services.json 을 secrets 를 통해 관리를 하고 Actions가 실행이 될떄, 이러한 파일 들이 만들어질 수 있도록 하는 것입니다. 

2. local.properties 작성하는 API 값도 플러그인을 통하여 간편하게 작성을 하는 것입니다.  (아래 링크가 정확합니다.)

https://developers.google.com/maps/documentation/android-sdk/get-api-key?hl=ko 

 

API 키 사용하기  |  Maps SDK for Android  |  Google Developers

여기에서는 Android용 Maps SDK에 사용할 API 키를 만들어 앱에 추가하고 키를 제한하여 앱을 보호하는 방법을 설명합니다. SDK를 사용하는 앱에는 반드시 API 키를 추가해야 합니다. 시작하기 전에 Andr

developers.google.com

 

그러면 어떻게 secrets를 관리할까요?

고민의 시간이 있음에도 불구하고 그 과정은 엄청 심플 합니다. `echo` 를 잘 사용하는 것입니다. 기존 yml 를 보게 되면 

이런 방식으로 secrets 에 추가를 하고 echo로 actions 가 작동하는 시간에 파일을 만들어주는 것입니다.

이를 똑같이 응용해서

기존 yml 에서 빌드시 오류가 나는 부분들을 secrets 의 기재를 하였고 스크립트를 추가하여 주었습니다. 

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout
      uses: actions/checkout@v2.3.4
      
    - name: set up JDK 11
      uses: actions/setup-java@v2.3.0
      with:
        distribution: 'zulu' # See 'Supported distributions' for available options
        java-version: '11'
      
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew

    - name: Access MAPS_API_KEY
      env:
        APOD_API_KEY: ${{ secrets.MAPS_API_KEY }}
      run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./app/google-services.json

    - name: Access MAPS_API_KEY
      env:
        APOD_API_KEY: ${{ secrets.MAPS_API_KEY }}
      run: echo MAPS_API_KEY=\"$MAPS_API_KEY\" > ./local.properties

    - name: Build with Gradle
      run: ./gradlew build

    - name: Build Release AAB
      id: buildRelease
      run: ./gradlew bundleRelease

    - name: Sign AAB
      id: sign
      uses: r0adkll/sign-android-release@v1
      with:
        releaseDirectory: app/build/outputs/bundle/release
        signingKeyBase64: ${{ secrets.SIGNING_KEY }}
        alias: ${{ secrets.ALIAS }}
        keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
        keyPassword: ${{ secrets.KEY_PASSWORD }}

    - name: Upload AAB
      id: uploadArtifact
      uses: actions/upload-artifact@v2.2.4
      with:
        name: app
        path: app/build/outputs/bundle/release/app-release.aab

    - name: Create service_account.json
      id: createServiceAccount
      run: echo '${{ secrets.SERVICE_ACCOUNT_JSON }}' > service_account.json

    - name: Deploy to Play Store (BETA)
      id: deploy
      uses: r0adkll/upload-google-play@v1.0.15
      with:
        serviceAccountJson: service_account.json
        packageName: com.keelim.nandadiagnosis
        releaseFiles: app/build/outputs/bundle/release/app-release.aab

위 yml 파일을 전체적으로 보시면서 이해하시는 것도 좋은 방법입니다. 

https://github.com/keelim/project_cnuBus/blob/master/.github/workflows/android.yml

 

GitHub - keelim/project_cnuBus: Hi! This is keelim`s android project

Hi! This is keelim`s android project. Contribute to keelim/project_cnuBus development by creating an account on GitHub.

github.com

오늘은 Github Actions 로만 배포를 하기 위해 yml을 적절히 수정하는 방법에 대해 알아보았습니다. 

요약을 하자면 

1. 빌드를 위해 꼭 필요하지만 Github 에서 관리하기 껄끄럽다면 secrets 

2. 이를 사용하기 위해서는 적절한 scripts 와 echo 

로 정리할 수 있습니다. 

궁금한 내용이나 틀린 부분에 대해서는 언제든지 환영합니다. 

반응형

댓글