앱 열몇 개를 같은 방식으로 스토어에 올립니다. 앱마다 배포 스크립트가 하나씩 있고, 형태가 거의 같아서 손이 기억합니다 — 먼저 --dry-run으로 돌려 보고, 출력이 의도한 것과 같으면 플래그를 떼고 다시 돌립니다.
그날도 --dry-run을 붙여 돌렸습니다. 버전이 그대로 프로덕션에 게시됐습니다.
당신의 "먼저 dry-run" 습관은, 그 플래그를 실제로 구현한 스크립트 위에서만 안전장치입니다. 당신의 스크립트들은 전부 그 플래그를 구현하고 있습니까?
그 스크립트에는 argparse가 없었습니다
--dry-run도, --track도, --version-name도, --release-notes도 전부 조용히 무시됩니다. 파일 상단에 상수가 하나 있고,
TARGET_TRACK = "production"실행하면 즉시 프로덕션에 커밋합니다. 인자를 검사하지도, 경고하지도 않습니다. sys.argv를 아예 읽지 않으니까요.
반전은 이 스크립트만 다르다는 데 있습니다. 같은 저장소의 다른 앱 배포 스크립트는 전부 argparse와 --dry-run을 지원합니다. 그래서 습관이 그대로 통할 거라는 기대가 생겼고, 그 기대는 열 몇 번 맞았습니다. 한 번 틀렸을 뿐입니다.
이게 도구 실수와 다른 점입니다. 틀린 도구를 쓴 게 아니라, 맞는 도구들 사이에 하나만 다른 것이 섞여 있었습니다. 그리고 다르다는 사실은 파일을 열어야만 보입니다.
두 번째 함정이 함께 나왔습니다. 릴리스명도 상수라서, 새 버전에 옛 릴리스명이 그대로 붙었습니다. 릴리스 노트도 옛 내용이 나갔습니다. 게시 자체가 의도와 같았기 때문에 그것마저 나중에야 눈에 띄었습니다.
당신이라면 어떻게 하시겠습니까
같은 일을 하는 스크립트가 열몇 개 있고, 겉모습이 똑같습니다. 하나를 새로 만들 때 나머지와 인터페이스가 같은지 매번 확인하겠습니까? 아니면 "복사해서 고쳤으니 같겠지" 하고 넘어가겠습니까?
이 스크립트는 남들이 argparse를 갖기 전에 만들어졌을 가능성이 큽니다. 인터페이스는 시간이 지나면서 갈라지고, 갈라졌다는 사실은 조용합니다.
코드·명령·수치
- 문제의 형태(요지):
TARGET_TRACK = "production" # 상수
RELEASE_NAME = "1.3.7 — ..." # 상수, 안 고치면 새 버전에 옛 이름이 붙는다
# argparse 없음 -> sys.argv 미사용 -> 모든 플래그가 무시된다- 사후 조치로 스크립트 맨 앞에 플래그를 넘기면 즉시 죽는 가드를 넣었습니다:
if len(sys.argv) > 1:
sys.exit("이 스크립트는 인자를 받지 않습니다. 즉시 프로덕션에 커밋합니다.")지원하지 않는 플래그를 조용히 무시하는 것보다 죽는 게 낫습니다. 다만 이건 이 파일 하나를 고친 것이고, 저장소의 다른 복사본들이 같은 상태인지는 별도로 확인해야 합니다.
- 부수 발견: 이 앱은 저장소에서 유일하게 versionCode/versionName이 빌드 파일에 상수로 박혀 있어 gradle 프로퍼티 주입이 안 통합니다. 그래서 번들 검증이 한 번 더 필요했고, 실제로 그 검증이 게시된 versionCode를 확인해 줬습니다.
- 릴리스명·노트는 나중에 트랙 PUT + commit으로 교정할 수 있었습니다. 게시 자체는 되돌릴 수 없습니다.
자가진단 3개
- 같은 일을 하는 스크립트가 여러 개 있습니까? 그것들의 인자 인터페이스가 실제로 같은지 확인해 본 적이 있습니까, 아니면 "비슷하게 생겼으니 같겠지"입니까?
- 당신의 안전 플래그(
--dry-run,--check,-n)는 파싱되고 있습니까? 지원하지 않는 플래그를 넘겼을 때 스크립트가 죽습니까, 아니면 무시하고 실행합니까? - 배포·삭제·과금처럼 되돌릴 수 없는 동작을 하는 스크립트에, 인자 없이 실행하면 위험하다는 것을 알리는 가드가 있습니까?
솔직한 부분
피해는 없었습니다. 나간 내용이 어차피 올리려던 것과 같았고, 스토어 리스팅도 직전 버전과 동일함을 라이브 대조로 확인했습니다. 운이 좋았던 것이지 판단이 옳았던 게 아닙니다 — 준비가 덜 된 버전이었다면 그대로 나갔을 겁니다. "먼저 dry-run"은 좋은 습관이지만, 저는 습관을 안전장치로 착각했습니다. 습관은 도구가 그 플래그를 실제로 구현했을 때만 안전장치입니다.
자동화가 초록불을 켜면서 조용히 어긋나는 계열의 앞선 사례가 워크플로는 2주 내내 초록불이었고, 사이트는 2주 내내 낡아 있었습니다입니다.
지금 딱 하나만 해보세요. 되돌릴 수 없는 동작을 하는 스크립트 하나를 골라, 지원하지 않는 플래그를 하나 붙여서 돌려 보시기 바랍니다. 죽습니까, 아니면 그냥 실행됩니까.