Repository navigation
열린 PR 끼리 겹치는 충돌을 머지 전에 라벨로 알린다 — 형제 충돌 자동 경고 #1750
Copy link
Copy link
Closed
Labels
area:platformCI·빌드·릴리스·저장소 운영 영역CI·빌드·릴리스·저장소 운영 영역maintenanceCI·빌드·의존성·저장소 운영 유지보수CI·빌드·의존성·저장소 운영 유지보수
Description
작업 유형
maintenance — CI·빌드·의존성·저장소 운영 유지보수
주 담당 모듈
platform — Android 앱·CI·빌드·릴리스·저장소 운영
개요
문제. 열린 PR 두 개가 같은 파일을 서로 다르게 고쳐도, 한쪽이 머지되기 전까지는 어디서도 신호가 나지 않는다.
conflict라벨(fix(ci): base 와 충돌한 PR 은 pull_request CI 가 트리거되지 않아 최신 커밋이 미검증으로 방치 — 충돌 자동 감지·라벨 필요 #1028)은 PR 과 base 의 충돌만 본다. 형제 PR 끼리의 충돌은 한쪽이 develop 에 들어간 뒤에야 나머지 쪽에 붙는다.- merge-order-guard 는 이슈
blocked_by만 본다. 파일 겹침은 검사 대상이 아니고, 의존이 없는 두 이슈에 blocked_by 를 거는 것은 허구다. - 스택은 의존 관계용이다. 독립 이슈 둘을 스택으로 묶으면 없던 종속이 생기고 리뷰 diff 에 상대 변경이 섞인다.
- 머지 자체는 GitHub 이 막는다(나중 쪽이 CONFLICTING 이 되어 merge queue 에 못 들어간다). 비어 있는 것은 «머지 전에 미리 아는 것» 뿐이다.
실사례: #1640 과 #1608 이 AfternoteHomeScreen.kt 의 같은 when 을 서로 다른 방향으로 재구성한다. 0830 에 손으로 git merge-tree 를 돌려 #1640 에만 코멘트로 남겼다(#1640 (comment)). 한쪽 PR 에만 달렸고, 한 번 돌린 결과라 다음 날 #1546 머지로 이미 낡았고, 다음 사람이 기억해야만 작동한다.
변경. conflict-label 리컨사일러에 형제 충돌 스윕을 붙인다. 차단이 아니라 경고다.
- 열린 PR 쌍마다
git merge-tree --write-tree로 두 head 를 합쳤을 때의 충돌 파일을 구하고, 그중 두 PR 의 자기 커밋이 모두 고친 파일 만 남긴다. 한쪽만 고친 파일에서 난 충돌은 상대가 품고 있는 develop 커밋과의 충돌이라conflict라벨 몫이다. - 스택 PR 의 «자기 커밋» 은 부모 PR head 부터의 diff 다. 부모 체인이 같은 상대와 이미 부딪히는 파일은 자식에서 빼서 충돌을 체인의 가장 아래 PR 한 곳에 귀속시킨다. 같은 체인 안의 두 PR 은 비교하지 않는다.
- 결과는 양쪽 PR 에
sibling-conflict라벨과 상대 PR 번호·충돌 파일을 적은 마커 코멘트로 남긴다. 코멘트는 PR 당 하나를 매 실행 현재 상태로 고쳐 쓰고, 해소되면 라벨을 떼며 코멘트를 «해소됨» 으로 바꾼다. job summary 에 현재 쌍 전체를 적는다. - 실행 시점은 conflict-label 과 같다(develop push · PR Validation 요청 · 매시 · dispatch).
차단으로 올리지 않는 이유: 둘 다 옳은 PR 이라 어느 쪽을 red 로 만들지 tiebreaker 가 필요한데, «나중 번호가 앞 번호에 스택한다» 는 나중 PR 이 이미 다른 스택에 있으면 쓸 수 없다(#1640 이 그 경우다). 작성자가 손쓸 수 없는 red 는 #1059 가 걷어낸 «수명 내내 red» 다. 머지 시점의 차단은 GitHub 이 이미 한다.
완료 조건.
-
.github/scripts/label-sibling-conflicts.mjs와 테스트. 실제 git 저장소를 만드는 통합 테스트를 포함한다(단순 충돌 · 스택 귀속 · develop 충돌 제외 · 같은 체인 제외). -
conflict-label.yml에 전체 히스토리 checkout 으로 도는 job 을 추가하고, 라벨sibling-conflict를 자동 생성한다. - 실 저장소 dry-run 으로 fix(afternote): 발신 흐름의 무음 실패에 복구 수단과 진행 상태를 결선한다 (#705) #1608 ↔ fix(afternote): 0건 애프터노트 홈에도 화면 헤더를 그린다 (#1704) #1627(NEXT STEP 노출 조건·문구·목적지를 PM에게 확인한다 #1175 스택의 가장 아래) 의
AfternoteHomeScreen.kt가 잡히고, 스택의 나머지 네 PR 에는 같은 충돌이 중복 귀속되지 않는 것을 확인한다. 머지 뒤dry_rundispatch 로 한 번 더 본다.
참고
- fix(ci): base 와 충돌한 PR 은 pull_request CI 가 트리거되지 않아 최신 커밋이 미검증으로 방치 — 충돌 자동 감지·라벨 필요 #1028 — base 충돌 라벨. 이 이슈는 그 형제 축이다.
- fix(afternote): 발신 흐름의 무음 실패에 복구 수단과 진행 상태를 결선한다 (#705) #1608 은 0831 refactor(afternote): 리소스 프리픽스를 afternote_ 로 통일하고 resourcePrefix 로 강제한다 (#1079) #1546 머지 이후 develop 과도 충돌 중이다(
AfternoteEditorRoute.kt·AddSongScreen.kt· 디렉터리 이동 1건). 이 스윕은 그 파일들을 빼고AfternoteHomeScreen.kt만 남겨야 한다.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:platformCI·빌드·릴리스·저장소 운영 영역CI·빌드·릴리스·저장소 운영 영역maintenanceCI·빌드·의존성·저장소 운영 유지보수CI·빌드·의존성·저장소 운영 유지보수
Activity
Merge pull request #1751 from Afternote/chore/1750-sibling-conflict-l…