Fastlane에서 ReactNative 배포 자동화 (ios)

수동 작업 자동화



ReactNative로 만든 앱을 내부 테스트(TestFlight)할 때 수동으로 MyApp로 올리는 곳을 Fastlane를 사용하여 자동화합니다.
android판은 이쪽↓
Fastlane에서 ReactNative 배포 자동화 (android)

Fastlane 설치



ios 폴더로 이동합니다.
그리고 Gemfile를 만듭니다. (Fastlane은 Ruby로 만든 도구입니다)
sudo gem install bundler
cd ios
bundle init
Gemfile 에 다음을 추가합니다.

Gemfile
gem "fastlane"
Fastlane 설치를 위해 업데이트합니다.
bundle update

MyApp 만들기



앱을 업로드할 MyApp 만들기를 Fastlane에서 실행합니다.
bundle exec fastlane produce

질문에 대답합니다.

// Apple IDの入力
Your Apple ID Username:[email protected]
Multiple teams found on the Developer Portal, please enter the number of the team you want to use:
// Teamを選択
1) ****** "HOGEHOGE INC." (Company/Organization)
2) ****** "YourStand, inc." (Company/Organization)
1
// Bundle IDの入力
App Identifier (Bundle ID, e.g. com.krausefx.app):
com.hogehoge.app
// アプリ名
-> check the general at ios/ReactNativePlatform.xcodeproj
App Name: テスト
-> you can choose any name
1) "HOGEHOGE INC." (11111111)
2) "YourStand, inc." (2222222)
1

입력이 완료되면 Apple developer의 MyApp에 App Name에 지정한 이름의 프로젝트가 생성됩니다.

Fastlane 초기화


bundle exec fastlane init

질문에 대답합니다.
1. 📸  Automate screenshots
2. 👩‍✈️  Automate beta distribution to TestFlight
3. 🚀  Automate App Store distribution
4. 🛠  Manual setup - manually setup your project to automate your tasks
? 3
1. ReactNativePlatform-tvOS
2. ReactNativePlatform
? 2
[18:35:26]: Apple ID Username:
[email protected]
Multiple App Store Connect teams found, please enter the number of the team you want to use:
1) ****** "HOGEHOGE INC." (Company/Organization)
2) ****** "YourStand, inc." (Company/Organization)
1
Multiple teams found on the Developer Portal, please enter the number of the team you want to use:
1) "HOGEHOGE INC." (11111111)
2) "YourStand, inc." (2222222)
1
[18:39:54]: Would you like fastlane to manage your app's metadata? (y/n)
y

현재 위치에 fastlane 폴더가 있습니다.

rating 만들기


ios/fastlane/Deliverfile 를 작성해, 이하를 기술합니다 (앱에 의해, 숫자는 변경해 주세요)

Deliverfile
{
    "CARTOON_FANTASY_VIOLENCE": 0,
    "REALISTIC_VIOLENCE": 0,
    "PROLONGED_GRAPHIC_SADISTIC_REALISTIC_VIOLENCE": 0,
    "PROFANITY_CRUDE_HUMOR": 0,
    "MATURE_SUGGESTIVE": 0,
    "HORROR": 0,
    "MEDICAL_TREATMENT_INFO": 0,
    "ALCOHOL_TOBACCO_DRUGS": 0,
    "GAMBLING": 0,
    "SEXUAL_CONTENT_NUDITY": 0,
    "GRAPHIC_SEXUAL_CONTENT_NUDITY": 0,
    "UNRESTRICTED_WEB_ACCESS": 0,
    "GAMBLING_CONTESTS": 0
  }

fastfile 편집


ios/fastlane/Fastfile 를 아래와 같이 편집합니다. hogehogeapp 부분은 앱 이름에 따라 달라집니다.
default_platform(:ios)

platform :ios do
  // descは説明文ですので、任意の文を挿入
  desc "Push a new release build to the App Store"
  // releaseに関する設定
  lane :release do
    // build番号をfastlane実行の度に自動で上げる
    increment_build_number(xcodeproj: "hogehogeapp.xcodeproj")
    match(type: "appstore")
    build_app(scheme: "hogehogeapp")
    upload_to_app_store(
      skip_waiting_for_build_processing: true
    )
    clean_build_artifacts
  end

  // testflightに関する設定
  desc "Push a new release build to TestFlight"
  lane :beta do
    increment_build_number(xcodeproj: "hogehogeapp.xcodeproj")
    match(type: "appstore")
    build_app(scheme: "hogehogeapp")
    upload_to_testflight(
      skip_waiting_for_build_processing: true
    )
    clean_build_artifacts
  end
