[iOS] CI/CD 알아보기 (fastlane 설치까지)
소프트웨어 공부를 하다 보면 CI/CD 파이프라인 구축이라는 말을 한 번쯤은 들어봤을 것이다!
오늘은 이 CI/CD 가 어떤 개념인지, 그리고 iOS에서는 어떻게 적용해 볼 수 있는지 한번 알아보자
💡 CI/CD
CI
CI는 지속적 통합을 의미하는 Continuous Integration을 의미한다.
지속적 통합이란 말을 쉽게 풀어서 설명해 보자면, 우리가 프로젝트 파일을 작성하고 깃허브에 PR을 올려서 최종적으로 메인브랜치에 병합하기까지의 과정은 아래와 같다.
- 코드 작성
- 빌드
- git add/git commit
- git push
- PR 작성
- 메인 브랜치에 병합
보통 협업을 하게 되면 메인 브랜치로 병합되기까지 5단계의 과정을 거치게 된다.
📍기존 방식의 문제점
크게 보면 기능 하나를 추가할 때마다, 혹은 자잘한 수정을 할 때마다 브랜치 새로 파서 코드 작성하고 빌드 한 다음 커밋하고 pull 하는 등 우리는 코드를 git에 올리기 위해서 같은 과정을 계속 반복해서 수행하게 된다.
하루에 개발양이 많아서 수십 번의 commit과 push을 하게 되면 반복되는 과정이 하루에 수십번 발생하게 되며 다른 브랜치에서 작업하던 코드들을 제때 git에 올리지 않고 방치시켜 두다가 commit/push 하여 예상치 못한 에러를 발생시킬 수도 있다.
CI는 이러한 문제를 방지하기 위해서 자동화를 사용하여 시간을 단축시키고 개발 생산성을 향상하도록 한다.
따라서 CI는 git에 내가 작성한 코드가 병합되기까지의 모든 자동화 과정을 의미한다.
CI의 핵심목표는 새로운 업데이트의 검증 및 릴리즈의 시간을 단축시켜서 개발 생산성을 향상하며 코드의 품질을 향상하는 것이다.
CD
CD란 Continous Depolyment의 축약어인 지속적 배포를 의미한다.
지속적 배포란??
📍수동배포의 문제점
CI를 통해서 메인브랜치에 병합까지 완료된 코드들이 있다고 가정해 보자. 그럼 우린 이 코드들을 testflight 혹은 앱스토어에 배포를 해야 한다.
- dev브랜치에 merge 된 코드들을 매번 팀원의 요청으로 testflight에 수동 배포를 하게 되면 그 시간 동안에는 개발이 중단되는 문제가 발생
- testflight에 배포를 하기 위해 빌드 -> archive -> upload 등 매번 번거로운 작업을 수행해야 함
수동배포를 하게 되었을 때의 문제점은 위와 같다.
만약 앱스토어 배포 시기가 다가오게 되었을 경우, 자잘한 에러를 계속 고친다고 하루에 몇 번이나 testflight 배포를 하게 될 수도 있다. 그동안에 개발은 아예 못하게 되는 것!!!!
이런 문제점들을 해결하기 위해 배포까지 자동화를 시켜서 빠르게 배포를 가능할 수 있도록 하며, 반복적인 일을 최소화시킴으로써 개발에만 더 집중할 수 있게 된다
즉, 병합된 메인브랜치에 있는 코드들이 배포에 이르기까지의 자동화 과정을 CD, 지속적인 배포를 의미한다.
🛠️ Fastlane
Fastlane이란 iOS와 Android 앱에서 개발 및 배포 프로세스를 자동화시켜주는 ruby기반 오픈소스 라이브러리이다.
Fastlane의 주요 기능은 크게 4가지로 나뉜다
- testflight 업로드
- 앱스토어에 배포 자동화
- 앱 서명/ 인증서 관리
- 스크린 샷 자동화
크게 보면 배포, testflight 업로드 자동화, 인증관리, UI 테스트를 통해 자동으로 앱의 화면을 캡쳐하는 스크린 샷 기능까지 자동화된다. CI 기능도 커스텀하여 사용할 수 있다
나는 이중 testflight 업로드에 관해 알아보도록 하겠다.
testflight 업로드와 앱스토어에 배포하기 위한 자동화 툴은 Xcode Cloud도 있다.
Xcode cloud는 배포 자동화를 하기 위해 훨씬 간단하게 설정할 수 있는 반면에 Apple Developer Program 멤버십에 구독해야 하고, 구독하고 있어도 월 25시간만 무료로 사용할 수 있는 단점이 있다.
따라서 가장 대중적으로 사용할 수 있는 Fastlane 라이브러리를 통해 CD 자동화를 구축해보려고 한다!
Fastlane 설치하기
1. 프로젝트 파일에 fastlane 설치하기
//homebrew로 설치
brew install fastlane
//ruby로 설치
sudo gem install fastlane
프로젝트 파일에 fastlane을 설치할 수 있는 방법은 2가지가 있다.
homebrew로 설치하는 것과 ruby를 통해 설치하는 게 있는데 macOS를 사용 중이라면 웬만하면 homebrew를 통해 설치하는 걸 추천한다.
나의 경우는 익숙한 방법인 ruby로 설치했다가 10분 넘게 설치 중이어서 homebrew로 설치하니 금방 설치 완료되었다. (나도 알고 싶지 않았다)
2. fastlane 설치하기
fastlane init
fastlane init을 눌러주면 fastlane에 필요한 설정들을 다룰 수 있다.
- Apple Id & Password 입력
- 자신이 속한 팀 선택
- fastlane을 어떻게 사용하고 싶은지 번호 입력
- + AppId가 존재하지 않는다는 오류가 뜨면 -> AppId를 자동으로 생성해 줄까? 하는 안내가 뜨는데 이때 y를 선택하면 자동으로 만들어줌~ (x 누르면 대참사 나니 되도록 y를 하도록 권장.. 그 이유는 아래에서..)
대략 위의 과정을 거치게 된다.
이때 어떤 목적으로 fastlane을 선택할 것인지를 고르는 것은 testflight에 업로드하는 과정을 자동화하고 싶기 때문에 2번을 선택하도록 하자!
설치가 완료되면 아래 사진처럼 디렉토리가 형성된다.
이제 여기서 fastlane 폴더에 있는 Fastfile의 설정을 수정해줘야 한다.
3. Fastfile 수정
거의 대부분 코드들이 git에 올라가지만 debug, release 이런 Xcode Build Configuration Files들은 git에 보안 이슈로 인해 올라가지 않는다
하지만 빌드하려면 꼭 필요한 파일들이기 때문에 이런 인증 관련 파일과 빌드에 필요한 파일을 가지고 오겠다는 get_certificates을 추가로 넣어주었다!
4. 실행
fastlane beta
위 명령어를 통해 이제 fastlane을 실행해 볼 수 있다!
🔥 마주친 오류들!!!!
fastlane beta 명령어를 입력해 주고,, 나니 이런 오류가 발생했다.
확인해 보니 archive까지는 성공했는데 빌드에서 오류가 나는 듯하였다.
아까 속한 팀을 선택했는데 AppId가 존재하지 않으니 만들어줄까?라고 해서 n를 선택했다.
그럼 알겠어~ 근데 대신 나중에 build 할 때 오류가 날 수도 있어! 하고 미리 안내 문구를 띄워준다. 그렇지만 나는 이걸 모르고 그냥 넘어갔다가 위의 오류가 뜨고 나서 왜 안되지????? 했던 것..
그래서 다시 설정으로 돌아가서 이번엔 AppId를 만들어줘!라고 요청을 하였다. 근데 존재하는 AppId가 있다고 같은 bundle Id로 생성이 안 되는 것이다 ㅎㅎ.,
확인해 보니 내가 A의 팀에 속해있지만 AppId를 생성한 사람이 A라면 AppId는 A의 Apple developer 계정에 Certificates, Identifiers & Profiles에 남아있지만, 팀원인 나에게는 따로 AppId가 없다는 것을 확인할 수 있었다
시도해 본 방법 1
그럼 내 계정에서 AppId를 하나 더 만들면 되지 않을까?
-> 안 됨! 프로젝트 앱 하나에 같은 bundle Id를 가지고 있기 때문에 팀원이 프로젝트에 대한 AppId를 생성했다면 중복으로 생성할 수 없다.
그럼 어떻게 해결할 수 있는데??
1. fastlane match 사용
Fastlane match란?
팀원, 환경에 관계없이 자동으로 인증을 동기화해 주는 fastlane 기능 중에 하나이다.
AppId 뿐만 아니라 testflight에 배포하려면 앱 password 등 각종 인증 관련해서 많은 오류들이 발생하는 것으로 알고 있다. 또한 AppID는 동일하지만 팀원마다 디바이스 정보와 인증서 키가 다르기 때문에 추후 앱 배포를 자동화할 때 문제가 생길 수 있다.
따라서 이 인증서들을 다른 레포지토리를 하나 파서 match 인증서를 생성해 주고 원격저장소에서 Certificate와Provisioning profile를 저장하여 환경에 영향을 받지 않고 인증을 할 수 있게 된다는 개념이다!
자세한 건 아래 블로그를 참고해 보면 좋을 듯하다.
[iOS 앱 배포 준비] 애플에 배포하기 위한 4가지 개념
배포 준비 핵심 Certificates 생성 및 실행하여 xcode에 등록 AppID 등록 Device 등록 Provisioning Profiles 등록 Certificates 개념 애플이 개발자를 신뢰할 수 있는 보증서 애플의 하드웨어에서 특정 소프트웨어
ios-development.tistory.com
2. 팀원의 AppleId로 fastlane 재설치
제일 편한 방법 중에 하나이다. 팀원의 Certificates, Identifiers & Profiles에 pennyway AppId가 존재하는 것을 확인했으니 그냥 팀원 계정으로 fastlane을 재설치하면 위 오류는 일단 해결해 볼 수 있을 것이다.
이후에 나오는 추가 에러들은 다음 포스팅에서 다뤄야 될 거 같다.
위 2가지를 해결방법으로 추측해 볼 수 있다. 하지만 아직 2번을 시도해보지 못했기 때문에 다음 블로그엔 위 문제를 해결한 방법과 github actions + fastlane을 사용하여 testflight 자동화를 시키는 과정까지 포스팅에 담아보겠다.