android

[안드로이드] Fastlane & Google Play 배포 환경 구축 해보기

sieunju 2022. 10. 3. 14:50
반응형

저는 Fastlane 을 사용하기전에는  triplet 을 이용하여 자동 배포 환경을 구축 했었습니다. 
https://jsieun73.tistory.com/183?category=611190 참고

 

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

안녕하세요 이번 글에서는 안드로이드 앱을 직접 운영하는 사람들에게만 필요한 포스팅이 되겠습니다. 앱을 운영 하다 보면 기능, 버그 들이나 수정사항이 발생하면 앱을 '배포' 할 때가 있습니

jsieun73.tistory.com

이전에 Fastlane & Firebase App Distribution 을 이용한 앱 자동 배포하는 환경을 구축 해봤습니다.
fastlane 설치방법과 GCP 설정 방법은 아래 링크 참고 하시면 되겠습니다. :)
https://jsieun73.tistory.com/190?category=611190

 

[안드로이드] 앱 테스터에 자동 배포 도전해보기!

앱을 서비스 하다 보면 QA 팀이나 디자인팀한테 앱을 배포해서 디자인검수, QA검수를 진행하는 일이 번번히 발생합니다. 그럴 때마다 수동으로 앱을 설치해주다 보면 서로 피곤해지는 문제가 발

jsieun73.tistory.com

위링크를 통해 GCP, Fastlane 기본적인 설정이 된 상태에서 Google PlayStore 에 배포 환경에 대해 설명 해 보도록 하겠습니다. 

프로젝트 환경 설정

1. .aab 로 업로드 하는 상태
2. 수동 배포를 진행하는 타입 -> PlayStore 에 검수 완료가 되면 사용자에게 % 단계적으로 배포하는 타입
3. master 브렌치에 푸시가 되면 앱 배포가 진행 되는 상태

Relase-Upload.yml 설정

name: Build and upload release aab

on:
  push:
    branches: [ master ]

  # 수동 WorkFlow 설정
  # workflow_dispatch:

jobs:
  publish_aab:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      # JDK 설정
      - name: set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'adopt'
          check-latest: true

      # Ruby Setting
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: 2.7.2
          bundler-cache: true

      - name: Decode Keystore
        id: decode_keystore
        uses: timheuer/base64-to-file@v1
        with:
          fileName: '/keystore/release/deeplinkBot.jks'
          encodedString: ${{secrets.APP_RELEASE_KEY_STORE_BASE_64}}

      # Fastlane Setting
      - name: Set Up fastlane And Publish Google Play
        uses: maierj/fastlane-action@v2.2.0
        with:
          lane: 'productionDeploy'
        env:
          SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS }}
          SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD }}
          SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD }}

GithubAction 으로 앱을 자동 배포 하기 때문에 fastlane 으로 배포하는 스크립트만 가져왔습니다. 
저 같은경우에는 프로젝트내에 상용 버전용 .jks 파일이 없습니다. Github Actions Secrets 에서 .jks 파일을 base64String 을 처리해서 깃허브에 가지고 있습니다. 그래서 중간에 보면 Decode Keystore 가 있는데 그부분이 String to jks 로 변환 해주는 스크립트입니다.

Fastlane 을 하기 위해서는 Ruby 설정과 "maierj/fastlane-action@v2.2.0" 설정해주고
lane: {내가 fastfile 에 설정한 스크립트 명} 을 입력해주시면 되겠습니다. 
env: 이거는 fastlane 에서 스크립트 실행에 필요한 환경변수값들이라고 보시면 되겠습니다.  

 

Fastlane 을 이용한 Google Play Publish 해보기

1. 릴리즈 Task 설정

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

위에 처럼하면 PC 에서 "./gradlew relase" 로 입력하면 .aab 로 만들어지게 됩니다.

2. FastFile 설정

desc "Deploy a new version to the Google Play (ProductionType)"
  lane :productionDeploy do
    gradle(task: "release")

    # 특정 폴더에 .aab 파일 찾고 나서 앞에 .. -> . 치환 처리
    filePath = Dir['../app/build/outputs/bundle/release/*.aab'].last
    artifactPath = filePath.sub("..",".")
    puts artifactPath

    upload_to_play_store(
        track: "production",
        aab: artifactPath,
        skip_upload_metadata: true,
        skip_upload_images: true,
        skip_upload_screenshots: true,
        skip_upload_apk: true,
        release_status: "inProgress",
        rollout: "0.3"
    )
  end

