android

[안드로이드] Github Action 을 이용한 자동 배포

sieunju 2022. 6. 5. 13:03
반응형

안녕하세요 이번 글에서는 안드로이드 앱을 직접 운영하는 사람들에게만 필요한 포스팅이 되겠습니다. 

앱을 운영 하다 보면 기능, 버그 들이나 수정사항이 발생하면 앱을 '배포' 할 때가 있습니다. 손수 배포하는 과정은 아래와 같습니다.

  1. 배포할 내역들을 한 브렌치 (develop or master) 에 머지합니다. 
  2. 릴리즈 모드로 .aab or .apk 버전을 생성합니다. aka 배포 버전 만다.
    (구글에서 작년부터 aab 를 적극 지향하기 때문에 이제는. apk는... 보내줘야 합니다..ㅠㅠ)
  3. 플레이 스토어 앱 콘솔에 들어갑니다. 
  4. 배포할 앱 선택 
  5. 파일 업로드 및 변경사항 적기
  6. 검수 요청 
증말 복잡하죠.. 일단 배포 버전 파일을 말고 나서 콘솔에 들어가고~ 변경사항도 적고.... 개발자들은 정말 귀찮고 반복적인 작업을 아주 싫어합니다.

 

그래서 이번에 Github Action 이랑 라이브러리를 활용하여 특정 브렌치에 푸시하면 자동 배포되도록 하는 방법에 대해서 알려드리겠습니다. 

우선 준비물과 조건이 필요합니다. 

  1. 앱을 한번이라도 배포를 한 적이 있어야 합니다. 
  2. Gradle Play Publisher 라이브러리를 프로젝트 Application Module 추가해야 합니다.

https://github.com/Triple-T/gradle-play-publisher#quickstart-guide

 

GitHub - Triple-T/gradle-play-publisher: GPP is Android's unofficial release automation Gradle Plugin. It can do anything from b

GPP is Android's unofficial release automation Gradle Plugin. It can do anything from building, uploading, and then promoting your App Bundle or APK to publishing app listings and other metadat...

github.com

 

 

저 같은 경우에는 개인적으로 스토어에 올린 앱이 있어서 그걸로 정~말 여러가지 들을 해봤습니다. ㅠㅠ 수많은 실패로 얻은 경험이니 보는 사람은 이런 실패들을 겪지 않았으면 좋겠습니다 ㅎㅎ

수많은 실패 끝에 결국 성공할때 이 쾌감...🤩

 

저 같은 경우는 저장 소안에 keystore.jks 가 없고 깃허브 액션 Secrets 에 baase64로 변환하여 저장했습니다. 그 이유에 대해서는 오픈화된 저장소에 대해서 운영할 수도 있어서 한번 아래 화면처럼 저장해서 사용 중에 있습니다.

 

이제 각설하고 설정방법에 대해서 알려드리겠습니다. 

Google Play Store & Google Cloud Platform API 설정

1. 구글 클라우드 플랫폼 콘솔에 들어갑니다. https://console.cloud.google.com/?hl=ko

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

2. 프로젝트를 생성합니다. 

3. 생성후 좌측 메뉴에 "API 및 서비스" > "사용자 인증 정보" 선택 후 "서비스 계정 관리" 선택하여 서비스 계정을 생성합니다.
여기서 중요한건 서비스 계정 *** iam.gserviceaccount.com  복사합니다.  나중에 Google Play Console에서 사용합니다. 

간단하게 입력후 짜잔~만들어집니다.

4. 서비스 계정을 선택후 "키" 탭 선택 후 키를 추가합니다.

5. 그럼 자연스레 ".json" 파일이 다운로드하게 됩니다. 해당 파일은 꼭 간직했다가 "안드로이드 프로젝트" 폴더 아무 데나 옮깁니다.
 ex.) 저같은 경우에는 릴리즈 노트 경로가 고정이라 거기에 저장했습니다. -> app/src/main/play/googlecloudplatform.json 

6. 자 이제 Google Play Platform에서 처리할 거는 다했습니다. 이제 Google Play Console에서 작업해야 할 것들이 있습니다. 

7. 플레이 콘솔 메인에 진입합니다. https://play.google.com/console/about/

 

Google Play Console | Google Play Console

앱 및 게임이 성장할 수 있도록 사용자에게 도달하고 사용자 참여를 유도하는 데 도움이 될 도구, 프로그램, 통계를 이용하세요.

