Carthage + Rome으로 빌드 시간 줄이기
뤼이드의 iOS 챕터는 산타 토익 iOS의 의존성 관리를 위해 Carthage
를 사용합니다. CocoaPods
이 아닌 Carthage
를 사용하는 이유는 빌드 속도라고 할 수 있습니다.
CocoaPods
는 프로젝트(워크스페이스) 빌드 시에 라이브러리 빌드를 동시에 해서 오래 걸리는 반면에 Carthage
는 미리 빌드된 라이브러리를 사용하기 때문에 실제로 우리가 짠 코드만 빌드하면 돼서 빌드 속도가 많이 줄어듭니다.
실제로 산타 토익 iOS는 Carthage를 적용돼있어서 빌드가 30초 선에서 빠르게 끝납니다.
하지만 Carthage
의 가장 큰 단점은 사용할 라이브러리 모두를 미리 빌드하는 시간이 아주 오래 걸린다는 점입니다.
일단 기존에 하던 방식대로 bootstrap
해보겠습니다.
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
이 완성되었네요!
Rome
은 Carthage
가 빌드한 것만 저장하기 때문에 처음 한 번은 직접 빌드해야 합니다.
이제 빌드를 업로드해보겠습니다.
rome upload
업로드가 다 되었으면 테스트를 위해 Carthage 폴더의 Build와 Cache 폴더를 삭제하고 빌드를 다운로드받아보겠습니다.
rome download --platform iOS
carthage bootstrap --platform iOS --cache-builds --no-use-binaries
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
이 있다면 위의 세 줄짜리 코드를 한 줄로 줄일 수 있습니다.
Carthage
는 Fastlane
이 기본으로 제공하는 기능이지만 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
이제 단 한 줄이면
Rome
을 통해 캐싱 된Carthage
빌드를 다운받고,- 새로운 라이브러리는
Carthage
를 통해 새롭게 빌드되며, - 새롭게 빌드된 라이브러리는
Rome
을 통해 S3에 업로드됩니다.
86초 걸렸습니다! 처음 30분 걸린 것에 비교하면 아주 쾌적해졌네요. 🎉
항상 뤼이드의 iOS 챕터가 하는 일에 대해 바깥에 알릴 기회를 만들고 싶었는데, 이번 글을 시작으로 저희가 하는 일을 더 많이 소개할 수 있었으면 좋겠습니다.
그것과는 별개로 항상 미뤄왔던 Carthage 캐싱 작업을 끝마치니 속이 시원합니다.
감사합니다.