profile image

L o a d i n g . . .

728x90
반응형

들어가며

개발이 어느정도 마무리가 되면..(끝은 없으니까요 ^_ㅠ?)
사용자를 만나기 위한 준비를 해야한다.
여차저차 준비를 하고 내 자식같은 아이가 세상에 나오면..
높은 확률로 다시 고쳐야할 일이 생긴다.
수정하고 내놓고 수정하고 내놓고..

안드로이드 앱의 경우 출시 및 출시 준비 과정은 다음과 같다.
(간략하게 작성한것으로 상이할 수 있습니다.)

1. 출시 전 속성 지정 및 설정
- debuggable = false (안하면 앱이 안올라가는거 아시죠)
- app signing (빌드할 때 보통 자동으로 되지만 일단 넣었다.)
- versionCode++
- versionName 지정
2. buildType 지정 후 build 진행
3. play console 에서 업로드 진행
4. 내부 테스트용 앱 업로드, 링크 전달

나의 경우 해당 과정 중 3단계를 코드 상에서 수행할 수 있는
google play developer API 를 이용해 배포를 진행하고 있었다.
그러니까 1-4 단계 중에서 3빼고 모두 내 손으로 한땀한땀 해줬다는 소리다^^..
물론 관리하는 앱이 하나라서 그렇게 힘들겠냐 할 수 있겠지만..

반복되고 강조되는 작업은 개발자를 불안하게 해요!

본격 귀찮아서 fastlane 도입한 후기 시작합니다.

시작하기

fastlane 을 이용한 앱 배포의 대략적인 흐름 (내 목표) 은 아래와 같았다.
전처리
- app signing
- versionCode++
- versionName 지정
빌드
출시 (업로드)
후처리 (예정)

1. Ruby 설치하기

fastlane 이 ruby 기반이라서 ruby가 필요하다.
맥OS 의 경우 ruby가 기본으로 설치되어 있다고 하던데
우리 윈도우는 그런거 없으니까 직접 설치해주기로 한다.

여기에서 설치하면 된다.

2. bundler 설치하기

사실 fastlane 공식문서가 아주 잘되어 있으니 참고하는 것을 추천한다.

bundler 를 설치한다.

gem install bundler

3. fastlane init

fastlane 을 적용하려는 프로젝트로 이동한다.
(설치가 안되면 관리자 권한에서 해보세요)

bundle init

해당 프로젝트 루트에 Gemfile 이 생기는 것을 확인할 수 있다.

bundle add fastlane

Gemfile.lock 이 생기는 것을 확인할 수 있다.

4. 초기 셋팅하기

bundle exec fastlane init

그리고 프로젝트의 패키지 이름을 입력하라고 한다.
그리고 구글 플레이 콘솔 서비스 계정의 키 파일 경로를 입력하라고 한다.
그리고 메타 데이터를 통해 구글 플레이 콘솔에 정보를 업로드 하겠냐고 묻는다.
→ 나의 경우 이미 스토어에 등록이 된 상태이므로 건너뛴다. (나중에 설정 가능하다.)

bundle exec fastlane test

fastlane 이 정상적으로 설치 되었는지 확인하고 싶으면
위의 명령어를 입력하면 된다. (fastlane test 라고 입력해도 무방)
test 라는 이름의 lane 을 실행하겠다는 것이다.

5. Fastfile 작성하기

Fastfile 을 코드 편집기에서 열어준다.
lane :test 를 찾을 수 있을 것이다.
해당 파일을 입맛에 맞게 고쳐주면 된다.
위에서 말했지만 ruby 기반이다.....

가장 기본적인 흐름은 아래와 같다.
빌드 - 게시
properties 에서 gradle 의 속성에 접근할 수 있다. (공식문서 참고)

# production 트랙 출시
desc "deploy production"
lane :release do
    gradle(task: "clean")
    # 빌드
    gradle(
      task: "bundle",
      build_type: "release",
      print_command: true,
      properties: {
      # app signing
        "android.injected.signing.store.file" => ENV['SIGNED_STORE_FILE'],
        "android.injected.signing.store.password" => ENV['SIGNED_STORE_PASSWORD'],
        "android.injected.signing.key.alias" => ENV['SIGNED_KEY_ALIAS'],
        "android.injected.signing.key.password" => ENV['SIGNED_KEY_PASSWORD']
      }
    )
    # 게시
    upload_to_play_store(
      track: "production",
      json_key: ENV['GOOGLE_SERVICE_ACCOUNT_KEY'],
      aab: ENV['AAB_RELEASE_PATH'],
      in_app_update_priority: priority,
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true,
      skip_upload_apk:true
    )
end

쉽게 드러나면 안되는 것들은
아래 명령어 실행 후

gem install dotenv

.env 파일을 만들고 여기에서 가져다 쓴다.
아래와 같이 본인의 입맛에 맞게 (?) 작성하면 된다.

#.env 파일 

# 서명 키 경로
SIGNED_STORE_FILE='YOUR_PATH'
# 서명 키 패스워드
SIGNED_STORE_PASSWORD='YOUR_PASSWORD'
# 앱 서명 Alias
SIGNED_KEY_ALIAS='YOUR_ALIAS'
# 키 비밀번호
SIGNED_KEY_PASSWORD='YOUR_PASSWORD'

전처리
- app signing
- versionCode++
- versionName 지정
빌드
출시 (업로드)
후처리 (깃 푸시, 테스트 앱 배포)

위 과정이 모두 담긴 lane 을 작성했다.

# 모든 테스트 트랙에 출시 및 테스트 앱 배포
desc "deploy all track"
    lane :deployAll do |options|
    develop(options)
    alpha(options)
    release(options)
    gitCommitAndPush()
end

fastlane deployAll version:patch priority:5

