TIL: macOS Catalina CLI 빌드 문제

TIL: macOS Catalina CLI 빌드 문제

macOS Catalina(이하 카탈리나)가 릴리즈 된 지 2주 정도 지났다. 카탈리나는 출시 이후 많은 이슈를 만들었는데 대표적으로 권한 문제나 32bit 프로그램 미 지원 등이 큰 이슈로 발견되었다. 그 외에도 사소하고 많은 이슈들이 사용자들을 괴롭혔는데, 그 중 어제 내가 겪었던 이슈를 하나 풀어 보고자 한다.

Fastlane Build 먹통

모바일 앱 빌드 자동화를 위하여 널리 사용 되고 있는 Fastlane. 현재 다니고 있는 회사에서도 이 Fastlane 을 이용하여 테스트 빌드 업로드 및 릴리즈를 하고 있다.

그러던 중, 모종의 이유로 개발 머신을 카탈리나로 업그레이드를 했다. 그 이후로 아래와 같은 에러가 발생하면서 Fastlane 를 통한 빌드 릴리즈가 불가능하게 되었다.

xcodebuild[10674:326208]  DVTAssertions: Warning in /Library/Caches/com.apple.xbs/Sources/IDEFrameworks/IDEFrameworks-14936/IDEFoundation/Provisioning/Logging/IDEProvisioningLedger.m:172

Details:  Unable to close provisioning ledger entry because not all of its subentries are closed
Object:   <IDEProvisioningLedgerEntry: 0x7ff7568b7a00>
Method:   -closeWithError:
Thread:   <NSThread: 0x7ff750b16af0>{number = 14, name = (null)}
Please file a bug at <https://feedbackassistant.apple.com> with this warning message and any useful information you can provide.
error: exportArchive: Create certificate
xcodebuild 사용시 발생한 에러 메시지

Fastlane은 Xcode의 빌드 툴인 xcodebuild 를 사용해서 CLI 상에서 빌드를 하는데, 특정 옵션들을 사용하면 빌드에서 아케이빙, Code Signing까지 끝낼 수 있게 해준다.

여기서 문제가 된 부분은 allowProvisioningUpdates 라는 옵션이었다. 해당 옵션은 xcodebuild 가 Apple Developer 서버와 통신하여 필요한 프로파일과 인증서를 생성하고 업데이트 해주는 옵션이다. 하지만 어떠한 이유로 인증서를 생성하려고 할 때 에러가 발생하여 아케이빙이 중단되는 문제가 발생했다.

어떻게 해결하나

카탈리나가 소개되면서 추가된 기능 중 하나가 Catalyst 인데, iPad 용으로 만들어진 앱을 macOS 용으로 쉽게 포팅 할 수 있게 만들어 주는 기술이다. 이 기술이 도입 되면서 달라진 것이 있는데, 기존에 사용하던 iOS 앱 인증서 대신 Apple 개발자 인증서와 키를 따로 사용해야 한다는 것이다.

해당 인증서와 키는 Xcode 내에서 아카이빙 후 배포 과정을 거치면서 생성하게 되는데, CLI 에서는 생성하는 과정을 거치지 않기 때문에 인증 에러가 발생하게 되고 새로운 배포용 프로파일을 생성할 수 없게 된다.

이 문제를 해결하는 방법은 위에서 말했듯 Xcode 상에서 배포 작업을 한번이라도 해주고 나면 Apple 개발자 인증서가 생기면서 CLI 에서 빌드가 가능한 상태가 된다.

새로운 인증서를 배포 직전에 만드는 화면. 위 체크박스를 반드시 체크하고 넘어가야 한다. / 출처 : StackOverflow
새롭게 만들어진 인증서들

결론

이번 이슈를 계기로 역시 회사에서 쓰는 개발 머신은 OS 업그레이드가 있어도 최대한 미루는 게 낫다는 걸 다시 한번 깨우치게 되었다. 혹시라도 같은 문제로 골머리를 썩고 있을 앱 개발자들에게 도움이 되길 바란다.

참고자료

StackOverflow - Xcode 11 Error Exporting IPA No profiles for 'my.bundle.id' were found