생산성 200% 올려주는 스타트업 자동화 (2)
“이번 버전 앱스토어 심사 끝났어요?” 이런 질문을 자주 받으신다면 이글 꼭 읽어보세요.
앱스토어 심사 상태는 Connect 앱으로 받는 푸시나 이메일을 통해서 알 수 있어요. 하지만 팀으로 일할때는 더 나은 방법이 필요해 보여요. 현재 어떤 버전이 배포 되었는지. 심사는 언제 제출되었는지. 심사가 리젝되었다면 빠르게 대응해야 하는데 상태를 늦게 알면 그만큼 대응도 늦어 지겠죠.
Slack 으로 앱스토어 리뷰 상태를 공유 받는 자동화를 만들어 볼게요. Cloudflare worker, AppStore Connect API를 사용할 겁니다.
먼저 Cloudflare 계정이 필요합니다. 100,000 requests per day 는 무료이니 지불할 돈은 없어요. 이 글에 좋아요만 누르면 됩니다.
Cloudflare Worker 생성
Cloudflare Worker는 Cloudflare의 글로벌 네트워크 엣지에서 JavaScript 코드를 실행하여 서버리스 애플리케이션 기능을 제공하는 서비스입니다.
Typescript 를 사용할 예정이고 Slack bot 와 Cloudflare의 Cron Triggers 를 이용해 10분에 한번 씩 AppStore Connect API 를 요청하고 변경사항이 있으면 슬랙으로 보내는 기능을 구현할 거에요. 이미 있는 코드를 사용만 하시면 되기 때문에 코딩이 필요하지는 않아요.
rocket-lite 를 사용할 겁니다. fork후 사용해도 되고 그대로 사용해도 되고 무방합니다.
터미널에서 Cloudflare 계정에 로그인 하고 rocket-lite 를 deploy 합니다
git clone https://github.com/trilliwon/rocket-lite.git
cd rocket-lite
npx wrangler login
npx wrangler deploy
실패 했네요?
에러 메시지를 확인해보면 KV namespace 를 찾을 수 없다고 하네요. KV 는 Cloudflare 의 key value 데이터 스토리지 입니다. APPSTORECONNECT_TOKEN_STORE 라는 key로 마지막 앱스토어 상태를 저장하고 중복으로 메시지 보내는걸 방지하는 목적이에요. 그럼 KV namespace 만들어 주면 됩니다.
Cursor AI 를 사용하고 있다면 이런식으로 사용해 보는것도 좋겠네요.
터미널에서 아래의 커맨드를 이용해 생성할 수 있습니다. 그러면 아래 이미지 처럼 id 를 찾을 수 있는데요. 이 id 를 wrangler.toml 파일에서 업데이트 해주면 됩니다.
npx wrangler kv:namespace create "APPSTORECONNECT_TOKEN_STORE"
다시 배포를 해봅니다.
npx wrangler deploy
별다른 이슈 없이 배포가 잘 되었을거라 생각이 드네요. 콘솔에 출력된 url 을 사용할 겁니다. 저는 https://rocket-lite.trilliwon-5e7.workers.dev/ 이렇게 생겼어요.
슬랙 앱 만들기
https://api.slack.com/apps/ 에 접속해 Create New App > From scratch 에서 앱 이름을 적절히 적절히 만들어서 생성합니다.
슬랙 앱과 Worker 를 연결해 줘야 하는데요. Env.ts 파일에 보면
- SLACK_SIGNING_SECRET
- SLACK_BOT_USER_OAUTH_TOKEN
이 두개가 필요해요. Slack app 페이지 Basic Information 에서 Signing Secret 을 복사 후에 아래와 같이 추가 하면 됩니다. BOT_USER_OAUTH_TOKEN 은 OAuth & Permissions > Bot User OAuth Token 을 사용합니다.
npx wrangler secret put SLACK_SIGNING_SECRET
npx wrangler secret put SLACK_BOT_USER_OAUTH_TOKEN
슬랙앱 설치
OAuth & Permissions 에서 Bot Token Scopes 를 추가해 줍니다. 저는 이렇게 두개만 선택했는데요. 필요할때 또 추가하면 될거에요. 위로 조금 스크롤 하면
Install to {WORKSPACE_NAME} 버튼이 있습니다. 이 버튼으로 설치해 주시면 끝납니다.
끝이 아니네요. 😓
슬랙앱 설정 페이지에서 Event Subscriptions 를 선택해 줍니다. 여기서 만들어둔 worker url 을 사용하면 되는데요.
Cloudflare worker url 뒤에 slack/events 를 추가합니다. 아래 처럼요.
https://rocket-lite.trilliwon-5e7.workers.dev/slack/events
모든게 완료 되었다면 슬랙봇을 태그해서 말을 걸어보세요. 아래처럼 뜨면 성공 입니다.
앱스토어 심사 상태 알람 받기
Env.ts 파일에 보면 아래와 같은 3개의 환경변수 들이 있습니다. 이거 추가해 주시면 진짜 끝나요.
// Env.ts file
...
// App Store Connect
APP_STORE_KEY_ID: string;
APP_STORE_ISSUER_ID: string;
APP_STORE_PRIVATE_KEY: string;
...
앱스토어 컨넥트에 로그인 합니다. Users and Access > Integrations 탭을 선택하고요.
Issuer ID를 복사하고 아래의 명령어로 추가합니다.
npx wrangler secret put APP_STORE_ISSUER_ID
Developer 권한으로 API Key를 생성하고 secret 값을 추가하면 됩니다.
npx wrangler secret put APP_STORE_KEY_ID
...
npx wrangler secret put APP_STORE_PRIVATE_KEY
다운로드 받은 AuthKey_{KEY_ID}.p8 파일을 텍스트 에디터로 열어서 줄바꿈은 \n 바꾼 후에 추가 하시면 됩니다. 아래 처럼요.
-----BEGIN PRIVATE KEY-----\nMIGTAgEAMBBBBBBBBBB9AgEGCCqGSBBBAwEHBHkwdwIBAQQgUdON+clekkc9UMYc\nQgG/y7ovUxoq+WQHa03wMO0MO7WgCgYIKoZIzj0DAQehRANCAATTrVb0ymUm5b5t\nAXND4cMu0NElkjA2iC7nvYZZp5a2XxQ12fP0duFOkqtIW2xWEmJosBM0bS2xuwB8
K162pYAB\n-----END PRIVATE KEY-----
이런 메시지를 받는다면 성공입니다.
심사 상태 체크를 빠르게 확인하고 싶으신 분들은 Cron Trigger 시간을 1분으로 줄여보세요.
wrangler.toml 파일의 [triggers] 를 바꾸시면 됩니다.
코드는 여기에 모두 공개되어 있습니다.
GitHub - trilliwon/rocket-lite
기능 확장하기
앱스토어 심사 상태 메시지 받으려고 Slack app 도 만들고 Cloudflare worker 도 띄우고 cron triggers 도 돌리고 해야 할게 많죠? 하지만 Slack bot 을 한번 만들어 놓으면 다양한 용도로 사용할 수 있어요. 예를 들면 슬랙에서 슬래시 커맨드로 쉽게 Testflight 나 Firebase 로 배포하는 기능을 만들 수 있고요. 결과 공유도 너무 쉬워집니다.
다음 글에서는 Rocket-lite 와 Github API 로 배포 프로세스를 만들어 볼게요.
생산성 시리즈
Fastlane + Github Actions + Slack App for iOS
⏰ 딜라이트룸에서 알라미와 함께 아침을 바꿀 분들을 모십니다 🙌
- 딜라이트룸 채용 공고 살펴보기 ⏰
(+ 여기서 지원하면 입사 축하금 100만원💸)