GitHub 머지 충돌을 로컬에서 테스트하는 방법
I’m happy to translate the article for you, but I’ll need the full text of the post (excluding the source line you’ve already provided). Please paste the content you’d like translated, and I’ll return a Korean version that preserves the original formatting, markdown, and code blocks.
실제로 중요한 작은 워크플로우
이러한 테스트에서는 아주 작은 흐름만 신경 씁니다:
- 풀 리퀘스트 열기
- PR을 다시 가져와 상태 확인
- 병합 단계 시도
- PR이 깔끔하게 병합될 수 없을 때 시스템이 어떻게 동작하는지 확인
이는 다음과 같은 명령으로 시작됩니다:
curl -X POST \
"https://api.github.com/repos/acme-corp/api-gateway/pulls" \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
-d '{
"title": "fix: handle nil pointer in rate limiter",
"body": "Fixes #142. Adds nil check before accessing connection pool.",
"head": "fix/rate-limiter-nil",
"base": "main"
}'
그리고 곧 다음과 같이 바뀝니다:
curl \
"https://api.github.com/repos/acme-corp/api-gateway/pulls/" \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json"
유용한 부분은 PR이 존재한다는 것 자체가 아니라, 그 이후에 브랜치를 깔끔하게 병합할 수 없을 때 여러분의 코드가 어떻게 동작하는가 입니다.
팀이 보통 속는 곳
The trap is treating “pull request created” as proof that the automation is basically done. Many GitHub workflows only become interesting after creation:
- The branch is stale (another change landed on
main). - The PR looks valid but is not mergeable.
- Your bot tries to continue anyway.
- Your UI says “ready” even though a human now has to intervene.
This is the same pattern that shows up in a lot of async integrations: step 1 succeeds, so the app assumes the whole job is healthy.
프로덕션 전에 테스트할 내용
만약 한 가지만 좁은 GitHub API 테스트를 할 시간이 있다면, 저는 merge‑conflict 브랜치를 테스트할 것입니다. 확인할 항목은 다음과 같습니다:
- 내 앱이 PR이 존재하지만 안전하게 병합될 수 없다는 것을 감지할 수 있는가?
- 사용자가 정상적인 병합 경로라고 착각하지 않도록, 올바른 상태를 노출하고 있는가?
- 재시도가 같은 PR을 계속 두드리는가, 아니면 충돌을 명확히 중단하고 표시하는가?
- 흐름에 웹훅이나 후속 읽기가 있다면, 최종 상태가 정확히 유지되는가?
마지막 부분이 첫 번째 API 호출보다 더 중요합니다. 많은 자동화 버그는 “PR을 만들 수 없었다”가 아니라 다음과 같습니다:
- “우리는 PR을 만들었지만, 이후 상태를 잘못 읽었다.”
- “잘못된 단계를 재시도했다.”
- “사용자에게 병합이 차단되었다는 것을 너무 늦게 알렸다.”
왜 이것이 다른 PR 해피 패스보다 더 나은 테스트인가
해피‑패스 풀 리퀘스트 테스트는 주로 GitHub와 통신할 수 있음을 증명합니다.
머지‑충돌 테스트는 통합이 변화하는 일반적인 레포 상태를 견딜 수 있는지를 알려줍니다. 이는 다음과 같은 경우에 훨씬 더 좋은 신호가 됩니다:
- 릴리스 도구
- PR을 여는 AI 코딩 에이전트
- 수정을 자동 병합하려는 내부 자동화
- 브랜치 상태가 생성부터 병합까지 깨끗하게 유지된다고 가정하는 모든 워크플로우
또한 더 현실적입니다. 실제 저장소는 지속적으로 변동합니다. 테스트가 충돌 브랜치를 전혀 다루지 않는다면, 병합 로직이 과도하게 좋은 평가를 받고 있을 가능성이 높습니다.
내가 과소평가된다고 생각하는 부분
유용한 질문은 단순히 다음과 같은 것이 아닙니다:
“GitHub API를 통해 PR을 생성할 수 있나요?”
그것은 다음과 같습니다:
“PR이 병합 가능 상태를 잃었을 때, 무슨 일이 일어났는지 그리고 다음에 무엇을 해야 하는지 아직 알고 있나요?”
이것이 엔드포인트 테스트와 워크플로우 테스트 사이의 차이점입니다. 엔드포인트 문서는 요청 형태를 설명합니다. 실제 통합 작업은 브랜치 상태가 변한 후 시스템이 무엇을 해야 하는지를 결정하는 것입니다.
로컬에서 이를 더 쉽게 만들고 싶다면
저는 이를 넓은 “GitHub API 통합” 검증보다는 좁은 워크플로우로 테스트하는 것을 좋아합니다. 그래서 저는 실행 가능한 GitHub docs portal on FetchSandbox를 유지하고 있습니다. 유용한 점은 PR을 열고, 다시 가져오고, 나중에 브랜치를 한 곳에서 검사할 수 있다는 점이며, 생성 단계에서 멈추지 않는다는 것입니다.
저에게는 머지‑충돌 경로가 작은 실패‑모드 테스트가 더 긴 해피‑패스 데모보다 더 많은 것을 가르쳐 주는 경우 중 하나입니다.
다른 사람들은 이것을 어떻게 처리하는지 궁금합니다. GitHub 자동화가 PR을 열고 나중에 충돌이 발생하면, 이를 일급 상태로 표시하시나요, 아니면 여전히 로그를 파고들며 혼란스러운 재시도로 이어지나요?