기록의 습관화
article thumbnail

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

 

WWDR Intermediate Certificate Expiration - Support - Apple Developer

Feedback Assistant Submit feedback, report bugs, and request enhancements to APIs and developer tools. Send us feedback

developer.apple.com

 

이걸 더블클릭 하여 키 체인에 추가하고 나면 문제없이 빌드가 잘 되는 것을 확인할 수 있습니다.

 


그럼 왜 이런 오류가?

일단 eas의 경우 내부적으로 fastlane을 이용합니다.

정확하게는 fastlane의 gym을 이용합니다.

 

 

여기에서 기본적인 빌드에 필요한 부분들과 인증에 필요한 부분들을 정의합니다.

위에서 보면 provisioningFilekeychain 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 빌드 순서를 보면 좀 더 정확하게 알 수 있습니다.

iOS build process

 

iOS build process

Learn how an iOS project is built on EAS Build.

docs.expo.dev

 

 

설명과 같이 키체인을 만들고 이를 Xcode에 반영한다는 사실을 확인할 수 있죠.

 

여기 까지는 알겠는데 그럼 왜 아까 애플에서 받은 인증서가 필요할까요?

 

 

이 부분에 대해서 짚어보기 전에 애플의 인증과정에 대해서 조금 알아보고 가도록 하겠습니다.

 


Apple의 Certificate와 Provisioning profile

간단하게 설명을 하자면 애플에서의 인증서 인증 과정은 공개키, 개인키를 통해서 이루어집니다.

우리가 웹에서 흔히 사용하는 Https의 비대칭키 암호화 방식과 유사한 특징을 가지고 있습니다.

  1. 애플의 공개키와 개인키 사용:
    • 애플은 여러 가지 방식으로 공개키와 개인키를 사용합니다. 예를 들어, App Store에 앱을 업로드할 때 개발자는 자신의 개인키로 앱을 서명해야 합니다. 이 서명은 사용자가 다운로드할 때 해당 앱이 변경되지 않았음을 확인하는 데 사용됩니다.
    • 또한, 애플의 디바이스와 서비스 간의 통신 보안도 공개키와 개인키를 사용하여 암호화됩니다.
  2. 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

 

[iOS] Certificate 와 Provisioning profile

인증서와 프로비저닝 프로파일에 대해 알아봅시다

sujinnaljin.medium.com

 


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와 좀 더 친해질 수? 있는 기회가 된 거 같네요 😄

profile

기록의 습관화

@ww8007

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!