본문 바로가기
C.W.K.
Stream
Lesson 01 of 07 · published

배포는 TestFlight고, 사실은 네 개야

~15 min · testflight, delivery, app-store-connect, pipeline, reporting

Level 0번들 열어본 사람
0 XP0/81 lessons0/17 achievements
0/100 XP to next level100 XP to go0% complete
"사실은 넷이고, 배포는 마지막 하나뿐이야."

빌드 확인은 배포가 아니야

앱을 아이폰에 올리는 방법은 두 가지인데, 각각 답하는 질문이 달라. Xcode에서 실행하거나 devicectl로 설치하면 등록된 기기가 적힌 개발 프로필로 서명해. 그 기기는 페어링돼 있고, 개발자 모드여야 하고, 잠금도 풀려 있어야 해. 게다가 한 번에 한 대뿐이야. 여기서 답하는 질문은 "이 빌드가 실제 기기에서 도나?"야. 즉 빌드 확인이지. TestFlight는 App Store와 같은 방식으로 서명하고 모든 테스터 기기에 무선으로 설치해. 다음 빌드가 나오면 그 기기에서 자동으로 업데이트되게 할 수도 있고. 이쪽이 답하는 질문은 "이 앱이 쓰는 사람들 손에 들어갔나?"야.

한도는 애플이 정한 거라, 숫자로 기억해둘 만해. TestFlight 빌드는 90일 동안 테스트할 수 있어. 내부 테스터는 팀의 App Store Connect 사용자 중 최대 100명이고, 이들이 받는 빌드는 심사가 필요 없어. 외부 테스터는 최대 10,000명까지 가능하고, 이쪽 빌드는 베타 심사를 받아야 할 수도 있어. 가족 앱은 전부 내부 그룹으로 나가. 첫 빌드든 백 번째 빌드든 예외 없이 그 길로 가.

이 규칙을 낳은 실패

한 코딩 세션이 터미널 앱의 첫 iOS 마일스톤을 끝냈어. 그러고는 주인의 아이폰에 케이블로 설치하고, TestFlight는 나중 단계로 적어뒀지. 그런데 코딩 엔진 앱이 12일 전에 명령 하나로 도는 TestFlight 파이프라인을 이미 내놓았고, 이후의 모든 앱은 그걸 기준 삼아 따라 하기로 정해져 있었어. 결국 주인이 직접 짚어줘야 했어. 케이블 설치 자체는 아무 문제가 없었어. 그냥 배포가 아니었을 뿐이야. 그걸 끝났다고 한 대가로 한 사이클을 통째로 날렸고. 케이블 설치에 자꾸 끌리는 건, 튜토리얼 대부분이 그 방법을 보여주고 1분이면 결과가 나오기 때문이야. 그래서 판단에 맡기지 않고 규칙으로 적어둔 거야.

사실 넷을 따로따로 보고해

업로드가 성공해도 배포는 아니야. 이어지는 사실은 네 개고, 보고할 땐 그중 참인 것 하나를 콕 집어 말해.

  1. 업로드됨. 실패할 수도 있는 export 관문을 통과한 뒤 파이프라인이 _UPLOAD_OK 줄을 찍었어.
  2. 처리됨. App Store Connect가 빌드 처리를 끝냈어. 몇 분 걸릴 수 있어. 초록색으로 끝난 실행 뒤에 거절 이메일이 날아오는 것도 이 단계야.
  3. 배정됨. 내부 그룹의 빌드 목록에 들어갔어.
  4. 설치됨. 기기에 새 빌드가 보이거나 테스터 행에 Installed라고 떠. 배포라고 부를 수 있는 건 이것 하나뿐이야.

가족 파이프라인은 모든 iOS 레포에 똑같이 들여놓은 공유 프로그램이야. 앱마다 다른 사실은 그 옆의 작은 설정 파일에 두고. 마지막으로 찍는 줄에 규칙을 한 번 더 적어서, 다음에 로그를 읽는 사람이 사실 1을 사실 4로 착각하지 못하게 해.

Code

파이프라인 하나, 모드 셋, 그리고 찍는 줄·bash
scripts/mobile-testflight.sh --plan     # check every fact, build nothing
scripts/mobile-testflight.sh            # guards, tests, build number, archive, .ipa
scripts/mobile-testflight.sh --upload   # ...and hand the build to App Store Connect

# The last line of a successful upload says exactly one thing:
# SPARK_MOBILE_UPLOAD_OK build 42 source 3f2c9e1 — uploaded is fact 1 of 4: Apple processing,
#   the internal group and the INSTALLED build are still separate facts
공유 파이프라인 옆에 두는 앱의 사실들·bash
# scripts/mobile-testflight.config.zsh: the app's facts. The pipeline itself is shared.
mtf_app=SparkMobile
mtf_marker=SPARK_MOBILE
mtf_mobile=clients/apple/SparkMobile
mtf_project=SparkMobile.xcodeproj
mtf_scheme=SparkMobile
mtf_bundle_id=com.example.spark.mobile
mtf_icon=clients/apple/SparkMobile/Assets.xcassets/AppIcon.appiconset/AppIcon.png
mtf_simulator_env=SPARK_SIMULATOR_ID
mtf_inputs=(clients/apple/SparkMobile Package.swift Sources)
mtf_build_number=project-yml
mtf_watch=no
mtf_commit_subject=spark-mobile

External links

Exercise

SparkMobile 설정 파일을 쓰고, 빌드는 하지 않고 확인한 사실만 전부 찍는 --plan 실행을 만들어. 이어서 네 사실마다 나중에 네가 채울 짧은 상태 메모 틀을 써("빌드 42: 업로드됨, 아직 처리 안 됨"). 마지막으로 Spark README에 케이블 설치를 배포 완료로 보고하는 걸 금지하는 규칙 한 줄을 넣어.
Hint
--plan 모드는 관문 대부분을 미리 돌려보는 거야. 설정 파일이 있고 필수 이름이 다 정해졌는지, 시뮬레이터 변수가 설정됐는지, 프로젝트에 숫자 빌드 번호가 있는지, 테스트 진입점을 실행할 수 있는지 봐. 사실마다 한 줄씩 찍어서, 계획이 실패하면 뭐가 빠졌는지 이름으로 드러나게 해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.