이제 위 명령어 한줄이면
상기에 작성한 배포 과정이 실행된다.
그것도 각 트랙별로!!!!!!
구글 API 를 통해서 업로드를 진행할 때는
콘솔에 올리는 것 빼고는 직접 다 해줬어야 하다보니..
각각 트랙마다 똑같은 작업을 했어야했던 게 제일 큰 고역이었다.
특히 버전 코드를 올려야하는 것........(절레절레


각각의 트랙의 코드를 보면 이렇다.

desc "deploy test"
lane :test do |options|
    updateVersion(options)
    makeAAB('debug')
    if options[:priority]
      priority = options[:priority]
    end
    uploadToPlayStore(
      'test',
      priority
    )
    gitCommitAndPush()
 end


updateVersion(options) 에서
버전코드와 버전네임을 지정한다.
사실 이 fastlane 을 도입하고자 마음 먹은게
versionCode auto increment 되게 만들고 싶어서였던게
거의 8할을 차지했다보니.....많은 자료를 찾아 돌아 다녔는데
여기서 정말 많은 도움을 받았다. => fastlane 플러그인으로 설치도 가능한 것으로 보인다.
(버전 코드 자동 증가는 gradle 에서도 구현할 수 있다. 나는 겸사겸사..여기서)

makeAAB('debug') 에서 지정한 buildType 으로 build 해준다.

# build 수행
  def makeAAB(type)
    gradle(task: "clean")
    gradle(
      task: "bundle",
      build_type: "#{type}",
      print_command: true,
      properties: {
        "android.injected.signing.store.file" => ENV['SIGNED_STORE_FILE'],
        "android.injected.signing.store.password" => ENV['SIGNED_STORE_PASSWORD'],
        "android.injected.signing.key.alias" => ENV['SIGNED_KEY_ALIAS'],
        "android.injected.signing.key.password" => ENV['SIGNED_KEY_PASSWORD']
      }
    )
  end


updateToPlayStore('test', priority) 에서
구글 플레이 스토어에 업로드를 수행한다.

# 구글 플레이 스토어 업로드 설정 수행
  def uploadToPlayStore(track, priority)
    path = ENV['ROOT']
    if (track == 'develop')
      path += ENV['AAB_DEVELOP_PATH']
    elsif (track == 'alpha')
      path += ENV['AAB_ALPHA_PATH']
    elsif (track == 'release')
      path += ENV['AAB_RELEASE_PATH']
    else
      path += ENV['AAB_DEVELOP_PATH']
    end
    upload_to_play_store(
  	  track: "#{track}",
  	  json_key: ENV['GOOGLE_SERVICE_ACCOUNT_KEY'],
  	  aab: path,
      in_app_update_priority: priority,
  	  skip_upload_metadata: true,
  	  skip_upload_images: true,
  	  skip_upload_screenshots: true,
  	  skip_upload_apk:true
    )
    distributeForTest(path)
  end


distributeForTest(path) 에서 firebase app distribution 으로 테스트 앱을 배포한다.
이 과정의 경우 사실 내가 개발하고 내가 테스트(^_ㅠ..)하는 지금 환경에서는
크게 필요성을 느끼지 못할 수도 있지만
실제로 내가 테스트 용 앱을 다운 받기 위해서는
일련의 과정이 존재하기 때문에...한번 도입해봤다.
생각보다 너무 편리했다!
이와 관련해서는 이곳에 아주 잘 설명이 되어 있다.

  def distributeForTest(path)
    firebase_app_distribution(
      app: ENV['APP_ID'],
      firebase_cli_token: ENV['FIREBASE_TOKEN'],
      groups_file: "your tester group",
      release_notes_file: "your release note path",
      android_artifact_type: "AAB",
      apk_path: path,
      debug: true
    )
  end



gitCommitAndPush() 에서 해당 소스코드를 원격 저장소에 푸시한다.

def gitCommitAndPush()
    git_commit(
      path: ENV['GIT_PATH'],
      message: prompt(text: "커밋 메세지를 입력해주세요")
    )
    push_to_git_remote(
      remote: "origin",
      local_branch: "your local brach",
      remote_branch: "your remote branch"
    )
 end



잘 짜여졌다고는 할 수 없지만
그래도 반복되는 작업을 자동화할 수 있다는 것에
큰 기쁨을 느낀다!
내가 여러 자료를 보며 많은 도움을 받았듯이
누군가에게도 내 글이 도움이 되었으면 좋겠다 ㅜ_ㅜ
더 나은 글을 쓰기 위해 더 많이 공부해야겠다!


References

아래 글을 참고하여 작성 되었습니다.
https://docs.fastlane.tools/
https://f2janyway.github.io/android/fastlane/wsl/android-fastlane-auto-deploy/
https://www.vertica.dk/viden/automated-android-deployment-with-fastlane-on-windows/
https://dongsik93.github.io/til/2022/03/18/til-android-fastlane-2/
https://dev-yakuza.posstree.com/ko/react-native/fastlane/#%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EC%9A%A9-%EC%8B%A4%ED%96%89-%ED%8C%8C%EC%9D%BC-%EC%88%98%EC%A0%95
https://oliveyoung.tech/blog/2021-07-15/Automatic-Distribution-AOS-Test-App-To-Fastlane/
https://jiseobkim.github.io/tool/2019/04/28/Tool-FastLane-Lane-%EC%82%AC%EC%9A%A9%EB%B2%95.html
https://firebase.google.com/docs/app-distribution/android/distribute-fastlane#step_3_set_up_your_fastfile_and_distribute_your_app

728x90
반응형

prev article thumbnail image
이전 글 추천
Android Jetpack Compose 맛보기
2022.07.03
next article thumbnail image
다음 글 추천
LeakCanary 사용하기
2022.08.07
복사했습니다!