Fastlane

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

GREEN.1229 2022. 1. 23. 09:12

안녕하세요. 그린입니다🟢

이번 포스팅에서는 fastlane으로 iOS App을 자동으로 배포하는 방법에 대해 알아보겠습니다🙌

 

우선 기존에 CI/CD툴을 쓰지 않았다면 Xcode에서 아카이브하여 App Store Connect 사이트에 올리는 과정을 거쳤습니다.

이런 부분에서 버전이나 제약들을 테스트 및 검증하지 못하고 올라갈 경우가 많았어요.

이에 저는 fastlane이라는 도구를 활용해 자동 배포하는 과정에서 여러 조건을 체크해보고 이상없음을 확인 후 올리는 일련의 과정들을 자동으로 진행해볼까 해서 알아보고 포스팅하게 되었습니다💁🏻
(물론 현업에서도 도입되어 사용하고 있습니다👍)

fastlane이 뭐야?

그러게요. fastlane이 뭘까요?

우선 마크부터 신박하네요ㅋㅋ

fastlane은 iOS 및 Android 앱용 베타 배포 및 릴리스를 자동화하는 아주 유용한 툴입니다.

스크린샷 생성, 코드 서명 처리, 애플리케이션 릴리스와 같은 모든 일련의 작업들을 해줄 수 있습니다.

특히 자주 저는 사용하는건 테스트플라이트 버전닝과 .dSYM 자동 업로드 등을 이용합니다🤭

뭐 그래서 정리하자면 배포를 더 편리하게 도와준다~ 라고 요약할 수 있겠습니다!

fastlane 설치

저는 homebrew로 설치해보겠습니다.

설치를 원하는 프로젝트 디렉토리로 가서 아래 명령어를 입력합니다.

brew cask install fastlane

만약 관리자 권한 필요하다 어쩌고 하면 앞에 sudo를 붙여주면 됩니다.

(sudo가 무슨 거의 만능 코드... 하긴 관리자 권한을 가져오는거니까..뭐.. 예..!)

fastlane 초기 설정

프로젝트 디렉토리에서 fastlane을 초기화 해줘야합니다.

아래 명령어를 입력합니다.

fastlane init

그러면 이 패스트레인을 어디 사용할건지 물어봐요.

전 테스트플라이트에 올리고 자체 검수하고 심사요청/출시를 진행할거라 2번 항목을 선택했습니다.

이건 나중에 설정을 바꿀 수 있으니 크게 고려는 안해도됩니다🤭

그러면 경우에따라 애플 계정을 입력하라는 과정이 나오는데 이는 알아서 맞게 입력해주시면 됩니다!

fastlane 상세 설정

위 초기 설정을 끝냈다면 프로젝트 디렉토리에 fastlane 폴더가 아래같이 생겨요..!

여기서 중요한건 Fastfile입니다.

여기서 상세적으로 원하는 설정들을 해줄거에요..!

저는 목표가 프로젝트를 Debug와 Release 스킴으로 나눴고 이를 각각 혹은 같이 배포할 수 있도록

fastlane 명령어를 통해 원하는 동작을 해주고 싶어요.

무슨말이냐면 테스트 빌드와 프로덕트 빌드를 골라서 테스트플라이트에 업로드하거나 배포하려해요.

추가로 두개 모두 한 명령어로 다 테스트플라이트 업로드 혹은 배포 시키고 싶습니다.

왜 필요하냐면 QA를 위해 프로덕트 빌드에서 해볼 수 없으니 테스트 빌드도 다운받아 해볼 수 있어야겠어요.

그럼 거두절미하고 스크립트를 간단히 보면서 설정해봅시다!

