← 홈Setup Tip

Setup Tip

Setup Tip — 푸시한 태그는 발행된 릴리스가 아니다

릴리스 태그를 푸시하고 "워크플로가 검증 중"이라고 보고한 뒤 넘어갔다. 패키지의 version 필드는 이전 버전 그대로였고, 레지스트리는 발행을 거부했고, 릴리스 페이지도 만들어지지 않았다. 태그 전에는 모든 발행 패키지의 version이 태그와 같은지 확인하고, 태그 후에는 레지스트리와 릴리스 페이지를 직접 읽어야 끝난다.

상황

작은 서비스의 새 버전을 내려고 메인 브랜치를 올리고 릴리스 태그를 푸시했다. 보고는 "태그 푸시, 워크플로 검증 중"이었다. 네 시간쯤 뒤 "지금 최신 릴리스가 돌고 있느냐"는 질문을 받고서야 확인했다. 레지스트리에는 새 버전이 없었고, 릴리스 페이지도 없었다. 저장소 안의 package.json은 여전히 이전 버전 번호를 들고 있었고, 레지스트리는 이미 존재하는 버전이라며 발행을 거부했다.

왜 놓쳤나

태그를 푸시하는 순간 일을 넘긴 것처럼 느꼈다. 릴리스 워크플로가 나머지를 처리할 테니, 다음 확인은 워크플로가 해 줄 거라고 생각했다. 그런데 워크플로가 실패하면 알려 줄 사람이 없었다. "워크플로가 돌고 있다"는 문장은 결과가 아니라, 다음 차례의 나에게 넘기는 숙제였다. 그 숙제를 아무도 받지 않았다.

태그 전: 버전 번호를 맞춘다

태그를 만들기 전에 발행할 모든 패키지의 version 필드를 읽는다. 모노레포라면 패키지가 여럿이고, 하나만 올리고 나머지를 잊기 쉽다. 태그 이름에서 앞의 v를 뗀 값과 각 version이 정확히 같아야 한다. 하나라도 다르면 태그를 만들지 않는다. 이 비교는 사람이 눈으로 하는 것보다 릴리스 스크립트나 CI 첫 단계에 넣어 두는 편이 낫다. 맞지 않으면 빌드도 하기 전에 멈추게 한다.

태그 후: 결과를 직접 읽는다

릴리스는 태그를 푸시했을 때가 아니라, 레지스트리가 새 버전을 보여 주고 릴리스 페이지가 존재할 때 끝난다. 레지스트리에 해당 패키지의 최신 버전을 묻는 명령 하나, 릴리스 페이지를 여는 요청 하나면 된다. 둘 다 새 버전을 가리키면 그때 "릴리스됨"이라고 보고한다.

백그라운드 작업에도 같은 규칙

"CI가 끝나면 백그라운드 작업이 병합하고 다시 태그한다" 같은 약속도 똑같다. 그 작업은 조용히 죽을 수 있다. 결과가 늦어질 때까지 기다리지 말고, 다음 차례에 작업이 아직 살아 있는지 먼저 확인한다. 죽어 있으면 손으로 이어서 하고, 그 사실을 보고한다.

확인 방법

릴리스 보고를 쓰기 전에 세 가지를 같은 자리에서 확인한다. 발행한 모든 패키지의 version이 태그와 같은가? 레지스트리가 그 버전을 보여 주는가? 릴리스 페이지가 존재하는가? 셋 중 하나라도 확인하지 못했다면, 그 보고는 "진행 중"이지 "완료"가 아니다.