eas local build error 해결하기
어느 날 갑자기 잘 사용하고 있던 eas-cli에서 문제가 발생했습니다.
어제는 잘되던 게 오늘은 안된다? 정말 사람 힘들게 하는 거 같습니다.
해결하고 나서 약 3일동안 이것 때문에 고생을 했던걸 생각하면 정말 어이가 없네요…
일단 해결 방법부터 설명하겠습니다
해결 방법
일단 저의 문제는 Developer Relations Intermediate Certificate
가
제 Mac에서 날라간 점이었습니다.
이 인증서는 다음의 링크를 통해서 받을 수 있습니다.
https://www.apple.com/certificateauthority/AppleWWDRCAG3.cer
만약 다른 인증서가 필요하시다면 여기에서 받아볼 수 있습니다.
WWDR Intermediate Certificate Expiration - Support - Apple Developer
이걸 더블클릭 하여 키 체인에 추가하고 나면 문제없이 빌드가 잘 되는 것을 확인할 수 있습니다.
그럼 왜 이런 오류가?
일단 eas의 경우 내부적으로 fastlane을 이용합니다.
정확하게는 fastlane의 gym을 이용합니다.
여기에서 기본적인 빌드에 필요한 부분들과 인증에 필요한 부분들을 정의합니다.
위에서 보면 provisioningFile
과 keychain path
같은 부분들을 동적으로 만들어서 사용하는 것을 알 수 있습니다.
그런데 저는 이러한 setting을 한 적이 없는데요?
eas-cli
의 구현부를 보면 동적으로 fastlane에 사용될 gym
, keychain
등을 만들어서 사용하는 것을 확인할 수 있습니다.
export default class Keychain<TJob extends Ios.Job> {
private readonly keychainPath: string;
private readonly keychainPassword: string;
private created = false;
private destroyed = false;
constructor(private readonly ctx: BuildContext<TJob>) {
this.keychainPath = path.join(os.tmpdir(), `turtle-v2-${uuid()}.keychain`);
this.keychainPassword = uuid();
}
public async create(): Promise<void> {
this.ctx.logger.debug(`Creating keychain - ${this.keychainPath}`);
await runFastlane([
'run',
'create_keychain',
`path:${this.keychainPath}`,
`password:${this.keychainPassword}`,
'unlock:true',
'timeout:360000',
]);
this.created = true;
}
}
레포의 다른 파일들을 살펴보면 distributionCertificate
, provisioningProfile
모두 검증과 합쳐서 내보내는 것을 볼 수 있습니다.
실제로 eas-cli local 빌드
를 하게 되면 다음과 같이
mac의 키체인에 잠시 인증서가 생기는 것을 확인할 수 있습니다.
이 부분에 대해서는 expo 공식 문서의 ios 빌드 순서를 보면 좀 더 정확하게 알 수 있습니다.
설명과 같이 키체인을 만들고 이를 Xcode에 반영한다는 사실을 확인할 수 있죠.
여기 까지는 알겠는데 그럼 왜 아까 애플에서 받은 인증서가 필요할까요?
이 부분에 대해서 짚어보기 전에 애플의 인증과정에 대해서 조금 알아보고 가도록 하겠습니다.
Apple의 Certificate와 Provisioning profile
간단하게 설명을 하자면 애플에서의 인증서 인증 과정은 공개키
, 개인키
를 통해서 이루어집니다.
우리가 웹에서 흔히 사용하는 Https의 비대칭키 암호화 방식
과 유사한 특징을 가지고 있습니다.
- 애플의 공개키와 개인키 사용:
- 애플은 여러 가지 방식으로 공개키와 개인키를 사용합니다. 예를 들어, App Store에 앱을 업로드할 때 개발자는 자신의 개인키로 앱을 서명해야 합니다. 이 서명은 사용자가 다운로드할 때 해당 앱이 변경되지 않았음을 확인하는 데 사용됩니다.
- 또한, 애플의 디바이스와 서비스 간의 통신 보안도 공개키와 개인키를 사용하여 암호화됩니다.
- HTTPS와 비대칭키:
- HTTPS는 HTTP를 보안(SSL/TLS)으로 감싸서 웹 통신의 보안을 강화한 것입니다.
- SSL/TLS 핸드셰이크 과정에서 서버의 공개키가 클라이언트에게 전송되어, 클라이언트는 이 키를 사용하여 데이터를 암호화합니다. 서버는 자신의 개인키로 데이터를 복호화합니다.
- 또한, 서버는 SSL/TLS 인증서를 제공하는데, 이 인증서는 인증 기관(CA)에 의해 서명된 서버의 공개키를 포함하고 있습니다. 이를 통해 클라이언트는 서버의 신뢰성을 검증할 수 있습니다.
이 공개키는 신뢰된 사용자임을 증명하기 위해서 사용되는 CSR(Certificate Signing Request)
에
담겨서 사용되고
이 CSR
은 이후 앱 빌드나 배포에 이용될 인증서를 만들 때 사용 됩니다.
앱을 빌드할 때 Apple Development 인증서
를 통해서 안전하다는 증명을 하는데
이는 Apple 개발자 계정을 통해 만들어 낼 수 있고
아래와 같이 CSR을 만들 때 사용했던 개인 키가 아래와 같이 합쳐져서 인증을 하게 됩니다.
또한 Provisioning profile의 경우 앱을 실행시킬 수 있는
- 디바이스
- 권한
- 인증서
- 앱 실행이 허용된 UUID 목록
등과 같은 여러 규칙등을 모아서 앱을 실행시킬 수 있는 조건들을 담게 됩니다.
이들이 합쳐져서 앱을 빌드하고 배포할 수 있는 발판이 됩니다.
자세한 내용은 다른 개발자분이 작성해 주신 아래글에 더 자세히 나와있습니다.
[iOS] Certificate 와 Provisioning profile
eas-cli에서의 문제
문제에 대해서 원인을 찾기까지 정말 어려움이 많았습니다.
1. 다른 부분에서의 빌드가 실패하지 않았다는 점
- local react native 빌드 - 문제없음 ✅
xcode
자체적 빌드 - 문제 없음 ✅eas-cli를
통한 원격 빌드 - 문제없음 ✅eas-cli local
빌드 - 문제 발생 ❌
2. fastlane의 오류 메시지가 정확한 원인을 알려주지 않음
혹시 모를 같은 문제로 고생하실 수 있는 다른 분들을 위해
아래의 오류 메시지는 빌드를 실패하게 하는 원인이 아님을 남겨두겠습니다.
1. Xcode.InterfaceBuilderBuildSupport.PlatformDefinition
Requested but did not find extension point with identifier Xcode.InterfaceBuilderBuildSupport.PlatformDefinition
2. npx expo-doctor에서 나오는 오류 구문들
- 주로 의존성 문제가 많이 나는데 이 부분에 대해서는 빌드에 영향이 없습니다.
3. FastLane의 오류 구문들
- Pod install 진행 이후 많은 구문들이 출력되는데 이 부분들 또한 빌드에 직접적인 영향은 없습니다.
[RUN_FASTLANE] 2023-11-04 22:08:49.825 xcodebuild[78100:1338607] [MT] DVTAssertions: Warning in /System/Volumes/Data/SWE/Apps/DT/BuildRoots/BuildRoot11/ActiveBuildRoot/Library/Caches/com.apple.xbs/Sources/IDEFrameworks/IDEFrameworks-22269/IDEFoundation/Provisioning/Capabilities Infrastructure/IDECapabilityQuerySelection.swift:103
[RUN_FASTLANE] Details: createItemModels creation requirements should not create capability item model for a capability item model that already exists.
[RUN_FASTLANE] Function: createItemModels(for:itemModelSource:)
[RUN_FASTLANE] Thread: <_NSMainThread: 0x150e09c70>{number = 1, name = main}
[RUN_FASTLANE] Please file a bug at https://feedbackassistant.apple.com with this warning message and any useful information you can provide.
[RUN_FASTLANE] 2023-11-04 22:08:49.825 xcodebuild[78100:1338607] [MT] DVTAssertions: Warning in /System/Volumes/Data/SWE/Apps/DT/BuildRoots/BuildRoot11/ActiveBuildRoot/Library/Caches/com.apple.xbs/Sources/IDEFrameworks/IDEFrameworks-22269/IDEFoundation/Provisioning/Capabilities Infrastructure/IDECapabilityQuerySelection.swift:103
[RUN_FASTLANE] Details: createItemModels creation requirements should not create capability item model for a capability item model that already exists.
그럼 왜 다른 빌드에서는 오류가 발생하지 않았을까요?
이 문제의 원인은 Automatically manage signing에 있었습니다.
xcode에서 이를 체크하게 되면 로컬 환경과는 별도로 Provisioning profile
에 대해서 애플 서버에서 직접적으로 받아오기 때문에 문제가 인증서에 대해서 유효성 검증이 따로 필요 없었고 문제가 일어나지 않았던 것입니다.
하지만 eas-cli
에서는 내부적으로 키체인을 따로 만들어서 인증과정을 거치고
이를 xcode 상에도 따로 반영하기 때문에 인증서의 유효 유뮤가 중요합니다.
실제로 아까 설치하였던 애플 인증서를 삭제하면 실시간으로
가지고 있던 인증서들이 신뢰하지 않다고 판단되고 빌드 또한 실패하게 됩니다.
결론
일단 멀쩡히 돌아가던 mac에서 apple의 인증서가 왜 날아갔는지 정말 모르겠네요…
아무래도 dev 환경과 prod 환경을 분리하면서 이것저것 만져보다가 이 사달이 난 게 아닐까 싶습니다 🥲
해결과정에 있어서도 fastlane의 오류 메시지가 정확히 어떤 부분에서 문제가 난 지 알려주지 않아
어디서부터 문제가 발생한 지 찾기가 어려웠던 거 같습니다.
그래도 이 기회에 Apple의 앱 빌드가 어느 인증 과정을 거치는지 그리고 많은 xcode 상의 설정들을 건드려 보면서 xcode와 좀 더 친해질 수? 있는 기회가 된 거 같네요 😄
'React Native' 카테고리의 다른 글
React Native Firebase Dev 환경 분리하기 (1) | 2023.11.19 |
---|---|
WebView에 관하여 (0) | 2023.09.30 |
Webview에서 Background Timer 구현하기 (0) | 2023.09.23 |
JavaScript webview에서 카메라 / 영상 촬영 기능 사용하기 (0) | 2023.09.15 |
React Native에서 Share Intent Native Module 개발하기 (0) | 2023.08.31 |