← 노하우 목록

FROM THE WORKSHOP / 노하우

신원 없는 git commit은 어떤 기계에선 되고 어떤 기계에선 rc=128 — 픽스처의 숨은 노드 의존

user.email 미설정 시 git은 사용자명@호스트명으로 신원을 지어내는데 macOS는 성공하고 일부 리눅스는 rc=128로 죽는다. 픽스처를 만든 노드에서만 초록인 숨은 노드 의존이 생긴다. 픽스처 커밋마다 -c 로 신원을 명시하고 격리 축에는 useConfigOnly 를 깔아 모든 노드가 같은 시험을 치게 한다.

강대종 · 마이너스베타스튜디오

신원 없는 git commit은 어떤 기계에선 되고 어떤 기계에선 rc=128 — 픽스처의 숨은 노드 의존

격리 샌드박스 안에서 임시 git 저장소를 만들어 커밋까지 해 보는 테스트 픽스처가 있었다. macOS 노드에서는 몇 달을 초록으로 돌았는데, 리눅스 노드에서 돌리자 rc=128로 죽었다. 코드는 한 글자도 다르지 않았다.

원인은 git의 신원(author identity) 추론이다. user.email이 설정돼 있지 않을 때 git은 사용자명@호스트명으로 신원을 지어내는데, macOS는 호스트명.local 꼴로 그럴듯한 값이 만들어져 커밋이 성공하고, 일부 리눅스 환경은 추론이 실패해 “Please tell me who you are” rc=128로 죽는다. 격리 샌드박스는 HOME을 갈아끼우므로 평소 쓰던 ~/.gitconfig도 안 보인다. 즉 “같은 테스트”가 노드에 따라 다른 코드 경로를 탄다.

왜 위험한가

  • 픽스처를 만든 노드에서는 영원히 초록이라 결함이 있는지도 모른 채 배포된다.
  • 다른 노드에서 빨강이 나면 “그 노드가 이상하다”로 오진하기 쉽다. 실제로는 만든 노드가 우연히 관대했던 것이다.
  • 반대로 “내 노드에서 빨강”만 보고 전체가 깨졌다고 단정하는 것도 같은 함정의 거울상이다.

룰

  1. 픽스처 안의 모든 commit에 신원을 명시한다: git -c [email protected] -c user.name=test commit .... 환경 추론에 맡기지 않는다.
  2. 격리 축에는 git config user.useConfigOnly true를 깔아 신원 추론 자체를 꺼 버린다. 그러면 어떤 노드에서든 “신원 누락”이 같은 방식으로, 즉시, 명시적으로 실패한다.
  3. 단일 노드 관측으로 전 함대를 단정하지 않는다. 초록이든 빨강이든, 최소 한 대의 대조군에서 재현해 보고 나서 적는다.

체크리스트

  1. 테스트 픽스처가 임시 저장소에서 commit을 만드는가? → 신원 -c 명시 여부부터 확인.
  2. 샌드박스가 HOME을 재지정하는가? → 평소 gitconfig에 기대던 가정이 전부 무효다.
  3. “이 노드에서만 실패”를 보고서에 적기 전에, 실패·성공 각각 대조군이 있는가?

한 문장으로. 환경이 지어내 주는 값에 기댄 테스트는 그 환경의 관대함까지 같이 테스트하는 것이다 — 명시하면 모든 노드가 같은 시험을 친다.

기록은 다음 시작이 됩니다.노하우 더 읽기 ↗이 작업장의 제품 ↗
작업장 전체 페이지 목적에 맞는 페이지 찾기