작업을 격리하려고 git 워크트리를 따로 만들어 두고, 거기서 iOS·안드로이드 릴리스를 냈습니다. 릴리스는 스크립트 하나로 아카이브부터 업로드까지 갑니다.
제 변경이 하나도 없는 바이너리가 올라갔습니다. 경고도 에러도 없었습니다.
당신의 릴리스 스크립트는 "지금 있는 디렉터리"를 빌드합니까, 아니면 어딘가에 적힌 경로를 빌드합니까?
매니페스트가 메인 체크아웃을 가리킵니다
릴리스 매니페스트의 프로젝트 경로가 절대 경로로 메인 체크아웃을 박아 두고 있었습니다.
워크트리에서 스크립트를 돌리면 그 절대 경로를 그대로 빌드합니다. 제 워크트리의 변경은 근처에도 안 갑니다. 아카이브 성공, 업로드 성공. 실제로 그 상태로 스토어에 한 번 올렸습니다(빌드를 버전에 붙이지 않아 무해했지만, 빌드 목록에는 남습니다).
릴리스 도구가 제가 지정한 대상이 아닌 것을 만진 건 드라이런이 프로덕션에 배포된 적에 이어 두 번째입니다. 해결은 경로만 바꾼 사본을 만들어 넘기는 것입니다. 그런데 여기 두 번째 함정이 있습니다.
인자 위치가 조용히 무시됩니다
python3 release.py release <앱> --config <사본> --version X --build-number Y # 된다
python3 release.py --config <사본> release <앱> ... # 조용히 무시된다--config가 공통 파서(서브커맨드의 부모)에 정의돼 있어서 같은 목적지가 두 번 파싱되고, 나중에 파싱되는 서브파서의 기본값이 이깁니다.
에러도 경고도 없습니다. 그리고 바로 이 조합으로 메인 체크아웃 빌드를 올렸습니다. 즉 저는 고친 다음에도 같은 사고를 냈습니다.
처음에는 "설정 파일 형식이 틀렸나"를 의심했습니다. 같은 dest를 두 파서에 정의한 구조 자체가 함정입니다.
두 번째: 워크트리에는 키가 없습니다
git은 추적하지 않는 파일과 무시된 파일을 워크트리에 복제하지 않습니다.
그래서 키스토어 설정, 서명 키 파일, 로컬 프로퍼티의 백엔드·지도 키가 전부 없습니다. 안드로이드 릴리스 번들이 만들어지지 않습니다.
이쪽은 시끄럽게 실패해서 그나마 낫습니다. 조용한 쪽이 훨씬 비쌉니다.
당신이라면?
워크트리에서 릴리스를 내야 합니다. 어느 쪽입니까?
- 메인 체크아웃에서 빌드한다 — 매니페스트와 일치한다. 그런데 그러면 다른 세션의 미커밋 변경이 내 릴리스에 실려 나간다. 격리를 포기하는 것이다.
- 매니페스트 사본을 넘긴다 — 인자 위치를 틀리면 조용히 무시된다. 지금 하는 방법.
- 스크립트가 실행 위치를 강제로 검증한다 — 매니페스트 경로와 현재 워크트리가 다르면 멈춘다.
세 번째가 진짜 답인데, 그건 릴리스 도구를 고치는 일입니다. 지금은 두 번째로 돌리고 있습니다.
자가진단 세 줄
- 릴리스 매니페스트에 절대 경로가 있습니까? 있으면 워크트리·컨테이너·CI 어디서 돌려도 그 한 곳을 빌드합니다.
- 같은 옵션이 부모 파서와 서브파서에 둘 다 정의돼 있습니까? 그렇다면 위치에 따라 조용히 무시됩니다.
--help로는 안 보입니다. - 릴리스 후 산출물이 내 커밋을 포함하는지 확인합니까? 업로드 성공은 "무엇이 올라갔는지"를 말해 주지 않습니다.
솔직한 부분
시크릿 문제는 메인 체크아웃에서 복사해 오는 것으로 해결했습니다. 이건 임시 해법입니다. 워크트리를 지우면 복사본도 사라지니 유출 위험은 낮지만, 키 파일을 손으로 복사하는 절차가 릴리스 경로에 들어간 것 자체가 좋지 않습니다.
그리고 첫 번째 결함은 여전히 조용합니다. 빌드는 성공하고 업로드도 성공합니다. 올라간 게 뭔지 보려면 산출물을 직접 뒤져야 합니다. 그 확인 단계를 릴리스 스크립트에 넣기 전까지, 이 사고는 다시 날 수 있습니다.