Fastlane으로 iOS앱 배포과정을 자동화 해보았다

HyoKwangRyu·2020년 7월 5일
8
post-thumbnail

왜 또 뭐했는데🐶

제목 그대로입니다.
iOS는 사실 배포라기보다는, 심사 받기? 인것 같지만 예

저는 좋은 코드를 빨리 만드는것 뿐 아니라, 여러 포인트에서 개발 프로세스를 지금보다 더 효율적으로 만들고 싶어요

회사는 돈을 벌어야 하고, 시간이 곧 돈이지 않습니까?💸
그래서 요즘 이런걸 들쑤시고 다니고 있어요💸

사실 '서버 인프라의 배포 프로세스 개선' 을 계속 시도하다가 약간의 좌절을 겪고 쉬고 있었어요.🤷🏻‍♂️😱
자신감좀 얻으려고 비교적 간단한 앱 배포를 건드려 보기로 했습니다.
찾아보다가 바로 눈에 띈게 Fastlane 입니다.
스크립트 언어로 루비를 쓰고 있어서 마침 잘됬다고 생각했어요.

완성하고 잘 동작하는지 테스트 하는데 까지 2~3시간 정도 든것 같습니다.

기존의 배포(심사 요청)과정

  • 버전과 빌드를 올린다.
  • 빌드하고, 필요시 cocoapods 를 업데이트하거나 인스톨한다.
  • 3인 이상의 개발자가 동시에 개발할 경우, 1년에 한번씩 프로파일과 인증서를 - 발급받고 공유한다.(저희는 3명이라 해당 사항 없었읍니다)
  • 테스트 코드 실행(물론 해당사항 없음)
  • 애널라이즈 실행하고 기다림
  • 아카이브 실행하고 기다림
  • 아카이브 다 되면 앱스토어커넥트에 업로드
  • 심사 요청, 심사 통과하면 체인지로그 작성후 스토어 출시
  • slack에 배포가 완료되었음을 공유

별거 없습니다. 귀찮아서 그렇지💡
그럼에도 시도해 봤습니다. 어제보다 1%라도 나아가면 좋잖아요?

Setup

xcode-select --install

fastlane은 엑스코드의 커맨드라인 툴을 이용합니다.

# Using RubyGems
sudo gem install fastlane -NV

# Alternatively using Homebrew
brew install fastlane

fastlane 설치

fastlane init

프로젝트의 루트 디렉토리에서 명령을 실행 합니다.

실행 하면 여러 메시지가 뜹니다.

[14:55:39]: What would you like to use fastlane for? 
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

fastlane을 이용하면 여러 작업을 자동화 할 수 있습니다.
이번에는 3번을 선택해 앱스토어 배포 자동화만 해볼게요👀

3번 실행후, 애플아이디 로그인 요청 메시지가 뜨면 로그인 해주세요.

혹시 속하신 팀이 여럿이면, 잘 선택해 주시구

[16:45:25]: ✅  Logging in with your Apple ID was successful
[16:45:25]: Checking if the app 'yoyoyo' exists in your Apple Developer Portal...
[16:45:26]: It looks like the app 'yoyoyo' isn't available on the Apple Developer Portal
[16:45:26]: for the team ID 'my-team-id' on Apple ID 'my-mail'
[16:45:26]: Do you want fastlane to create the App ID for you on the Apple Developer Portal? (y/n)

요런 메시지가 뜨면 엔터치십쇼

초기화가 완료 되면, 여러 파일이 생성되어 있을텐데

.gitignore

를 통해 적절히 관리해 주시면 됩니다.

  • Gemfile
  • Gemfile.lock
  • fastlane/Appfile
  • fastlane/Fastfile

네 가지 파일은 리모트에 같이 올려주세요!

Appfile

app_identifier("your.app.identifier") # The bundle identifier of your app
apple_id("your-apple-id") # Your Apple email address

itc_team_id("your-team-id") # App Store Connect Team ID
team_id("your-portal-team-id") # Developer Portal Team ID

fastlane/Appfile

요런 파일이 생겨있을 겁니다.
메소드들의 인자에 자동으로 값이 들어가 있을거에요.

그런데 저희팀은 개발자들이 애플아이디 1개를 공유하면서 쓰는게 아니라
각자의 계정을 사용하고 있습니다.
각자가 배포를 할때마다 your-apple-id를 계속 바꿔야 하면 불편하잖아요?
그래서 이것을 .env 를 이용해 환경변수로 관리하려 합니다.
하는김에 4가지 값 모두 환견병수로 관리하는게 좋겠네요.