파라미터에 대해 몇가지 설명을 드리면, 

aab
.aab 가 만들어진 위치값을 설정하는 "aab" 입니다. 
제가 개인적으로 운영중인 딥링크 테스트 앱기준으로 "artifactPath" 값은 아래와 같습니다. 

 ./app/build/outputs/bundle/release/QuickDeepLink(1.0.3)-release.aab

release_status
앱 배포상태를 어떻게 할건지에 대한 파라미터 값입니다. 도큐먼트에 잘 나와있지만, 한국어로 번역하자면
completed: 검수 완료후 전체(100%) 출시
draft: 릴리즈 노트, aab 업로드 해놓고 검수 신청을 안한 상태
inProgress: 단계적 출시 진행 해당 값을 설정해놓으면 사용자 몇 %로 출시 할건지 필요한 값인 rollout 이 무조건 필요합니다. 

rollout
release_status 값이 inProgress 인 경우 사용자 몇% 로 단계적 출시 할건지 입력값입니다. 
ex.) "0.3" -> 30% 배포

3. 빌드 성공이후 GitAction 화면

 

추가적으로 앱을 배포할때 Signing 처리는 필수인데 저 같은 경우에는 어떻게 되어있는지 공유드리겠습니다. 특별한건 아니고 아래와 같습니다. 

app.gradlew.kts
signingConfigs {
        create("release") {
            val files = file(SigningConfig.Release.storeFilePath).listFiles()
            if (files != null) {
                storeFile = files.first()
                storePassword = System.getenv(SigningConfig.Release.keyStorePassword)
                keyAlias = System.getenv(SigningConfig.Release.keyAlias)
                keyPassword = System.getenv(SigningConfig.Release.keyPassword)
            }
        }

        create("staging") {
            storeFile = file(SigningConfig.Staging.storeFile)
            storePassword = SigningConfig.Staging.keyStorePassword
            keyAlias = SigningConfig.Staging.keyAlias
            keyPassword = SigningConfig.Staging.keyPassword
        }
    }
    
buildSrc
object SigningConfig {
    object Release {
        const val storeFile = "../keystore/release/deeplinkBot.jks"
        const val storeFilePath = "/home/runner/work/_temp/keystore/release"
        const val keyStorePassword = "SIGNING_STORE_PASSWORD"
        const val keyAlias = "SIGNING_KEY_ALIAS"
        const val keyPassword = "SIGNING_KEY_PASSWORD"
    }
}


상용버전에 사용할 .jks 파일은 깃허브 시크릿에 저장되어 있고, staging 이라고 AppTester 에 배포할 타입은 ".jks" 파일은 프로젝트내에 있습니다. 

회고


생각보다 Fastlane 간단 예제만 나와있지 실제 서비스에 적용할때 어떻게 해야 하는지에 대해 한국화 자료가 많이 없었습니다. 역시나..아니면 제가 검색을 잘 못하는걸지도 모르겠지만...좀 찾다가 잘 안나와서 그냥 도큐먼트를 보니 해답이 나왔습니다. (https://docs.fastlane.tools/actions/upload_to_play_store/

 

upload_to_play_store - fastlane docs

<!-- This file is auto-generated and will be re-generated every time the docs are updated. To modify it, go to its source at https://github.com/fastlane/fastlane/blob/master/fastlane/lib/fastlane/actions/upload_to_play_store.rb --> upload_to_play_store Upl

docs.fastlane.tools

도큐먼트를 보다가 느낀게 파라미터값을 어떤 형태로 넣는지 알려주면 좀 더 좋았을거 같다는 생각이..크흠..

그리고 Fastlane 스크립트 작성시 루비 언어로 해야 하다보니 아주 깔짝 Ruby Docs를 보게되어 많은 공부를 하게 된 계기가 되었습니다. 

 

 

지금까지 긴글 읽어주셔서 감사합니다.

 

안드로이드 과외를 받고 싶은 학생분들이라면 아래 링크 클릭!
https://jsieun73.tistory.com/189

 

[안드로이드] 안드로이드 입문 ~ 중급 과외

요즘 정보의 바다로 부터 잘못된 길을 가고 있는 안드로이드 새싹들에게 가이드를 하고자 과외를 해보려고 합니다. :) 제 스펙을 소개 하자면 1. Android 5년차 개발자 2. 뷰티 / 의류 이커머스 쇼핑

jsieun73.tistory.com

 

반응형