# hot-updater 게이트 적용하기

hot-updater에는 자체 토큰이 없습니다. `hot-updater deploy`는 설정해 둔 스토리지와 데이터베이스(Supabase, Cloudflare R2와 D1, CloudFront를 쓰는 AWS S3, Firebase 등)의 자격 증명으로 번들을 기록합니다. `hot-updater init`은 이 자격 증명을 `.env.hotupdater`에 저장합니다. 이 자격 증명을 가진 사람은 누구나 배포할 수 있으므로, Mocco가 보관하는 대상이 바로 이것입니다. 먼저 [파이프라인에 토큰 발급하기](https://www.mocco.club/docs/ko/articles/yjbg5q-pipeline)를 설정하세요.

## 자격 증명 저장하기

CI용 자격 증명은 프로바이더가 허용하는 한 가장 좁은 권한으로 만들고, 초기 설정에 쓴 자격 증명과 분리하세요. hot-updater 문서도 AWS에 대해 이를 권장합니다. Supabase는 배포에 service-role 키가 필요한데 권한 범위가 넓으므로 Mocco에만 보관하세요.

Mocco는 토큰 하나에 시크릿 하나를 저장하므로, `.env.hotupdater` 전체 내용을 토큰으로 저장합니다. 배포에 필요한 `KEY=value` 줄을 모두 넣으세요. 예를 들어 Cloudflare는 다음과 같습니다.

```
HOT_UPDATER_CLOUDFLARE_ACCOUNT_ID=…
HOT_UPDATER_CLOUDFLARE_R2_BUCKET_NAME=…
HOT_UPDATER_CLOUDFLARE_R2_ACCESS_KEY_ID=…
HOT_UPDATER_CLOUDFLARE_R2_SECRET_ACCESS_KEY=…
HOT_UPDATER_CLOUDFLARE_D1_DATABASE_ID=…
HOT_UPDATER_CLOUDFLARE_API_TOKEN=…
```

Mocco의 **OTA updates** 페이지, **Your OTA tool** 탭에서 도구를 **hot-updater**로 고르고 `acme-production` 같은 이름으로 추가합니다. 프로바이더 ID는 `ota-hot-updater`입니다. 프로바이더별 변수 이름은 hot-updater의 [managed provider docs](https://github.com/gronxb/hot-updater/tree/main/docs/content/docs/managed)에 있습니다.

## 배포하기

전달받은 값은 여러 줄이므로, 파이프라인 가이드의 `OTA_TOKEN` 한 줄 대신 아래 가져오기 단계를 사용합니다. 이 단계는 값을 `.env.hotupdater`에 기록하고 각 값을 마스킹합니다.

```yaml
      - name: Get the storage credentials from Mocco
        run: |
          body=$(jq -nc --arg run "$MOCCO_RUN_ID" --argjson step "$MOCCO_STEP" --arg token "$MOCCO_RUN_TOKEN" \
            '{runId: $run, stepIndex: $step, token: $token}')
          curl -fsS -X POST "${MOCCO_CALLBACK_URL%/callback}/credentials" \
            -H 'content-type: application/json' -d "$body" | jq -r '.credentials.value' > .env.hotupdater
          while IFS='=' read -r _ value; do
            if [ -n "$value" ]; then echo "::add-mask::$value"; fi
          done < .env.hotupdater

      - run: npm ci
      - run: npx hot-updater deploy -p android -c production -m "${{ github.event.client_payload.commitSha }}"
```

`-p`를 생략하면 iOS를 배포한 다음 Android를 배포합니다. `-r 25`는 일부 기기에만 롤아웃합니다. [deploying](https://github.com/gronxb/hot-updater/blob/main/docs/content/docs/guides/deploy.mdx)을 참고하세요.

## 롤백하기

번들을 비활성화하면 기기가 이전 번들로 돌아갑니다.

```bash
npx hot-updater bundle disable <bundle id> -y
```

`npx hot-updater bundle list -p android --json`으로 번들 ID를 확인할 수 있습니다. 롤백 파이프라인에서 같은 자격 증명을 전달받아 실행하세요. [console guide](https://github.com/gronxb/hot-updater/blob/main/docs/content/docs/guides/console.mdx)를 참고하세요.

## 교체하기

프로바이더에서 키를 교체하고 해당 줄을 업데이트한 뒤, Mocco에서 토큰 카드의 **Rotate**를 선택하고 새 내용을 붙여 넣습니다. 그런 다음 프로바이더에서 이전 키를 폐기하세요.
