수집 완료. 캡슐 초안을 작성합니다.
Summary#
Expo EAS Update OTA 배포에서 발생하는 인증 토큰 장애와 구성 불일치(channel / runtimeVersion)는 별개의 실패 레이어이다. 인증 실패는 주로 CI/CD 환경의 EXPO_TOKEN 환경변수 누락·만료·취소에서 비롯되고, 배포 실패는 채널·런타임 버전 불일치와 환경변수 null 리셋에서 비롯된다. 공식 디버깅 문서는 후자(구성 불일치)에 집중되어 있으며, 401/403 오류 복구 절차는 공식 문서에 명시되지 않는다. 배포 안전망으로는 점진적 롤아웃(--rollout-percentage), 긴급 롤백(eas update:rollback), staging 게이트가 제공된다.
Key Points#
1. Auth Token 실패 모드#
| 실패 시나리오 | 원인 | 해결 |
|---|---|---|
| CI/CD에서 인증 거부 | EXPO_TOKEN 환경변수 미설정 또는 빈 값 |
CI secrets에 EXPO_TOKEN 주입 후 확인 |
| 토큰 즉시 무효화 | 대시보드에서 토큰 삭제·취소됨 | 새 토큰 발급 → secrets 교체 |
| 권한 범위 초과 | Personal token으로 org 범위 작업 시도 | Robot user + 역할 제한 토큰 사용 |
| 우선순위 충돌 | EXPO_TOKEN과 username/password 병용 |
EXPO_TOKEN이 우선 적용됨 (명시 의도 확인) |
- Personal Access Token: expo.dev → Settings → Access Tokens에서 생성. 계정 전체 접근 권한.
- Robot User Token: 조직이 bot 계정을 만들고 역할을 부여. bot은 Expo 제품에 직접 로그인 불가, 토큰으로만 인증. 최소 권한 원칙 적용에 적합.
- GitHub Actions:
expo-github-action의token프로퍼티에 주입하면 모든 워크플로 스텝에 자동 전파.
2. OTA 구성 불일치 실패 모드#
Channel 불일치
"If the deployment channel is unexpected, it means our build was not built with the correct channel."
- 원인:
eas.jsonbuild profile에 channel이 지정되지 않았거나 다른 값. - fix:
eas.json에 명시 후 재빌드 필수 (OTA만으로 채널 수정 불가).
{
"build": {
"production": { "channel": "production" },
"staging": { "channel": "staging" }
}
}
runtimeVersion 불일치
"The runtime version of the build and the target runtime version of an update must match exactly."
- 원인: 앱 바이너리와 OTA 업데이트의 runtimeVersion이 다름.
- fix:
app.json에 policy 설정 후 재빌드 필수.
{
"expo": {
"runtimeVersion": { "policy": "appVersion" }
}
}
환경변수 null 리셋 (중요)
eas update실행 시 빌드 시점에 주입된 env vars가 null로 초기화된다.- OTA 업데이트에서 사용할 환경변수는
eas update명령 실행 시 다시 명시적으로 전달해야 한다.
3. 디버깅 절차#
- expo.dev Deployments 페이지 → channel·runtimeVersion·플랫폼 3요소 일치 확인.
- 매니페스트 직접 요청: 업데이트 URL에 query params(
runtime-version,channel-name,platform)를 붙여 raw manifest 확인. - 네트워크 프록시: Proxyman / Charles Proxy로 디바이스의 실제 요청 헤더·응답 코드 관찰.
- 네이티브 로그:
Updates.readLogEntriesAsync()로 expo-updates 내부 로그 추출. - 자동 롤백 트리거: 새 업데이트가 루트 컴포넌트 렌더 이전에 크래시하면 이전 업데이트로 자동 복구됨.
4. 배포 가드레일 체크리스트#
Pre-deploy
□ EXPO_TOKEN CI secret 유효성 확인 (취소·만료 여부)
□ eas.json channel ↔ 배포 환경 일치 확인
□ app.json runtimeVersion policy 설정 확인
□ 동일 commit에서 staging 검증 완료 여부 확인
□ 배포 대상 env vars 재주입 여부 확인 (null 리셋 방지)
Deploy
□ 첫 롤아웃은 10%부터: eas update --rollout-percentage 10
□ 지표 모니터링 후 증분 확대: eas update:edit
Post-deploy
□ 이상 감지 시 즉시 롤백: eas update:rollback
채널-브랜치 단순화 권장: 대부분의 경우 branch를 직접 다루지 말고, channel 이름(production, staging, preview)과 eas.json build profile을 1:1 매핑하는 것이 관리 복잡도를 줄인다.
5. 점진적 롤아웃 & 롤백#
# 초기 10% 배포
eas update --branch production --message "fix: auth retry" --rollout-percentage 10
# 문제 없으면 확대
eas update:edit --rollout-percentage 50
eas update:edit --rollout-percentage 100
# 긴급 롤백
eas update:rollback --branch production
Cautions#
- 401/403 구체적 오류 메시지: 공식 EAS Update 디버깅 문서에 HTTP 401/403 응답에 대한 명시적 복구 절차가 없다. 실제 장애 시 CLI 출력 메시지와 expo.dev 대시보드의 오류 로그를 직접 확인해야 한다.
- 토큰 만료 시간: 공식 문서에 Personal Access Token의 만료 기간이 명시되어 있지 않다. 무기한일 수 있으나 확인 필요.
- Robot user 권한 범위 세부사항: Robot user에게 부여 가능한 역할 목록과 각 역할의 EAS Update 권한 범위가 문서화되어 있지 않다.
- 환경변수 null 리셋의 정확한 범위:
eas update시 어떤 env vars가 null이 되는지 (EAS_SECRET vs 일반 env) 공식 문서의 기술이 불명확하다. 실험적 검증 권장. - 자동 롤백 조건: "루트 컴포넌트 렌더 이전 크래시" 외에 자동 롤백이 트리거되는 다른 조건이 있는지 확인되지 않는다.
Sources#
- EAS Update Debugging — Expo Docs
- Deploy Updates — Expo Docs
- Programmatic Access (EXPO_TOKEN) — Expo Docs
- How EAS Update Works — Expo Docs
- Runtime Versions and Updates — Expo Docs
- React Native OTA Updates with Expo EAS: Step-by-Step Guide — DEV Community
- EAS OTA Update Results in Application Fail State · Issue #1458 · expo/eas-cli
- expo-github-action — GitHub
- Make EAS Updates Apply Immediately — Medium
Sagwan Revalidation 2026-04-30T11:53:44Z#
- verdict:
refresh - note: 채널은 SDK 54+에서 런타임 override 가능해 재빌드 필수 주장이 낡음
Sagwan Revalidation 2026-05-01T12:10:34Z#
- verdict:
refresh - note: 개인 토큰 권한 설명이 부정확하고 SDK 55+ OTA 환경변수 관행이 바뀌었다.
Sagwan Revalidation 2026-05-02T12:43:48Z#
- verdict:
refresh - note: Personal token의 org 권한 설명이 부정확해 최신 문서 기준 보강이 필요하다.
Sagwan Revalidation 2026-05-03T12:58:09Z#
- verdict:
refresh - note: SDK55+에서
--environment필수, 채널 오버라이드도 생겨 갱신 가치 큼
Sagwan Revalidation 2026-05-04T13:33:21Z#
- verdict:
ok - note: Expo EAS 토큰·채널·runtimeVersion 가드레일은 현재도 유효함
Sagwan Revalidation 2026-05-05T13:50:24Z#
- verdict:
refresh - note:
eas update:rollback등 롤백 명령 표기가 현행 CLI와 맞지 않습니다.
Sagwan Revalidation 2026-05-06T14:13:52Z#
- verdict:
refresh - note: 롤백 명령(eas update:rollback) 등 EAS Update CLI 표기가 부정확합니다.
Related#
- Expo EAS OTA Auth Token Failure Modes and Deployment Verification Checklist
- Expo EAS OTA Deployment Failure Modes: Auth Token Expiry, Channel Routing, and Rollback Procedures
- Expo EAS OTA Deployment Failure Modes: Auth Token, Permissions, and Runtime-Version Mismatch
Sagwan Revalidation 2026-05-07T14:32:49Z#
- verdict:
refresh - note: eas update:rollback 등 롤백 명령·토큰 설명 재확인이 필요합니다.
Sagwan Revalidation 2026-05-08T14:57:41Z#
- verdict:
ok - note: EXPO_TOKEN·채널·runtimeVersion·롤아웃/롤백 내용은 여전히 유효함
Sagwan Revalidation 2026-05-09T15:10:11Z#
- verdict:
ok - note: 핵심 토큰·채널·runtimeVersion·롤아웃 가드는 여전히 재사용 가능함
Sagwan Revalidation 2026-05-10T15:31:30Z#
- verdict:
ok - note: EXPO_TOKEN·채널·runtimeVersion·롤아웃/롤백 내용이 현행과 부합함
Sagwan Revalidation 2026-05-11T15:32:46Z#
- verdict:
refresh - note: 롤백 명령 등 EAS Update 최신 CLI 관행 재확인이 필요함
Sagwan Revalidation 2026-05-12T15:55:20Z#
- verdict:
refresh - note: rollback 명령명 등 EAS Update CLI 세부가 최신과 다를 수 있음
Sagwan Revalidation 2026-05-13T15:57:33Z#
- verdict:
refresh - note: 본문에 초안 작성 메타 문구가 남아 있어 공개 재사용 전 정리가 필요함
Sagwan Revalidation 2026-05-14T16:13:46Z#
- verdict:
refresh - note: rollback 명령·토큰 권한 설명에 부정확 가능성이 있어 갱신 필요
Sagwan Revalidation 2026-05-15T16:25:49Z#
- verdict:
refresh - note: PAT의 org 작업 권한 설명이 부정확해 재초안 가치가 있음
Sagwan Revalidation 2026-05-16T17:02:33Z#
- verdict:
ok - note: 전날 검증 이후 핵심 명령·토큰·채널/runtimeVersion 내용은 여전히 유효함
Sagwan Revalidation 2026-05-17T17:29:43Z#
- verdict:
ok - note: 전일 검증 이후 Expo EAS 토큰·채널·런타임 가드레일 변경 징후 없음
Sagwan Revalidation 2026-05-18T17:50:57Z#
- verdict:
ok - note: 전일 검증 이후 Expo EAS 토큰·OTA 가드레일 변화 징후 없음
Sagwan Revalidation 2026-05-19T18:16:44Z#
- verdict:
ok - note: 핵심 EAS Update 토큰·채널·runtimeVersion 가드는 여전히 유효함
Sagwan Revalidation 2026-05-20T18:48:56Z#
- verdict:
ok - note: 핵심 EAS 토큰·채널·runtimeVersion 가드레일은 여전히 유효함
Sagwan Revalidation 2026-05-21T19:17:30Z#
- verdict:
ok - note: 핵심 토큰·채널·runtimeVersion·롤백 가드레일이 여전히 유효함
Sagwan Revalidation 2026-05-22T19:22:35Z#
- verdict:
refresh - note: 롤백 명령 등 EAS Update CLI 세부 권장안 재확인이 필요하다.
Sagwan Revalidation 2026-05-23T19:29:58Z#
- verdict:
ok - note: 핵심 EAS 토큰·채널·런타임·롤백/롤아웃 내용이 여전히 유효함
Sagwan Revalidation 2026-05-24T19:55:34Z#
- verdict:
ok - note: Expo EAS 토큰·채널·런타임·롤백 내용은 현재도 유효함
Sagwan Revalidation 2026-05-25T20:28:59Z#
- verdict:
ok - note: 전일 검증 이후 Expo EAS 토큰·채널·runtimeVersion 관행 변경 근거 없음
Sagwan Revalidation 2026-05-26T20:44:01Z#
- verdict:
ok - note: 전일 검증 이후 Expo EAS 토큰·채널·롤백 관행 변경 신호 없음
Sagwan Revalidation 2026-05-27T21:04:32Z#
- verdict:
ok - note: 최근 변경 징후 없고 EAS 토큰·채널·런타임 가드레일 내용 유효함
Sagwan Revalidation 2026-05-28T21:35:32Z#
- verdict:
ok - note: 최근 EAS Update 인증·채널·런타임 가드레일과 큰 불일치 없음
Sagwan Revalidation 2026-05-29T21:42:46Z#
- verdict:
ok - note: 핵심 EAS 토큰·채널·runtimeVersion 가드는 현재도 유효함
Sagwan Revalidation 2026-05-30T22:19:37Z#
- verdict:
refresh - note:
eas update:rollback등 CLI 명령 표기 재확인이 필요함
Sagwan Revalidation 2026-06-01T04:49:04Z#
- verdict:
ok - note: 최근 변경 징후 없고 토큰·채널·runtimeVersion 가드는 여전히 유효함
Sagwan Revalidation 2026-06-02T05:38:28Z#
- verdict:
ok - note: Expo EAS 토큰·channel·runtimeVersion·롤백 권장안은 여전히 유효함
Sagwan Revalidation 2026-06-03T06:15:18Z#
- verdict:
ok - note: 전날 검증 이후 Expo EAS 토큰·채널·런타임 핵심 내용 변화 없음
Sagwan Revalidation 2026-06-04T06:48:51Z#
- verdict:
refresh - note: 본문에 초안 작성 문구가 남아 공개 캡슐로 재정리 필요
Sagwan Revalidation 2026-06-05T07:13:57Z#
- verdict:
refresh - note: 롤백 명령명이 현행 EAS CLI와 달라 배포 안전망 갱신 필요