iOS 개발 도우미, Fastlane을 간단히 써봤다.

지난 2주간 테스트를 짜봤으니 이제 이걸 어떻게 써먹을지 고민해봤다. 테스트가 잘 되면 이제 CI 같은걸 고민 할 수 있을 것 같다. 하지만 iOS의 경우 배포도 그렇고 CI 서버가 Mac 이어야 해서 외부 서비스를 사용하기에는 너무 비쌌다. 그래서 고민을 좀 하다가 Fastlane 을 제대로 써보자는 생각으로 사용해봤다. 엄밀히 말하자면 테스트 시리즈에는 안 맞는것 같지만.

Fastlane?

Fastlane은 Beta 버전 또는 앱 스토어 배포를 쉽게 해주는 배포 자동화 툴인데, CI 서버가 하는 일부 기능들을 갖추고 있어서 굳이 CI 서버를 따로 써야 하나 하는 기분이 들기도 한다.

Fastlane 으로 할 수 있는 일은 정말 많은데, 이 많은 일들을 Lane으로 만들어서 순차적으로 진행시켜 준다. 그래서 빌드 전에 수행해야 하는 테스트라던가 CocoaPods 라이브러리 인스톨, TestFlight 업로드 등 여러가지 작업을 한번의 커맨드로 실행할 수 있게 해주는 것이다.

설치 및 초기화

Fastlane 은 Ruby로 짜여져 있어서 Gem을 설치하면 사용할 수 있다. 또는 맥 패키지 관리자인 Homebrew로 설치가 가능하다.

$ sudo gem install fastlane -NV  // Gem 설치
$ brew cask install fastlane     // or Homebrew를 통해 설치

Fastlane 을 쓰기 위해서는 프로젝트 폴더에서 다음과 같은 명령으로 초기화를 시켜줘야 한다.

$ fastlane init

초기화 과정에서 어떤 용도로 사용할것인지 선택하면 그에 맞는 설정과 초기 Lane 세팅을 해준다. 추가로 개발자 계정으로 사용하는 Apple ID를 물어보는데 TestFlight 자동 배포 기능을 사용하기 위해서는 필수이기 때문에 웬만하면 입력하는 것이 좋다.

써보자

Fastlane 으로 할 수 있는 작업들은 Fastlane 문서 에서 확인할 수 있는데, 이 작업들을 모으고 파라미터를 조정하여 원하는 작업을 진행하게 해야 한다.

우리가 이 글에서 목표하고자 하는 작업들은 다음과 같다.

  1. CocoaPods 라이브러리 업데이트
  2. 빌드 넘버 업데이트 후 커밋
  3. 테스트 코드 실행 후 결과에 따라 진행여부 결정
  4. 빌드 진행하기
  5. 빌드 성공 후 TestFlight 업로드

이 작업들을 하나의 Lane으로 만들어보면 다음과 같다.

default_platform(:ios)

platform :ios do
  lane :beta do
    cocoapods(use_bundle_exec: false)
    increment_build_number(xcodeproj: "AppTest.xcodeproj", build_number: latest_testflight_build_number + 1)
    commit_version_bump(xcodeproj: "AppTest.xcodeproj")
    run_tests(workspace: "AppTest.xcworkspace",
              scheme: "AppTest",
              slack_url: "https://SLACK.HOOK/URL",
              slack_channel: "#channel_name")
    build_app(workspace: "AppTest.xcworkspace", scheme: "AppTest")
    upload_to_testflight
  end
end
  1. CocoaPods 의 라이브러리 설치 명령을 대신해주는 Action. 파라미터 없이 사용하게 되면 bundle exec pod install 이라는 루비 명령을 실행하는데 잘 동작하지 않는 것으로 보여 pod install 을 실행하도록 파라미터를 조정하였다. (cocoapods)
  2. Fastlane 에서는 TestFlight 서버와 통신하여 마지막 빌드 번호를 받아 올 수 있는데 (latest_testflight_build_number), 이 번호 + 1 만큼의 빌드 번호를 사용하여 업로드시 기존 빌드 번호와 충돌하지 않도록 수정을 한 후 Git에 커밋하게 된다. (increment_build_number, commit_version_bump)
  3. 테스트를 돌린다. 테스트가 끝나면 특정 Slack 채널에 메시지를 날린다. (run_test)
  4. 밑작업이 다 끝나고 나면 앱을 빌드한다. (build_app)
  5. 빌드가 성공하면 TestFlight에 빌드한 앱을 올린다 (upload_to_testflight)

이 밖에도 많은 Action 들이 있으므로 입맛에 맞는 Action 을 사용하면 좋다.

$ fastlane ios beta

마지막으로, 이렇게 만든 Lane은 위와 같이 실행시킬 수 있다.

결론

Fastlane 은 정말 좋은 툴이다. 잘 쓰면 CI 서버에서 하는 일과 거의 유사한 일들을 할 수 있고 로컬에서 동작하기 때문에 비용이 들지 않는다. CI 서버와 함께 사용한다면 Push 후 Lane이 자동으로 동작하게 설정할 수도 있다.

Fastlane과 CI를 연동하는 부분도 언젠가 기회가 된다면 글로 작성해 볼 생각이다.