ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • fastlane으로 Firebase App Distribution 자동화 🤖
    Fastlane 2024. 1. 15. 07:05

    안녕하세요. 그린입니다 🍏
    이번 포스팅에서는 fastlane을 이용해서 Firebase App Distribution을 사용하여 앱을 자동 배포하는 방법에 대해 알아볼께요 🙋🏻

     

    우선 이전 포스팅인 Firebase App Distribution으로 앱 배포하기 포스팅을 먼저 보고 오시는것이 도움이 됩니다ㅎㅎ

     

    Firebase App Distribution으로 앱 배포하기

    안녕하세요. 그린입니다 🍏 이번 포스팅에서는 Firebase App Distribution을 이용해 앱을 배포하는 방법에 대해 알아보겠습니다 🙋🏻 그럼 우선 Firebase App Distribution이 뭔지부터 알고 갈까요? Firebase Ap

    green1229.tistory.com

     

    또한 호옥시나 fastlane이 어떤건지 어떻게 설치하는지가 궁금하시면 아래 포스팅이 도움이 됩니다 😃

     

    fastlane으로 Debug / Release 빌드 자동 배포하기

    안녕하세요. 그린입니다🟢 이번 포스팅에서는 fastlane으로 iOS App을 자동으로 배포하는 방법에 대해 알아보겠습니다🙌 우선 기존에 CI/CD툴을 쓰지 않았다면 Xcode에서 아카이브하여 App Store Connect

    green1229.tistory.com

     

    이전 Firebase App Distribution으로 앱 배포하기 포스팅에서 나온 느낀점은 너무 할게 많다였습니다.

    프로젝트를 아카이빙하고 ipa 파일을 추출하고 이 ipa 파일을 firebase 콘솔에 업로드해야하고 등등...

    번거롭죠?

     

     

    그렇기에 fastlane으로 이 과정들을 자동화하면 아주 편할것 같지 않나요!?

     

    자 그럼 이제 본격적으로 fastlane과 Firebase App Distribution을 접목해볼까요?


    fastlane을 이용한 Firebase App Distribution 사용하기

    1️⃣ Firebase app distribution 플러그 인 설치하기

    가장 먼저 해당 플러그인을 fastlane에서 사용할 수 있도록 설정해줘야 합니다.

    그러기 위해서 여러 방법이 있겠지만, 저는 fastlane과 같은 계층에서 Gemfile을 이용하여 fastlane의 의존성을 관리해줄거에요.

     

    Gemfile을 만들고 아래 코드를 작성해줍니다.

    source "https://rubygems.org"
    
    gem "fastlane"
    
    plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
    eval_gemfile(plugins_path) if File.exist?(plugins_path)

     


    2️⃣ fastlane 폴더에서 Pluginfile 설정하기

    이제 fastlane 폴더에서 Pluginfile을 생성 및 코드 작성을 해줘서 여기서 플러그인을 관리합니다.

    gem 'fastlane-plugin-firebase_app_distribution'

     

    요렇게 넣어주면 됩니다.

     


    3️⃣ Fastfile에서 Firebase app distribution 명령 코드 구성하기

    이제 마지막으로 Fastfile에서 Firebase app distribution을 사용할 수 있게 플러그인이 설치되어 있기에, 자유롭게 앱 배포할 수 있도록 명령 코드들을 작성해주면 됩니다!

     

    저는 아래의 방식으로 진행해봤어요.

     

    lane :dev do
      desc "DEV"
    
      😃 환경 변수 사용
      setup_envs(".env.dev", ENV['FASTLANE_LANE_NAME'].to_s.upcase)
    
      😃 프로젝트 생성 (Tuist 이용)
      generate_projects()
    
      😃 구글 클라우드 서비스 크리덴셜 준비
      p_prepare_credentials
      
      😃 프로젝트 앱 빌드
      p_build_and_package_app
       
      😃 파이어베이스 앱 배포
      p_upload_to_firebase_app_distribution
    end

     

    자 이건 실제 fastlane dev 처럼 명령어를 넣어서 저 안에 있는 명령들을 순차적으로 돌려주는 껍데기입니다!

     

    이제 저 안에 있는것들인 명령들의 구성을 살펴볼까요?

     

    그전에 저는 자주 사용될 환경 변수들을 별도 .env 파일로 관리하고 있어서 그 부분부터 한번 필요한것만 살펴보시죠!


    .env.default 파일

    해당 디폴트 파일에서는 DEV, QA, PROD 스킴별 상관없이 공통적인 환경 변수들을 넣어두는 공간입니다.

     

    ITC_TEAM_ID="12313123123"
    TEAM_ID="Adf23123123"
    
    XC_WORKSPACE="green.xcworkspace"
    XC_PROJECT="greenApp.xcodeproj"
    XC_INCLUDE_SYMBOLS=true
    XC_INCLUDE_BITCODE=false
    XC_SDK="iphoneos"
    XC_DESTINATION="generic/platform=iOS"
    XC_XCARGS="-allowProvisioningUpdates"

     

    뭐 대략적으로 이런식으로 저는 구성되어 있는데, 각자 상황에 맞게 추가, 수정해서 구성해도 될것 같아요ㅎㅎ

    (오늘의 핵심이 아니기에, 빠르게 넘어갑니다!)

     

    그리고 다음으로 두가지 환경 파일들이 더 존재합니다.


    .env.dev

    일단 dev, qa, prod 별로 환경 변수들이 다르기에 각자 다르게 구분해뒀지만, 지금은 테스트 앱을 배포하는것이니 dev 파일만 살펴보시죠!

     

    APP_IDENTIFIER="com.green.app.dev"
    APPLE_ID="green@gmail.com"
    
    XC_TARGET="Dev-greenApp"
    XC_SCHEME="Dev-green"
    XC_CONFIGURATION="Debug"
    XC_EXPORT_METHOD="development"
    
    😃 파이어베이스 관련 환경 변수
    FIREBASE_APP_ID="2:343434:ios:aa2343243"
    FIREBASE_APP_DIST_GROUPS="green-tester"

     

    여기서 중요한건 파이어베이스 관련 환경 변수일것 같아요.

    dev 파이어베이스에 앱 아이디와 배포를 해서 테스트할 테스터 그룹을 지정해줍니다.

     


    .env.secret

    파이어베이스 관련 시크릿 키같은 경우 별도로 관리해줘요.

    추후 프로덕트 빌드는 앱 스토어 커넥트를 이용해 배포해야하기에 그런 키들도 여기 같이 넣어 관리합니다!

     

    GOOGLE_CLOUD_SERVICE_CREDENTIALS="greenblabla"
    APP_STORE_CONNECT_API_KEY_KEY_ID="keykey"
    APP_STORE_CONNECT_API_KEY_ISSUER_ID="IDID"
    APP_STORE_CONNECT_API_KEY_KEY_CONTENT="blabla"

     

    요정도면 일단 환경 변수 파일들 설정 끝!

     

    이제 다시 Fastfile로 가서 하나씩 살펴보죠ㅎㅎ


    setup_env

    def setup_envs(env, envDir)
      Dotenv.load env
    
      # workspace 디렉토리
      ENV['WORKSPACE_DIR'] = File.expand_path("../..", Dir.pwd)
       
      # .xcworkspace 디렉토리
      ENV['XC_WORKSPACE_DIR'] = File.join(ENV['WORKSPACE_DIR'], ENV['XC_WORKSPACE'])
    
      # Project 디렉토리
      ENV['PROJECT_DIR'] = File.expand_path("..", Dir.pwd)
      
      # Project Resources 디렉토리
      ENV['PROJECT_RESOURCES_DIR'] = File.join(ENV['PROJECT_DIR'], 'Resources', envDir)
      
      # Project XCConfigs 디렉토리
      ENV['PROJECT_XCCONFIGS_DIR'] = File.join(ENV['PROJECT_DIR'], 'xcconfigs')
    
      # Tuist 디렉토리
      ENV['TUIST_DIR'] = File.join(ENV['WORKSPACE_DIR'], 'Tuist')
      
      # Tuist Managed SPM(SwiftPackageManager) 디렉토리
      ENV['TUIST_MANAGED_SPM_DIR'] = File.join(ENV['TUIST_DIR'], 'Dependencies', 'SwiftPackageManager')
        
      # Google Service Info Plist 파일
      ENV['GOOGLE_SERVICE_INFO_PLIST_FILE'] = File.join(ENV['PROJECT_RESOURCES_DIR'], 'GoogleService-Info.plist')
      
      # Outputs 디렉토리
      ENV['OUTPUTS_DIR'] = File.join(ENV['PROJECT_DIR'], 'Outputs')
     
      # Archives 디렉토리
      ENV['ARCHIVES_DIR'] = File.join(ENV['OUTPUTS_DIR'], 'Archives', envDir)
    
      # Credentials 디렉토리
      ENV['CREDENTIALS_DIR'] = File.join(ENV['OUTPUTS_DIR'], 'Credentials', envDir)
      
      # Google Cloud Service Credentials 파일
      ENV['GOOGLE_CLOUD_SERVICE_CREDENTIALS_FILE'] = File.join(ENV['CREDENTIALS_DIR'], 'google_cloud_service_credentials.json')
       
      # App Store Connect API Key 파일
      ENV['APP_STORE_CONNECT_API_KEY_FILE'] = File.join(ENV['CREDENTIALS_DIR'], 'app_store_connect_api_key.p8')
    
      # 버전 번호
      ENV['VERSION_NUMBER'] = get_xcconfig_value(path: "#{ENV['PROJECT_XCCONFIGS_DIR']}/green.shared.xcconfig", name: 'MARKETING_VERSION')
    
      # 빌드 번호
      ENV['BUILD_NUMBER'] = get_xcconfig_value(path: "#{ENV['PROJECT_XCCONFIGS_DIR']}/green.shared.xcconfig", name: 'CURRENT_PROJECT_VERSION')
    
    end

     

    좀 뭔가 많아 보이는데 각자 상황에 맞게 필요한 설정들만 해주면 됩니다!

    해당 메서드가 하는 역할은 사용될 환경 변수들을 셋팅하는거라고 보면 됩니다 😃

    우리는 이번에 파이어베이스로 배포이니 Google Service Info Plist 파일이라던지, 크리덴셜과 아키이빙 그리고 앱 빌드를 위한 워크스페이스 프로젝트 환경 변수 설정들을 유심히 보면 될것 같네요!

     

    이제 다음으로 프로젝트를 생성해야겠죠?


    generate_projects

    참고로, 저는 Tuist를 통해 프로젝트를 생성하고 있습니다.

     

    def generate_projects()
      sh(command: "tuist fetch --path \"#{ENV['WORKSPACE_DIR']}\"", log: true)
      sh(command: "tuist generate --path \"#{ENV['WORKSPACE_DIR']}\" --no-open --no-cache", log: false)
    end

     

    setup_envs에서 설정한 환경 변수들을 이용해 tuist로 프로젝트를 fetch하고 generate를 시켜주는 간단한 메서드입니다.

     

    이제 프로젝트가 생성되었으니, 앱 빌드 전 구글 클라우드 서비스 관련 크리덴셜을 준비해볼께요.


    p_prepare_credentials

    private_lane :p_prepare_credentials do |options|
      # Google Cloud Service Credentials
      sh(command: "echo #{ENV['GOOGLE_CLOUD_SERVICE_CREDENTIALS']} | base64 --decode > #{ENV['GOOGLE_CLOUD_SERVICE_CREDENTIALS_FILE']}", log: false)
    
      # App Store Connect API Key
      ENV['APP_STORE_CONNECT_API_KEY_KEY_ID'] = sh(command: "echo #{ENV['APP_STORE_CONNECT_API_KEY_KEY_ID']} | base64 --decode", log: false)
      ENV['XC_XCARGS'] = "#{ENV['XC_XCARGS']} -authenticationKeyID \"#{ENV['APP_STORE_CONNECT_API_KEY_KEY_ID']}\""
    
      ENV['APP_STORE_CONNECT_API_KEY_ISSUER_ID'] = sh(command: "echo #{ENV['APP_STORE_CONNECT_API_KEY_ISSUER_ID']} | base64 --decode", log: false)
      ENV['XC_XCARGS'] = "#{ENV['XC_XCARGS']} -authenticationKeyIssuerID \"#{ENV['APP_STORE_CONNECT_API_KEY_ISSUER_ID']}\""
    
      ENV['APP_STORE_CONNECT_API_KEY_KEY_CONTENT'] = sh(command: "echo #{ENV['APP_STORE_CONNECT_API_KEY_KEY_CONTENT']} | base64 --decode", log: false)
      sh(command: "echo #{ENV['APP_STORE_CONNECT_API_KEY_KEY_CONTENT']} | base64 --decode > #{ENV['APP_STORE_CONNECT_API_KEY_FILE']}", log: false)
      ENV['XC_XCARGS'] = "#{ENV['XC_XCARGS']} -authenticationKeyPath \"#{ENV['APP_STORE_CONNECT_API_KEY_FILE']}\""
    end

     

    크리덴셜과 앱 스토어 커넥트 API Key들 관련하여 환경 변수를 구성합니다.

     

    다음으로 이제 앱을 배포하기전에 빌드를 해야겠죠?


    p_bulid_and_package_app

    private_lane :p_build_and_package_app do |options|
      ENV['OUTPUT_FILE_NAME'] = "#{ENV['XC_TARGET']}_#{ENV['VERSION_NUMBER']}.#{ENV['BUILD_NUMBER']}.ipa"
    
      gym(
        workspace: "#{ENV['WORKSPACE_DIR']}",
        scheme: "#{ENV['XC_SCHEME']}",
        clean: true,
        output_directory: ENV['ARCHIVES_DIR'],
        output_name: ENV['OUTPUT_FILE_NAME'],
        configuration: ENV['XC_CONFIGURATION'],
        include_symbols: ENV_BOOL['XC_INCLUDE_SYMBOLS'],
        include_bitcode: ENV_BOOL['XC_INCLUDE_BITCODE'],
        export_method: ENV['XC_EXPORT_METHOD'],
        build_path: ENV['ARCHIVES_DIR'],
        buildlog_path: ENV['LOGS_DIR'],
        sdk: "#{ENV['XC_SDK']}",
        destination: "#{ENV['XC_DESTINATION']}",
        xcargs: ENV['XC_XCARGS']
      )
    end

     

    앱을 빌드하기 위한 설정들은 각자 다를 수 있으니 참고용으로 해주시고, 각자 상황에 맞게 앱을 빌드하는 구성을 녹이면 됩니다.

     

    이제 찐막으로, 앱 빌드까지 했으니 Firebase app distribution으로 배포해볼까요?


    p_upload_to_firebase_app_distribution

    private_lane :p_upload_to_firebase_app_distribution do |options|
      firebase_app_distribution(
        app: ENV['FIREBASE_APP_ID'],
        service_credentials_file: "#{ENV['GOOGLE_CLOUD_SERVICE_CREDENTIALS_FILE']}",
        groups: ENV['FIREBASE_APP_DIST_GROUPS']
      )
    end

     

    파이어베이스 플러그인을 사용하고 있으니, 제공해주는 firebase_app_distribution 메서드를 이용하면 됩니다!

    여기에 앱과 크리덴셜 파일 그리고 테스터 그룹을 넣어주면 되는것이죠ㅎㅎ

     

    간단하죠!?

     

    이제 터미널에서 fastlane dev 명령어만으로 우리는 앱을 빌드하고 파이어베이스로 앱을 배포하는 모든 과정을 여러 공수 안들이고 자동화 할 수 있게 되었습니다!

     

    다시 한번 말씀드리지만, 해당 메서드와 환경 설정들은 각자 프로젝트와 상황에 맞게 조정하셔야 합니다ㅎㅎ

    전체적인 틀로 참고하시면서 따라 보시면 좋을것 같아요 😀

     


    마무리

    fastlane 아주 참 편리하지 않씁니까!!!!!ㅋㅋㅋ

    여러 공수를 줄이고 또 실수 할 수 있는 그런 과정들을 자동화를 통해 한번 관리해보면 좋을것 같습니다.

     


    레퍼런스

     

    Beta Deployment - fastlane docs

    New to fastlane? Click here to open the installation & setup instructions first xcode-select --install # Using RubyGems sudo gem install fastlane -NV # Alternatively using Homebrew brew install fastlane fastlane init More Details iOS Beta deployment using

    docs.fastlane.tools

     

     

    fastlane을 사용하여 테스터에 iOS 앱 배포  |  Firebase App Distribution

    Google I/O 2023에서 Firebase의 주요 소식을 확인하세요. 자세히 알아보기 의견 보내기 fastlane을 사용하여 테스터에 iOS 앱 배포 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고

    firebase.google.com

Designed by Tistory.