play.google.com

8. 좌측 메뉴에 "설정" > "API 액세스" 진입합니다. 저 같은 경우에는 이미 Google Cloud 프로젝트와 연결이 되어 있어서 아래 화면처럼 되어있는데 처음에는 새 프로젝트를 연결할 건지, 기존 프로젝트를 연결할 건지 선택하는 화면이 나옵니다.
여기서 중요한점은 PlayConsole 관리자 계정과 Google Cloud Platform 계정이 동일해야 합니다. 그래야 기존 프로젝트에서 연결이 됩니다. 

9. Play Android Developer API 활성화합니다. 

10. 서비스 계정 탭에 보시면 여러 이메일이 있는데 아까 서비스 계정 추가했던 "3번" 여기서 중요한건 ***iam.gserviceaccount.com 계정을 찾은 후 "권한 부여" 선택 후 자동 배포하고 싶은 앱을 선택하고 "사용자  초대" 선택합니다. 
이후 계정 권한에 들어가서 출시에 대한 권한만 허용합니다. 

출시 권한만 허용 해놓고 저장합니다.

11. 이제 Google Coud Platform, Google Play Console에 해야 할 것들은 모두 마쳤습니다.

 

Android Studio & Github Action 설정 방법

  1. 안드로이드 스튜디오 Application Module에 triplet 플러그인을 추가합니다.
plugins {
    id("com.android.application")
    id("com.github.triplet.play") version "3.7.0"
}

그리고 'sync now' 선택한 뒤에 Application Module에 앱 배포 시에 대한 설정을 합니다.

play {
    // production -> 상용, internal -> 내부, alpha, beta
    defaultToAppBundles.set(true)
    track.set("production")
    // track.set("internal")
    userFraction.set(0.3)
    releaseStatus.set(ReleaseStatus.IN_PROGRESS)
    serviceAccountCredentials.set(file("$projectDir/GoogleCloudPlatform.json"))
}

위 코드 안에 "GoogleCloudPlatform.json" 은 위에서 서비스 계정에서 키 추가로 받은. json 파일입니다. 원하는 경로에 추가하시면 되겠습니다. 

2. 릴리즈 노트 파일을 설정해야 합니다. 해당 경로는 triplet.play 라이브러에서 고정되어 있기 때문에 아래와 같습니다.

(Application Module) > src/main/play/release-notes/ko-KR/default.txt 

알파 버전 배포도 하고 싶다면 alpha.txt 를 생성하여 출시 내용을 적으시면 되겠습니다. 

예시 

[v.1.0.0]

· 실험실 메뉴를 만들었어요. 메인 > 우측 상단 [...] 선택
· WIFI 스캔 지원하는 기능을 만들었어요.
· 여러분들의 소중한 의견을 반영하여 안정성을 향상하고 소소한 버그를 수정했어요.

많이 이용해주세요 😀

 

3. signingConfigs 처리 방법

Application Module
android {
	signingConfigs {
        create("release") {
        	// Github Action 에서 키스토어를 만드는 경우
            val files = file("/home/runner/work/_temp/keystore/").listFiles()
            if (files != null) {
                storeFile = files.first()
                storePassword = System.getenv("Actions secrets 에 설정한 값")
                keyAlias = System.getenv("Actions secrets 에 설정한 값")
                keyPassword = System.getenv("Actions secrets 에 설정한 값")
            }
            
            // 저장소에 직접 키스토어를 저장하는 경우
           	storeFile = file("키스토어 경로")
            storePassword, keyAlias, keyPassword 적제적소에 맞게 설정하면됩니다.
           
        }
    }
}

 

4. 릴리즈 Task 설정

Application Module

tasks.register("release") {
    dependsOn(tasks["clean"])
    dependsOn(tasks["bundleRelease"])
    mustRunAfter(tasks["clean"])
}

 

5. 안드로이드 스튜디오에서의 설정은 모두 마쳤습니다. 이제 끝으로 Github Action 및 keystore 를 base64 로 변환 후
"Actions secrets" 추가하는 방법에 대해 알려드리겠습니다. 

우선 맥을 사용하신다면 아래 명령어 양식대로 쳐서 .txt 파일을 생성합니다.

openssl base64 -in {키스토어}.jks -out {변환할 파일 명}.txt

