chore(ci): 네이티브 스택 미등록 의존 PR 을 merge-order-guard 경고로 드러낸다 #1474
Description
작업 유형
maintenance — CI·빌드·의존성·저장소 운영 유지보수
주 담당 모듈
platform — Android 앱·CI·빌드·릴리스·저장소 운영
개요
의존 PR 체인은 GitHub 네이티브 스택으로 묶는 것이 이 저장소 규약인데(#906), 묶지 않고 base 만 상위 브랜치로 지정한 PR 이 아무 신호 없이 지나간다. merge-order-guard 는 base 이름만 보고 «스택 PR» 이라 부를 뿐, 실제 등록 여부(stackEntry)는 보지 않는다.
case "$BASE_REF" in
develop|main) ;;
*) stacked=1 ; echo "::warning::base 가 '$BASE_REF' — …" ;;
esac그래서 미등록 PR 도 등록된 PR 과 똑같은 경고만 받는다. #1458 본문이 이미 그 수를 세어 두었다 — 열린 PR 35건 중 base 가 트렁크 아닌 5건, 그중 stackEntry == null 이 #1055·#1197·#1316. 여기에 #1464 가 더해졌다.
무엇을 놓치나
미등록이어도 머지 순서는 지켜진다 — 이 저장소가 delete_branch_on_merge: true 라 밑단이 머지되면 GitHub 이 위 칸의 base 를 develop 으로 이관한다. 그 이관의 근거가 스택 기능이 아니라 저장소 설정이라는 점이 요지다. 등록하지 않으면 다음을 못 얻는다.
- PR 페이지 스택 맵 — 리뷰어가 체인 순서를 바로 보지 못한다
- 밑단 머지 시 서버측 자동 rebase
gh stack merge의 원자 머지
완료 조건
merge-order-guard 의 stacked=1 분기에서 stackEntry 를 조회해, base 가 트렁크가 아닌데 미등록이면 경고 한 줄을 더 남긴다.
entry=$(gh api graphql -f query='query($o:String!,$r:String!,$n:Int!){repository(owner:$o,name:$r){pullRequest(number:$n){stackEntry{position}}}}' \
-f o="$owner" -f r="$repo" -F n="$PR_NUMBER" --jq '.data.repository.pullRequest.stackEntry')merge-order-guard-policy.test.mjs 에 대응 정책 테스트를 함께 넣는다.
왜 error 가 아니라 warning 인가
CI 가 스스로 고칠 수 없는 게이트이기 때문이다. GraphQL Mutation 타입에 스택 관련 필드가 0건이고(PullRequestStack·PullRequestStackEntry 계열은 읽기 전용), 기존 열린 PR 을 묶는 경로는 gh stack submit 의 대화형 에디터에서 새 PR 을 전부 deselect 한 뒤 Ctrl+B 를 누르는 것뿐이다. Actions 가 대신 누를 수 없다.
error 로 올리면 사람이 터미널에서 등록할 때까지 red 가 수명 내내 남는데, 그것은 #1059 가 이 워크플로에서 이미 한 번 걷어낸 증상이다. 워크플로 주석이 그대로다.
실패로 올리면 스택 PR 이 수명 내내 X 로 남아 목록에서 진짜 CI 실패와 구분되지 않으므로 경고로만 남긴다.
막지 않는 규칙을 required 로 올리지 않는다는 뜻이지, 놓쳐도 된다는 뜻은 아니다 — 경고는 남긴다.
자식 이슈
No response
참고
- 규약의 출처는 0823 지시(«필요할 때 알아서 쓰도록»)와 첫 실적 #906.
- fix(ci): merge-order-guard 가 스택 PR 을 수명 내내 red 로 남긴다 — blocker 를 base 브랜치가 닫는 경우 #1059 는 같은 워크플로의 blocked_by 검사를 스택 PR 에서 경고로 낮춘 건이다. 이 이슈는 그 옆에 등록 여부 신호를 하나 더 세우는 것이라 범위가 겹치지 않는다.
- chore(ci): 죽은 stack-refresh 워크플로를 폐기한다 — 네이티브 스택 PR 은 update-branch 403 이라 성공 실적 0 #1458(stack-refresh 폐기)이
stackEntry == null집계를 이미 쓰고 있다. 그 PR 이 먼저 머지되어도 이 변경과 충돌하지 않는다 — 서로 다른 워크플로다. - 기존 미등록 PR(fix(home): 주간 요약 그리드에 실제 기록 수를 연결한다 (#562) #1055·fix(home): 시안에 없는 기록 카테고리 카드를 걷는다 (#700) #1197·test(android): 로그인 홈 계측의 실서버 의존 제거 (#1288) #1316·refactor(afternote): 수신 애프터노트 화면 15파일과 그 라우트를 afternote 모듈로 (#1461) #1464)을 소급 등록할지는 이 이슈 범위 밖이다. 승인 끝난 PR 을 뒤늦게 묶는 것은 별도 판단이 필요하다.
Activity