iOS) Fastlane을 이용한 CI/CD 파이프라인 구축 - 1

2021. 11. 6. 22:45iOS

서론. 

입사한지 얼마 되지는 않았지만 (2개월) 입사 후 한 일들 중 코딩 외적으로 가장 많이 하는것이 있다면 그것은 배포였다.

 

현재 서비스하고 있는 프로젝트의 경우 한개의 타겟에 여러 스키마가 구성되어 배포타겟의 수도 많고, 프로세스도 길고, 무엇보다 시간이 굉장히 오래 걸렸다.

 

기존 배포 프로세스를 정리하자면 다음과 같다.

 

- QA 배포의 경우

1. Xcode에서 배포할 스키마 선택

2. 스키마 빌드

3. Organizer 화면에서 Distribute App 선택

4. Ad Hoc 선택

5. Ad Hoc distribution options 선택

6. Re-sign 방식 선택

7. 아카이브 (진~~짜 오래걸림)

8. ipa 파일 저장

9. Firebase App Distribution 에서 ipa 업로드

10. Tester 선택

11. Release Note 작성

12. 배포

+ dSYMs 등록 (app store connect에서 찾아서...)

 

앱 전체를 배포할 경우 이러한 과정을 몇번씩 반복해서 거쳐야 했는데 약 2시간이상 소요되는 경우가 빈번했다.

 

그래서 예전부터 눈독들였던 프레임워크 Fastlane을 프로젝트에 적용해보기로 했다.

 

사실 입사전에도 Fastlane의 존재는 알고 있었다. 많은 회사들이 Fastlane을 자사 기술스택으로 내걸고 있는 것을 보고 몇번 검색은 해봤지만.. 실제로 사용해본적은 없었기에 맨땅에 헤딩하는 기분이었다.

 

하지만 아무튼.. 결과적으로 CI/CD 파이프라인을 완성했고 그 과정을 공유하고자 이 포스트를 공개한다.

 

직접 배포자동화 시스템을 구축하는 과정에서 재미있게 몰입할 수 있었고, 결과적으로 업무생산성을 꽤 많이 증가시킬 수 있었다.

그리고 미리 스포하자면 그렇게 어려운거 아니다. 설명 이해되지 않으면 내잘못이니까 다른 블로그나 공식문서 가서 보충설명 들어라.

 


 

Fastlane은 무엇인가.

Fastlane은 CI/CD 파이프라인을 정말 편하게 만들어주는 프레임워크이다. 어느정도로 편하냐면, 일반적인 앱의 경우 단 몇줄의 설정만으로 복잡한 빌드, 아카이브, 배포, 테스트, 실배포를 자동으로 해준다.

 

그외에도 버전코드를 관리하거나, 슬랙에 결과를 뿌려주거나, 배포시 스크린샷을 찍어주는 등 .. 어마무시한 기능성을 자랑한다.

 

적용에 들어가기 전에

먼저 작은 단위의 기능 구현부터 시작해보기로 했다. 막연하게 자동화 시스템 구축. 같은 커보이는 목표를 세우게 되면 겁부터 나기 때문에.. 할수있는 가장 최소한의 단위부터 구현한다.

 

그래서 본 "Fastlane을 이용한 CI/CD 파이프라인 구축" 시리즈는 아마 다음과 같은 과정들을 설명하는 것으로 이루어질 것 같다.

 

(1) 프로젝트에 Fastlane 추가

(2) Appfile 에서의 기본 환경설정

(3-1) Fastfile 에서의 lane 설정 - QA 배포

(3-2) Fastfile 에서의 lane 설정 - 스토어 배포

(4) 트러블슈팅 가이드 (내가 겪은것만)

 


 

1. 프로젝트에 Fastlane 추가

이제부터 터미널을 켜서 프로젝트 파일로 들어가자.

Fastlane을 추가하는 방법은 두가지가 있는데 

 

첫번째는 Homebrew를 이용한 설치방법이다. fastlane은 Ruby 기반 프레임워크이지만 brew를 이용해서 설치하면 따로 루비를 설치할 필요가 없다.

brew install fastlane

혹은 루비를 설치하고 사용하는 방법이 있다. sudo 를 걸고 설치하면 권한문제가 없기때문에 웬만하면 넣어서 사용해주자.

sudo gem install fastlane

 

이제 컴퓨터에 Fastlane이 설치됐으면, 기본 환경설정을 세팅해보자.

fastlane init

 

이렇게 했으면 Fastlane 이라는 폴더가 생성되는데, 이 폴더 아래에 AppfileFastfile이라는 파일이 생성되게 된다.

 


 

2. Appfile 에서의 기본 환경설정

배포를 하려면 필연적으로 개발자가 적어내야 하는 정보들이 몇가지 있다. 대표적으로는 개발자의 애플 이메일 이라던가, app identifier라던가 하는 것들이다. 그런데 배포할 것들이 N개라면 이런것들을 N번만큼 적기에는 너무 귀찮고 비효율적이다.

 

그래서 Appfile에 이러한 것들을 미리 세팅해 놓는것이다. 한마디로 전역 환경변수 파일이라고 볼 수 있다.

 

공식문서의 Appfile 예시를 보면 다음과 같이 사용한다.

app_identifier "net.sunapps.1" # The bundle identifier of your app
apple_id "felix@krausefx.com"  # Your Apple email address

# You can uncomment the lines below and add your own
# team selection in case you're in multiple teams
# team_name "Felix Krause"
# team_id "Q2CBPJ58CA"

# To select a team for App Store Connect use
# itc_team_name "Company Name"
# itc_team_id "18742801"

필요한 부분의 주석을 풀어서 사용하면 된다.

 

만약 배포할 타겟에 따른 환경변수가 바뀌어야 한다면 다음과 같이 사용한다.

app_identifier "net.sunapps.1"
apple_id "felix@krausefx.com"
team_id "Q2CBPJ58CC"

for_platform :ios do
  team_id '123' # for all iOS related things
  for_lane :test do
    app_identifier 'com.app.test'
  end
end

이 부분에서 살짝 헷갈릴 수 있기 때문에 설명을 첨하자면, 위 for_lane :test 는 test라는 lane으로 fastlane을 돌릴때 do 절 이하의 변수를 사용한다는 말이다. 그러니까 "fastlane test" 명령어로 배포를 진행할 때는 app_identifier 가 "com.app.test"가 된다는 말이다.

 

엥? fastlane test 이게 뭐죠? 할수있는데 다음 챕터인 Fastfile 사용하기에서 구체적으로 설명한다. 지금은 그냥 이렇게 배포하고 이렇게 사용되는구나 하고 넘어갈것.

 

필자의 경우 다음과 같이 사용했다.

apple_id "jxxxxx@xxxxxxxx.com"

for_platform :ios do

  for_lane :deploy1 do
    itc_team_id "120xxxxxx"
    team_id "3Pxxxxxxxxxx"
    app_identifier "com.xxxx.xxxxx.deploy1"
  end

  for_lane :deploy2 do
    itc_team_id "118xxxxxx"
    team_id "W6xxxxxxxxxxx"
    app_identifier "com.xxxx.xxxxx.deploy2"
  end
end

 

 

다음 포스트에서는 Fastlane의 꽃인 Fastfile을 구성하는 법을 다룬다.