platform :ios do
  // Dev + Product 빌드 모두 업로드
  desc "Push a new beta build to TestFlight"
  lane :beta do
    bump_type = prompt_version_bump_type()
    bump_version(bump_type)
    new_build_number = number_of_commits()
    increment_build_number(build_number: new_build_number)
    commit_version_bump(
      message: ":bookmark: v#{get_version_number()}-#{new_build_number}",
      xcodeproj: "Green.xcodeproj",
      include: %w[Green.xcodeproj/project.pbxproj Green/Info.plist Green.xcworkspace/xcshareddata],
      ignore: /vendor/
    )
    update_app_identifier(
      xcodeproj: "Green.xcodeproj",
      plist_path: "Green/Info.plist",
      app_identifier: "com.Green-dev"
    ) 
    build_app(
      workspace: "Green.xcworkspace",
      scheme: "Green-dev",
      xcargs: "-allowProvisioningUpdates"
    )
    upload_to_testflight(skip_waiting_for_build_processing: true)
    update_app_identifier(
      xcodeproj: "Green.xcodeproj",
      plist_path: "dGreen/Info.plist",
      app_identifier: "com.Green"
    ) 
    build_app(
      workspace: "Green.xcworkspace",
      scheme: "Green",
      xcargs: "-allowProvisioningUpdates"
    )
    upload_to_testflight()
    download_dsyms(version: get_version_number(), build_number: new_build_number.to_s)
    upload_dsym(get_version_number(), new_build_number)
  end
  
  // Product 빌드만 업로드
  desc "Push a new production build to TestFlight"
  lane :prod do
    bump_type = prompt_version_bump_type()
    bump_version(bump_type)
    new_build_number = number_of_commits()
    increment_build_number(build_number: new_build_number)
    commit_version_bump(
      message: ":bookmark: v#{get_version_number()}-#{new_build_number}",
      xcodeproj: "Green.xcodeproj",
      include: %w[Green.xcodeproj/project.pbxproj Green/Info.plist Green.xcworkspace/xcshareddata],
      ignore: /vendor/
    )
    update_app_identifier(
      xcodeproj: "Green.xcodeproj",
      plist_path: "Green/Info.plist",
      app_identifier: "com.Green"
    ) 
    build_app(
      workspace: "Green.xcworkspace",
      scheme: "Green",
      xcargs: "-allowProvisioningUpdates"
    )
    upload_to_testflight()
    download_dsyms(version: get_version_number(), build_number: new_build_number.to_s)
    upload_dsym(get_version_number(), new_build_number)
  end

  // Dev 빌드만 업로드
  desc "Push a new dev build to TestFlight"
  lane :dev do
    bump_type = prompt_version_bump_type()
    bump_version(bump_type)
    new_build_number = number_of_commits()
    increment_build_number(build_number: new_build_number)
    commit_version_bump(
      message: ":bookmark: v#{get_version_number()}-#{new_build_number}",
      xcodeproj: "Green.xcodeproj",
      include: %w[Green.xcodeproj/project.pbxproj Green/Info.plist Green.xcworkspace/xcshareddata],
      ignore: /vendor/
    )
    update_app_identifier(
      xcodeproj: "Green.xcodeproj",
      plist_path: "Green/Info.plist",
      app_identifier: "com.Green-dev"
    ) 
    build_app(
      workspace: "Green.xcworkspace",
      scheme: "Green-dev",
      xcargs: "-allowProvisioningUpdates"
    )
    upload_to_testflight()
    download_dsyms(version: get_version_number(), build_number: new_build_number.to_s)
    upload_dsym(get_version_number(), new_build_number)
  end
 end

총 3개로 나눴습니다.

1. Dev + Prod 빌드 모두 동시 업로드

fastlane beta 명령어로 실행 시 타입과 버전을 체크 테스트하고 빌드 버전을 커밋수대로 하나 올립니다.

그 다음 중요한 부분이 3가지 입니다.

update_app_identifier() 명령으로 앱 스토어 커넥트 사이트에서 만들어진 앱 즉 dev와 prod 앱에 각각 매칭을 위해

앱 식별자를 업데이트 해줍니다.

그래서 먼저 dev 빌드를 앱 식별자를 업데이트 해주고 build_app() 명령을 통해 프로젝트에서 스킴을 나눴던거에서

dev 스킴을 넣어줍니다.

그리고 여기서 중요한것이 테스트 플라이트 업로드 명령어인 upload_to_testflight() 명령을 주는데 안에 아무 조건을 넣지 않으면

무한정 빌드 및 업로드 되는 과정을 계속 기다려야해서 너무 오래걸립니다...

그렇기에 skip_waiting_for_build_processing을 true로 조건을 안에 주어 빌드 과정은 생략하고 다음 명령으로 넘어가게 합니다.

그러면 동일한 순서로 앱 식별자를 prod로 바꾸고 테스트플라이트에 업로드하고 다 이뤄지면 dSYM을 다운하고 업로드하는 명령을 수행하게 됩니다.

이로써 dev와 prod에 동시 업로드가 가능합니다!

2. Dev 빌드만 업로드

위와 동일한거에서 prod만 빠졌습니다.

dev 빌드만 업로드 됩니다.

3. Prod 빌드만 업로드

2번의 설명과 같습니다.

prod 빌드만 업로드 됩니다.

fastlane 사용

위 상세 설정까지 끝냈으면 이제 프로젝트 디렉토리 터미널에서 아래 명령어들로 동작 시켜줄 수 있습니다.

fastlane beta
fastlane dev
fastlane prod

너무 쉽죠?

위 3개중 원하는 동작의 명령어를 해주시면 쭈욱~~ 진행됩니다!

마무리

아직 정말 fastlane의 기초 중 기초밖에 못 알아봤어요.

이정도로 충분하진 않지만 시작이 반이니까..!

반은 했네요😀

아직 저도 fastlane 어린이기에.. 카테고리를 이참에 새로 파봤고 더 많은 포스팅을 해나가려합니다💪

[참고자료]

https://docs.fastlane.tools

 

fastlane docs

fastlane fastlane is the easiest way to automate beta deployments and releases for your iOS and Android apps. 🚀 It handles all tedious tasks, like generating screenshots, dealing with code signing, and releasing your application. You can start by creati

docs.fastlane.tools