← 홈Setup Tip

Setup Tip

Setup Tip — 오래된 base 위의 초록 PR은 오래된 base만 증명한다

PR의 CI가 전부 초록이라 병합했는데, 병합 직후 기본 브랜치가 빨개진다. 실패한 건 그 PR이 새로 추가한 테스트다. PR CI는 수십 커밋 뒤처진 base 위에서 돌았고, 그 사이 테스트가 의존하는 코드가 바뀌어 있었다. 브랜치가 많이 뒤처져 있으면 병합 결과 트리에서 영향받는 테스트를 직접 돌리거나 먼저 rebase를 요구하라.

상황

재시도 동작을 고치는 PR이 들어온다. 새 테스트가 몇 개 붙어 있고, PR의 CI는 모두 통과했다. 리뷰도 끝났다. 병합 버튼을 누르고 "PR CI가 이 파일들을 그대로 검증했다"는 코멘트를 남긴다. 몇 분 뒤 기본 브랜치의 전체 CI가 한 샤드에서 실패한다. 실패한 네 개는 전부 방금 병합한 PR이 추가한 테스트다.

초록이 거짓말을 한 이유

그 PR은 기본 브랜치보다 서른 커밋 넘게 뒤처진 지점에서 갈라져 있었다. 그 사이 다른 PR들이 테스트가 기대는 provider 코드를 바꿨다. PR의 CI는 브랜치 자체를 검증했을 뿐, 병합 후에 실제로 존재하게 될 트리를 검증하지 않았다. 충돌이 없다는 건 텍스트가 겹치지 않는다는 뜻이지, 동작이 맞물린다는 뜻이 아니다. 같은 테스트 파일이 PR head에서도, 병합 전 기본 브랜치에서도 통과했다는 사실이 바로 그 증거다. 둘 중 어느 쪽도 병합 결과가 아니었다.

병합 전에 돌릴 것

브랜치가 많이 뒤처져 있고 바뀐 코드에 닿는 테스트가 있다면, 기본 브랜치의 현재 head 위에 그 브랜치를 시험 병합한 임시 워크트리를 만들고 거기서 영향받는 테스트 파일을 돌린다. 저장소가 허용한다면 더 간단한 방법은 rebase를 요구해 CI가 최신 base 위에서 다시 돌게 하는 것이다. 어느 쪽이든 증거는 "병합될 트리"에서 나와야 한다.

어떤 테스트가 영향받는지 고르는 법

변경한 파일 옆의 테스트만으로는 부족하다. 같은 날 다른 병합에서, 마커 파일의 의미를 바꾼 PR이 그 파일 이름을 직접 확인하는 다른 테스트를 깨뜨렸다. 병합 트리에서 돌린 건 수정한 파일과 관련된 테스트뿐이었다. PR이 계약을 바꾼다면, 즉 파일 이름, 이벤트 이름, 설정 키, 상태 값 같은 것을 바꾼다면 그 이름으로 테스트 전체를 검색하고, 그것을 단정하는 파일을 전부 돌려라.

로컬 환경이 거짓말할 때

로컬에서 재현이 안 될 수도 있다. 기본 브랜치에서조차 환경 때문에 같은 파일의 테스트가 수십 개 실패한다면, 로컬 결과는 기준선과 비교할 때만 의미가 있다. 변경 전과 변경 후를 같은 환경에서 돌려 실패 집합이 같은지 비교하라. 그게 불가능하면 실패한 CI 작업을 한 번 재실행해 flake인지 확인하고, 판단은 CI의 병합 트리 결과에 맡긴다.

확인 방법

병합 코멘트에 "CI 통과"라고 쓰기 전에, 그 CI가 돈 커밋이 어떤 base 위에 있는지 확인한다. 기본 브랜치와의 거리가 크다면 병합 트리에서 돌린 테스트 목록과 결과를 함께 적는다. 이미 잘못된 주장을 남겼다면, 빨간 기본 브랜치를 발견한 즉시 같은 자리에 정정을 단다.