본문 바로가기
IOS App Programming/IOS 연습

[iOS/Fastlane] Fastlane으로 배포를 해보자 - fastlane 코드 살펴보기

by B_Tori 2024. 7. 31.

default_platform(:ios)

platform :ios do
  desc "Build and distribute to Firebase App Distribution" # 해당 lane의 설명
  lane :distribute do # lane 이름과 시작점
    match(type: "adhoc") # match의 Adhoc 프로비저닝 프로파일을 가져옴

    clean_build_artifacts  # 이전 빌드 아티팩트를 정리 (클린 빌드)

    # 배포 시 빌드 타임을 기록하기 위함
    build_start_time = Time.now # 스타트 시간 기록
    UI.message("Build started at #{build_start_time}") # 빌드 시작 메시지 출력

    # 생성될 IPA 파일 이름을 현재 타임 스탬프를 이용하여 생성, 모든 ipa 이름이 겹치지 않도록 하며 배포된 ipa 버전을 관리하기 위함
    time_stamp = Time.now.strftime("%y%m%d_%H%M%S")
    ipa_file_name = "CatchMate_#{time_stamp}.ipa"

    gym(
      project: "CatchMate.xcodeproj",          # Xcode 프로젝트 파일 경로
      scheme: "CatchMate",                  # 빌드할 scheme
      output_directory: "~/Desktop/Log",     # IPA 파일을 저장할 경로
      output_name: ipa_file_name,             # 생성될 IPA 파일 이름
      export_method: "ad-hoc",  #ad-hoc 배포 방식 지정
      export_options: { # export options 설정
        provisioningProfiles: { # 프로비저닝 프로파일 설정 - 오류로 인해 직접 매칭
          ENV['PROVISIONING_PROFILES'] => ENV['MATCH_PROFILES']
        }
      }
    )

    # 빌드 끝 타임 기록
    build_end_time = Time.now
    UI.message("Build finished at #{build_end_time}")

    # 빌드 시간 계산
    build_duration = build_end_time - build_start_time
    UI.message("Build duration: #{build_duration.round(2)} seconds")

    # 빌드 시간 로그 파일에 기록
    log_directory = File.expand_path("~/Desktop/Log")
    log_file_path = File.join(log_directory, "build_times.txt")
    File.open(log_file_path, "a") do |f|
      f.puts("Build started at: #{build_start_time}")
      f.puts("Build finished at: #{build_end_time}")
      f.puts("Build duration: #{build_duration.round(2)} seconds")
      f.puts("IPA File: #{ipa_file_name}")
      f.puts("="*30)
    end

    # Upload to Firebase App Distribution
    firebase_app_distribution(
      app: ENV['FIREBASE_APP_ID'],  # Firebase App ID
      ipa_path: "/Users/bang-yubin/Desktop/Log/#{ipa_file_name}", # 업로드할 IPA 파일 경로
      firebase_cli_token: ENV['FIREBASE_TOKEN'],
      groups: "dugout-teckneck" # 테스터 그룹 지정
    )
  end
 
lane

lane 은 fastlane이 실행할 명령어 단위로 해당 배포 과정을 실행하기 위해
fastlane distribute 와 같이 사용할 수 있다.

match
  • ios의 경우 인증서 관리를 신경 써줘야 한다. 특히 협업의 경우 개발자마다 여러 인증서를 가지고 있을 수 있기 때문에 인증서를 저장소(보통 Git 리포지토리)에 안전하게 저장하고 팀 내에서 공유할 수 있도록 도와준다.

[역할]

  1. 인증서 및 프로비저닝 프로파일 생성:
  • match는 필요한 인증서와 프로비저닝 프로파일을 생성하고, 이를 지정된 저장소에 저장한다.
  1. 인증서 및 프로비저닝 프로파일 동기화:
  • match는 프로젝트에 필요한 인증서와 프로비저닝 프로파일을 동기화하기 때문에 새로운 개발자나 CI 서버에서도 동일한 인증서를 사용할 수 있게 도와준다.
  1. 보안 관리:
  • 인증서와 프로비저닝 프로파일을 암호화하여 저장소에 저장함(안전하게 프라이빗 저장소에 저장하기)으로써 보안을 유지
  • 암호화 키는 CI/CD 환경 변수나 다른 안전한 방법으로 관리해야 함
gym
  • Fastlane에서 iOS와 macOS 애플리케이션을 빌드하는 도구
  • Xcode 빌드 프로세스를 간소화하고 자동화하여 IPA 파일을 생성함
  • 이때 생성한 IPA 파일을 배포에 사용함
firebase_app_distribution

현재 테스트 앱 배포를 파이어베이스를 이용해하고 있기 때문에 해당 플러그인을 사용하였다.

  • Firebase에 앱을 배포하는 도구이다.
  • 파이어베이스에 배포하기 위한 설정 값과 IPA 파일 경로들을 입력한다.
설정 값 관리
  • 아무래도 fastlane 파일 또한 git에 올라가 다른 팀원들도 사용할 수 있도록 해야 하기 때문에 여러 설정 변수 값들에 대한 보안을 신경 써야 했다.
  • .env 파일을 설정하여 설정값들을 입력하고 gitignore에 해당 파일을 깃이 추적하지 않도록 하여 .env 파일만 따로 관리하도록 하였다.

댓글