핀수로그
  • fastlane 으로 Android 앱 배포 쉽게 하기 (feat. windows)
    2022년 07월 05일 23시 40분 38초에 업로드 된 글입니다.
    작성자: 핀수
    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
    반응형
    댓글