.env

fastlane에는 기본적으로 .env 를 쓸 수 있도록 라이브러리에 포함되어있습니다.
Gemfile.lock파일을 확인해 보시면 찾을 수 있습니다.

vim ./fastlane/.env

저 디렉토리에 .env 파일을 만들어 주세요

APP_IDENTIFIER="your.app.identifier"
APPLE_ID="my-apple-id@email.com"
...

저장해 주시면 끗.

이제 Appfile을 수정합시다.

app_identifier(ENV["APP_IDENTIFIER"]) # The bundle identifier of your app
apple_id(ENV["APPLE_ID"]) # Your Apple email address
...

fastlane/Appfile

Fastfile

실제 커맨드 명령들을 만드는 파일입니다.


default_platform(:ios)

platform :ios do
  desc "Push a new release build to the App Store"
  lane :release do
    get_certificates
    get_provisioning_profile
    cocoapods(use_bundle_exec: false)
    build_app(workspace: "jasoseol.xcworkspace", scheme: "jasoseol")
    upload_to_app_store(skip_metadata: true, skip_screenshots: true)
    version = get_version_number
    send_slack({"version": version })
  end

  lane :send_slack do |options|
    slack(
      message: "앱이 App Store Connect에 성공적으로 업로드 되었습니다.",
      channel: "#deploy",
      slack_url: ENV["SLACK_WEBHOOK_URL"],
      payload: {
        "Version": options[:version]
      }
    )
  end
end

./fastlane/Fastfile

일단 코드 먼저 봅시다
루비코드인데, 루비를 모르더라도 메소드 이름이나 구조가 간단하게 되어있어 쉽게 이해하실 수 있습니다.

원래 fastlane 명령어는

$ fastlane ios release

이런식으로 사용하는데,
default_platform(:ios)
디폴트 플랫폼을 설정했기 때문에

$ fastlane release

로 쓸 수 있게 됩니다.

메소드

get_certificates
get_provisioning_profile

인증서, 프로비져닝 파일 가져오는 메소드입니다.

저희는 각 개발자가 본인 맥에 배포관련 인증서를 가지고 있기 때문에, 이 방법을 이용했습니다.

인증서를 공유하여 쓰시는 분들은 fastlane의 match라는 것을 이용하세요🤷🏻‍♂️
프라이빗 리포에 인증서 파일들을 올려두고 이용하는 방식?으로 기억합니다.

cocoapods(use_bundle_exec: false)

저희는 코코아팟을 이용하기 때문에, 빌드 전 pod install을 해주도록 했습니다.

build_app(workspace: "jasoseol.xcworkspace", scheme: "jasoseol")

앱을 빌드하는 메소드 입니다.

upload_to_app_store(skip_metadata: true, skip_screenshots: true)

빌드가 성공하면, 앱스토어에 업로드하는 메소드 입니다.

version = get_version_number
send_slack({"version": version })

현재 버젼을 아마도 Info.plist에서 읽어오고 슬랙 메시지를 보내줍니다.

  lane :send_slack do |options|
    slack(
      message: "앱이 App Store Connect에 성공적으로 업로드 되었습니다.",
      channel: "#deploy",
      slack_url: ENV["SLACK_WEBHOOK_URL"],
      payload: {
        "Version": options[:version]
      }
    )
  end

슬랙으로 메시지 보내기. 이미 템플릿이 잘 만들어져있어 그냥 이용하면 됩니다!

마무리 🙉

마무리 전까지 다 작성해 놓고 임시저장만 한지 일주일 째..
어떤 말로 마무리 하려했었는지 까먹었어요 ㅋㅋㅋ

아무튼 조금이라도 더 편하게 개발하기 위해 움직였던것 같습니다.
fastlane으로 빌드와 업로드 자동화를 이루었지만, 결국 로컬 맥에서 돌리는거라 다른 브랜치에서 코드를 작성한다던지 하는게 안되는것 같아요..

나중에 빌드하는 작업을 가상 환경에서 돌릴 수 있다면, 좀 더 나은 환경이 될지도? 모르겠네요📈

요즘은 자소설 웹서비스를 도커라이징 해보고 있는데 쉽진 않은것 같아요 ㅋㅋㅋ큐
곧 포스팅 주제로 삼을 수 있도록 계속 시도해보겠습니다🍀

profile
Backend Developer

0개의 댓글