Skip to content

App Store 심사 제출을 apiSuccessor 준비 완료와 연결한다 #793

Description

@opficdev

배경

현재 .github/workflows/appstore.yml은 Release IPA를 생성해 App Store Connect에 업로드할 수 있지만, fastlane/Fastfileupload_appstore_buildsubmit_for_review: false이므로 심사 제출은 자동화하지 않는다.

opficdev/DevLog_Firebase#65 구조에서는 심사 앱이 prod apiSuccessor를 사용해야 한다. 따라서 정확한 App Store version/build를 Firebase 릴리스 레코드와 연결하고, apiSuccessor 배포 및 라우팅 준비가 끝난 뒤에만 해당 build를 심사에 제출해야 한다.

목표 흐름

  1. 검증된 iOS SHA와 private config SHA로 App Store Release IPA 생성
  2. IPA의 marketing version과 build number 기록
  3. App Store Connect 업로드 및 정확한 build 처리 완료 확인
  4. 릴리스 ID, iOS SHA, Firebase SHA, private config SHA, version/build를 Firebase 준비 작업에 전달
  5. Firebase가 동일 릴리스의 apiSuccessor 배포와 (appVersion, appBuild) 라우팅 등록 완료를 응답
  6. 응답 값이 iOS 릴리스 manifest와 정확히 일치할 때 해당 App Store build를 심사 제출
  7. App Store 공개 방식은 수동 공개로 유지

IPA 업로드와 Firebase 준비는 순서를 바꾸거나 함께 진행할 수 있지만, 심사 제출은 App Store build 처리와 Firebase 준비가 모두 끝나기 전에 실행하지 않는다.

작업 범위

  • fastlane/Fastfile에서 App Store IPA의 marketing version과 build number를 릴리스 manifest로 기록
  • App Store Connect 업로드와 심사 제출을 분리해 이미 업로드된 정확한 build를 선택 가능하게 구성
  • .github/workflows/appstore.yml에서 Firebase 릴리스 준비 작업을 시작하고 결과를 기다리는 연결 단계 추가
  • Firebase 준비 결과의 릴리스 ID, version/build, iOS SHA, Firebase SHA를 제출 전 재검증
  • 준비 실패, 값 불일치 또는 시간 초과 시 심사 제출 차단
  • 심사 제출 시 automatic_release: false 유지
  • 필요한 외부 자격 증명은 보호된 GitHub Environment와 최소 권한 secret으로 관리하고 로그에 출력하지 않음

Firebase 연결 방식은 사용자 요청과 응답을 흉내 내는 prod HTTP 점검이 아니라, 승인된 배포 workflow 또는 릴리스 제어용 호출로 한정한다.

완료 조건

  • App Store Release IPA에서 version/build가 추출되어 릴리스 manifest에 기록됨.
  • App Store Connect에서 처리 완료된 정확한 build 식별자가 기록됨.
  • 동일 릴리스의 apiSuccessor 준비 완료 전에는 심사 제출이 실행되지 않음.
  • Firebase 준비 결과와 iOS manifest가 다르면 제출이 차단됨.
  • 정확한 build 하나만 심사 대상으로 선택됨.
  • 심사 제출 후에도 자동 공개가 비활성 상태로 유지됨.
  • 실패 시 IPA와 릴리스 기록을 보존한 채 안전하게 재실행할 수 있음.

선행 이슈

제외 범위

  • Firebase api, apiStable, apiSuccessor 구현 및 배포 로직
  • App Store Connect webhook 수신
  • 오전 6시(KST) Cloud Tasks 예약과 공개 요청
  • 공개 후 apiStable 승격과 롤백
  • TestFlight에서 prod API 호출

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions