React Native에서 CodePush 배포 자동화 구축기

문제 상황

프로덕션 앱에서 긴급 버그가 발견됐는데, 앱스토어 심사 대기 시간이 최소 1~2일이었다. JavaScript 번들만 변경하면 되는 상황이었기에 CodePush 도입을 결정했다.

CodePush 설정

App Center CLI로 앱을 등록하고 배포 키를 발급받았다.

npm install -g appcenter-cli
appcenter login
appcenter apps create -d MyApp-iOS -o iOS -p React-Native
appcenter apps create -d MyApp-Android -o Android -p React-Native

app.json에 CodePush 설정을 추가했다.

import codePush from 'react-native-code-push';

const App = () => {
  // ...
};

const codePushOptions = {
  checkFrequency: codePush.CheckFrequency.ON_APP_RESUME,
  installMode: codePush.InstallMode.ON_NEXT_RESUME,
};

export default codePush(codePushOptions)(App);

GitHub Actions 자동화

develop 브랜치는 Staging으로, main 브랜치는 Production으로 자동 배포되도록 워크플로우를 작성했다.

name: CodePush Deploy

on:
  push:
    branches: [main, develop]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - run: npm ci
      - name: Deploy to CodePush
        run: |
          if [ "${{ github.ref }}" == "refs/heads/main" ]; then
            appcenter codepush release-react -a MyOrg/MyApp-iOS -d Production
          else
            appcenter codepush release-react -a MyOrg/MyApp-iOS -d Staging
          fi
        env:
          APPCENTER_ACCESS_TOKEN: ${{ secrets.APPCENTER_TOKEN }}

주의사항

CodePush는 네이티브 코드 변경에는 사용할 수 없다. Info.plistAndroidManifest.xml 수정, 네이티브 모듈 추가 시에는 여전히 스토어 배포가 필요하다.

또한 mandatory 옵션을 남발하면 사용자 경험이 나빠진다. 치명적인 버그가 아니면 optional 업데이트로 배포하는 게 낫다.

결과

핫픽스 배포 시간이 1~2일에서 10분 이내로 단축됐다. 다만 업데이트 적용률을 모니터링하며, 필요시 강제 업데이트 여부를 판단하는 프로세스가 필요했다.