# EAS Update 게이트 적용하기

EAS CLI는 `EXPO_TOKEN` 환경 변수에 담긴 Expo 액세스 토큰으로 배포합니다. Mocco가 그 토큰을 보관하다가 게이트가 승인된 뒤 배포 단계에 전달합니다. 먼저 [파이프라인에 토큰 발급하기](https://www.mocco.club/docs/ko/articles/yjbg5q-pipeline)를 설정하세요. 이 페이지는 Expo 쪽 설정을 다룹니다.

## 토큰 만들기

개인 토큰 대신 **로봇 사용자**(robot user)를 사용하세요. 개인 액세스 토큰은 그 사람이 접근할 수 있는 모든 Expo 계정에서 그 사람으로 동작합니다. 로봇 사용자는 한 계정에만 속하고, 로그인할 수 없으며, 부여한 역할만 가집니다. 업데이트를 배포할 수 있는 **Developer** 역할을 부여하세요. 그런 다음 계정의 액세스 토큰 설정에서 로봇 사용자용 액세스 토큰을 만듭니다. Expo의 [programmatic access](https://docs.expo.dev/accounts/programmatic-access/)와 [roles](https://docs.expo.dev/accounts/account-types/#manage-access) 페이지를 참고하세요.

Expo에서는 토큰을 특정 프로젝트나 채널 하나로 제한할 수 없습니다. Enterprise 플랜에서는 *protected channels*로 프로덕션 배포를 Release Manager 역할로 제한할 수 있습니다. 이를 쓰지 않으면 Release Manager 역할의 권한은 Developer와 같습니다.

토큰은 Mocco의 **OTA updates** 페이지, **Your OTA tool** 탭에서 도구를 **EAS Update**로 고르고 `acme-production` 같은 이름으로 저장합니다. 프로바이더 ID는 `ota-eas`입니다.

## 배포하기

파이프라인 가이드의 배포 job에서 전달받은 토큰을 `EXPO_TOKEN`으로 내보내고, 프롬프트 없이 `eas update`를 실행합니다. 프로젝트는 이미 EAS에 연결되어 있어야 합니다(앱 설정의 `extra.eas.projectId`).

```yaml
      - name: Get the publishing token from Mocco
        run: |
          # … as in the pipeline guide …
          echo "EXPO_TOKEN=$secret" >> "$GITHUB_ENV"

      - uses: actions/setup-node@v4
        with: { node-version: 22 }
      - run: npm ci
      - run: npx eas-cli@latest update --channel production --environment production --message "${{ github.event.client_payload.commitSha }}" --non-interactive
```

`--environment`는 Expo SDK 55부터 필수입니다. `--rollout-percentage 10`을 쓰면 먼저 일부 기기에만 배포하고, `-p ios`나 `-p android`로 플랫폼을 제한할 수 있습니다. [EAS CLI reference](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/README.md)를 참고하세요.

## 롤백하기

두 번째 파이프라인(온콜 엔지니어가 혼자 게이트를 승인하는 파이프라인)에서 같은 토큰을 전달받아 롤백을 실행합니다.

```bash
npx eas-cli@latest update:rollback <update group id> --message "Roll back" --non-interactive
```

이 명령은 지정한 업데이트 그룹의 바로 이전 그룹을 다시 배포하고, 이전 그룹이 없으면 빌드에 포함된 내장 번들로 되돌아갑니다. `eas update:roll-back-to-embedded --channel production --runtime-version <version> --non-interactive`는 곧바로 내장 번들로 되돌립니다.

## 교체하기

로봇 사용자의 새 액세스 토큰을 만들고, Mocco에서 토큰 카드의 **Rotate**를 선택해 붙여 넣은 뒤, Expo에서 이전 토큰을 삭제합니다. 카드의 지문이 바뀝니다.
