Carthage + Rome으로 빌드 시간 줄이기

뤼이드의 iOS 챕터는 산타 토익 iOS의 의존성 관리를 위해 Carthage를 사용합니다. CocoaPods 이 아닌 Carthage 를 사용하는 이유는 빌드 속도라고 할 수 있습니다.

CocoaPods 는 프로젝트(워크스페이스) 빌드 시에 라이브러리 빌드를 동시에 해서 오래 걸리는 반면에 Carthage 는 미리 빌드된 라이브러리를 사용하기 때문에 실제로 우리가 짠 코드만 빌드하면 돼서 빌드 속도가 많이 줄어듭니다.

실제로 산타 토익 iOS는 Carthage를 적용돼있어서 빌드가 30초 선에서 빠르게 끝납니다.

image1

하지만 Carthage 의 가장 큰 단점은 사용할 라이브러리 모두를 미리 빌드하는 시간이 아주 오래 걸린다는 점입니다.

일단 기존에 하던 방식대로 bootstrap 해보겠습니다.

image2 image3

30분이 넘게 걸리네요.

그 말은 곧 새로운 사람이 들어오면 프로젝트 실행까지 최소 30분이 걸린다는 것을 의미합니다.

게다가 더 최악인 점은 iOS 챕터 멤버 모두가 이 작업을 해야 했다는 것입니다.

Rome으로 더 빠른 빌드 느껴보기

이를 개선하기 위해 Rome 라는 라이브러리를 쓰기로 했습니다.

Rome 는 설명에도 적혀있듯이 Carthage 를 위한 캐싱 도구입니다.

저희는 Rome을 이용해서 Amazon S3에 빌드를 캐싱하기로 했습니다.

그 다음으로는 Romefile 을 설정해줘야 합니다. Amazon S3를 사용하기로 했으니 아래와 같이 버킷 이름을 적어주었습니다.

cache:
  s3Bucket: ios-carthage-bucket

산타 토익이 사용하는 라이브러리 중에는 저장소와 프로젝트의 이름이 다른 경우도 많았기 때문에 RepositoryMap을 추가해서 직접 매핑하는 작업도 진행했습니다.

repositoryMap:
- JWTDecode.swift:
  - name: JWTDecode
    platforms: [iOS]
- lottie-ios:
  - name: Lottie
    platforms: [iOS]
repositoryMap:
  - RxSwift:
	  - name: RxSwift
	  - name: RxCocoa
	  - name: RxBlocking

Romefile 이 완성되었네요!

RomeCarthage 가 빌드한 것만 저장하기 때문에 처음 한 번은 직접 빌드해야 합니다.

이제 빌드를 업로드해보겠습니다.

rome upload

업로드가 다 되었으면 테스트를 위해 Carthage 폴더의 Build와 Cache 폴더를 삭제하고 빌드를 다운로드받아보겠습니다.

rome download --platform iOS
carthage bootstrap --platform iOS --cache-builds --no-use-binaries

image4 image5

Rome 을 이용해서 다운로드하고, 다운로드된 내용을 bootstrap까지 했는데 2분이 채 안 걸렸네요!

하지만 이미 올라가 있는 빌드가 업데이트와 같은 이유로 변경되면 다시 업로드하는 로직이 없기 때문에 아래 한 줄을 추가합니다.

rome list --missing --platform iOS | awk '{print $1}' | xargs rome upload --platform iOS

정리하면 아래와 같을 것입니다.

rome download --platform iOS
carthage bootstrap --platform iOS --cache-builds --no-use-binaries
rome list --missing --platform iOS | awk '{print $1}' | xargs rome upload --platform iOS

Fastlane으로 한 번에 처리하기

Fastlane 이 있다면 위의 세 줄짜리 코드를 한 줄로 줄일 수 있습니다.

CarthageFastlane 이 기본으로 제공하는 기능이지만 Rome 은 플러그인을 추가해줘야 합니다.

fastlane add_plugin rome

이제 Fastfile 에 새로운 lane을 추가해보겠습니다.

lane :update_dependency do
  rome(
    command: "download",
    platform: "iOS"
  )
  carthage(
    command: "bootstrap",
    platform: "iOS",
    cache_builds: true,
    use_binaries: false
  )
  sh("(cd ..; rome list --missing --platform iOS | awk '{print $1}' | xargs rome upload --platform iOS)")
end

이제 단 한 줄이면

  1. Rome 을 통해 캐싱 된 Carthage 빌드를 다운받고,
  2. 새로운 라이브러리는 Carthage 를 통해 새롭게 빌드되며,
  3. 새롭게 빌드된 라이브러리는 Rome 을 통해 S3에 업로드됩니다.

image6

86초 걸렸습니다! 처음 30분 걸린 것에 비교하면 아주 쾌적해졌네요. 🎉


항상 뤼이드의 iOS 챕터가 하는 일에 대해 바깥에 알릴 기회를 만들고 싶었는데, 이번 글을 시작으로 저희가 하는 일을 더 많이 소개할 수 있었으면 좋겠습니다.

그것과는 별개로 항상 미뤄왔던 Carthage 캐싱 작업을 끝마치니 속이 시원합니다.

감사합니다.

참고한 링크들