end

cocoapods를 사용하는 경우


.xcworkspace 를 사용하고 있는 전제로 fastfile 을 실행하고 싶은 경우, pod install 를 실시하는 코드와 build_app 의 기술을 재기록하는 것으로 대응할 수 있습니다.
default_platform(:ios)

platform :ios do
  desc "Push a new release build to the App Store"
  lane :release do
    # increment機能は.xcworkspaceには使用できないため削除
    # increment_build_number(xcodeproj: "hogehoge.xcodeproj")
    match(type: "appstore")
    # pod installの実行
    cocoapods
    # workspaceを追加
    build_app(workspace: "hogehoge.xcworkspace", scheme: "hogehoge")
    upload_to_app_store(
      skip_waiting_for_build_processing: true
    )
    clean_build_artifacts
  end

  desc "Push a new release build to TestFlight"
  lane :beta do
    # increment機能は.xcworkspaceには使用できないため削除
    # increment_build_number(xcodeproj: "hogehoge.xcodeproj")
    match(type: "appstore")
    # pod installの実行
    cocoapods
    # workspaceを追加
    build_app(workspace: "hogehoge.xcworkspace", scheme: "hogehoge")
    upload_to_app_store(
      skip_waiting_for_build_processing: true
    )
    clean_build_artifacts
  end
end

또한 gemfile에 대한 설명을 추가합니다.

Gemfile
gem "fastlane"
gem 'cocoapods'

인증서 만들기



ios 배포를 fastlane에서 구현하는 경우 사전에 인증서 관련을 github에 저장하고 실행할 때마다 리포지토리를 참조하게 됩니다.
먼저 Github에 임의의 리포지토리를 private로 만듭니다 (public는 더 이상 사용되지 않습니다).

다음으로 다음 명령을 입력하십시오.
bundle exec fastlane match init

질문에 대답합니다.
[19:04:30]: fastlane match supports multiple storage modes, please select the one you want to use:
1. git
2. google_cloud
? 1
[19:05:12]: URL of the Git Repo:-> 作成したrepositoryのgit cloneアドレス(SSHの方)

ios/fastlane/Matchfile 가 작성되어 이전에 답변한 github 등의 정보가 기재되어 있습니다.
그런 다음 인증서를 만들고 repository에 저장합니다.
bundle exec fastlane match development

Github 비밀번호를 입력합니다.
Passphrase for Git Repo: ******

오류 발생



인증서가 제한 수를 초과하고 오류가 발생할 수 있습니다.
[!] Could not create another Development certificate, reached the maximum number of available Development certificates.

이 경우 이미 만료된 인증서를 삭제하고 용량을 열어야 하므로 nuke 명령을 실행합니다.
공식 문서 설명↓
Nuke
bundle exec fastlane match nuke development
bundle exec fastlane match nuke appstore

Xcode의 설정


general 로 이동합니다.
- Automatically manage signing 의 체크를 해제한다.
- Signing (Debug)은 match Development ...- Signing (Release)은 match Appstore ...
tests 에 대해서도 아래와 같이 변경합니다.
Signing(Debug)
- Signing Certificate: iOS Developer

Signing (Release)
- Signing Certificate: iOS Distribution

Build settings 로 이동하여 code signing identity 를 검색합니다.
아래와 같이 편집
- Debug는 iOS Developer
- Release는 iOS Distribution


프로젝트 이름/info.plist로 이동합니다.
아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 열 추가 → ITSAppUsesNonExemptEncryption를 추가합니다.
입력하면 아래와 같이 App Uses Non-Exempt Encryption 로 바뀝니다.


앱의 아이콘 이미지도 설정합니다.


스크린샷 삽입


ios/fastlane/screenshots 에 업로드할 스크린샷을 저장합니다.

앱을 MyApp에 배포



다음 명령 실행
bundle exec fastlane beta

종료 후 MyApp로 이동하면 앱이 testflight에 올라갑니다.

Bitrise에 통합



CI 도구 Bitrise를 사용하면 github에 푸시 할 때 자동으로 fastlane을 실행할 수 있습니다.
자세한 내용은 아래로↓
Fastlane 명령을 Bitrise에 통합 (ios,ReactNative)

좋은 웹페이지 즐겨찾기