6.  깃허브 저장소에 들어가서 "Settings" > 좌측 메뉴에 "Secrets" > "Actions" 들어가서 Github Action 에서 필요한 키스토어 정보를 추가합니다. 키스토어 파일을 base64 (문자열) 로 변환한 것 또한 전체 복사하여 알맞은 이름값과 내용 값을 입력합니다.

 7. 자 이제 모든 게 끝났습니다. 이제 yml 만 작성하면 되겠습니다. 

name: Build and upload release aab

on:
  push:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
        with:
          ref: master

      # JDK 설정
      - name: set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'adopt'
          check-latest: true
	# secrets.APP_RELEASE_KEY_STORE_BASE_64 -> 키스토어를 문자열(base64) 인코딩한 이름값 #
      - name: Decode Keystore
        id: decode_keystore
        uses: timheuer/base64-to-file@v1
        with:
          fileName: '/keystore/키스토어를 저장할 이름.jks'
          encodedString: ${{secrets.APP_RELEASE_KEY_STORE_BASE_64}}
	
      - name: Make gradlew executable
        run: chmod +x ./gradlew
	
    # Action Secrets 에 키스토어에 필요한 정보들을 입력한 내용을 env 로 저장합니다. #
    # 프로젝트 파일에서 'System.getenv' 로 가져다 사용할수 있습니다. #
      # 앱 AAB 및 배포
      - name: Build Release And Publish AAB
        run: ./gradlew publishReleaseBundle
        env:
          SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS }}
          SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD }}
          SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD }}
	
    # 배포한 흔적을 남기고 싶다면 아래 스크립트들을 입력하고 아니면 위에 까지만 하면 되겠습니다. #
      # 버전 정보 가져오기
      - name: Get version
        id: get_version
        run: |
          echo "::set-output name=code::$(grep versionCode buildSrc/src/main/java/Dependencies.kt | awk '{print $5}')"
          echo "::set-output name=name::$(grep versionName buildSrc/src/main/java/Dependencies.kt | awk '{print $5}' | tr '"' ' ' | tr -d " ")"
      # 태그 이름 가져오기
      - name: Get tag name
        id: get_tag
        run: echo "::set-output name=name::v${{ steps.get_version.outputs.name }}"

      # 릴리즈 이름 가져오기
      - name: Get release name
        id: get_release
        run: echo "::set-output name=name::v${{ steps.get_version.outputs.name }}"

      # 배포 내역 가져오기
      - name: Get Release Note
        id: get_note
        run: echo "::set-output name=name::v${{ steps.get_version.outputs.name }}"

      # 릴리즈 생성
      - name: Generate Release
        uses: actions/create-release@latest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          release_name: ${{ steps.get_release.outputs.name }}
          tag_name: ${{ steps.get_tag.outputs.name }}
          draft: false
          prerelease: false

8. # ~ # 로 중요한 스크립트에 설명을 남겼습니다. 저 스크립트는 "master" 에 푸시를 하면 자동 배포되도록 처리했습니다. 

9. 성공 화면 ( 앱 출시 형태는 "수동 배포" 입니다. )

 

짜잔~ 모든 게 끝났습니다. 이제부터는 앱 배포까지 귀찮은 일은 GithubAction 한테 맡기도록 합시다!!

끝으로 제가 최근에 안드로이드 개발자라면 꼭 필요한 테스트인 딥링크 테스트를 간단히 할 수 있는 앱을 소개하겠습니다. 
(사실 홍보 목적이었습니다.. 🤩)

 

딥링크 테스트할 때 테스트할 링크들을 어딘가에 만들어 놓고 각각 선택하면서 서비스하고 있는 앱이 잘 실행되는지 하려면 매우 매우 귀찮습니다. 어딘가에 리스트로 만들어 놓고 또한 링크를 타이핑 치는 게 아니라 자동으로 인식해서 처리하면 아주아주 편리할 거 같아서 한번 만들어 봤습니다. 

https://play.google.com/store/apps/details?id=com.hmju.deeplink 

 

퀵딥링크(Quick DeepLink) - Google Play 앱

딥링크 테스트를 아주 간단하게 도와주는 앱입니다.

play.google.com

 

많은 이용 바랍니다 :)

 

회고


자동 배포 시스템을 구축했을 때 도움이 될만한 글을 찾기가 너무 힘들었습니다..ㅠㅠ 죄다 기본 설정만 알려줘서.... 뭐가 맞는지 잘 모르겠다는 게 큰 어려움이었습니다.

반응형