Skip to content

fix(platform): dependabot PR 의 두 검증이 게이트가 채운 제목·본문을 기다렸다가 판정한다 (#2212) - #2213

Merged
OnlyReadOneBook merged 2 commits into
developfrom
fix/2212-dependabot-gate-await
Oct 4, 2026
Merged

OnlyReadOneBook merged 2 commits into
developfrom
fix/2212-dependabot-gate-await

Conversation

@OnlyReadOneBook

Copy link
Copy Markdown
Collaborator

먼저 볼 파일:

  1. .github/scripts/dependabot-pr-gate.mjs: awaitsGate·awaitGate 와 await 명령. 페이로드가 판정 가능하면 그대로 쓰고, 아니면 게이트가 채울 때까지 live PR 을 다시 읽고, 시간을 넘기면 판정을 검증에 넘긴다
  2. .github/workflows/repository-quality.yml: dependabot 이 연 PR 의 pull_request run 만 live PR 을 기다렸다가 그 값으로 판정 재료를 만드는 분기
  3. .github/workflows/android-managed-device.yml: 게이트 스크립트를 default branch 신뢰 사본으로 스테이징하고, 계획 해석 전에 그 사본으로 기다리는 분기
  4. .github/scripts/dependabot-pr-gate.test.mjs: 대기 동작, await 명령의 계약, "게이트는 검증을 다시 부르지 않는다" 결정을 잠그는 단언

Closes #2212

변경

dependabot PR 이 열리면 dependabot-pr-gate 가 제목 (#N)·Refs·CI Test Plan 을 채우는데, 같은 순간 도는 PR Validation 과 Managed Device 는 그 값을 못 보고 red 로 남았다. #2138 에서 게이트 PATCH(21:51:06.27Z)와 Repository Quality 실패(21:51:06.53Z)가 0.3초 차이였다. 게이트의 GITHUB_TOKEN 편집이 낸 edited 는 다른 워크플로를 깨우지 못하고, 두 검증은 pull_request 에서 opened 시점 페이로드를 읽는다.

게이트가 검증을 다시 부르는 길은 쓰지 않았다.

후보 막힌 이유
게이트가 workflow_dispatch 같은 sha 에 dispatch 초록을 붙여도 PR 롤업은 옛 pull_request 실패를 보인다(#1825 실측)
게이트가 run 재실행 재실행은 옛 페이로드를 쓴다. #2138 의 9/23 재실행(attempt 2)도 같은 제목 오류로 실패했다. live 읽기로 바꿔 살려도 기기 레인 실제 테스트가 attempt 2 로 밀려 android-managed-device-retry.yml 의 1회차 인프라 복구를 잃는다
App 토큰으로 편집 저장소에 App 이 없고, 개인 키 시크릿을 pull_request_target 브리지에 두는 것을 create-ci-config.test.mjs 가 금지한다

그래서 방향을 뒤집었다. 검증이 게이트를 기다린다.

  • dependabot-pr-gate.mjs: awaitsGate 는 dependabot 이 연 열린 PR 인데 제목에 대표 이슈 번호가 없을 때만 참이다. 게이트 마커가 아니라 제목으로 가르는 것은, 게이트가 경계 경로에서 멈춰 사람이 손으로 채운 PR(마커 없음)을 edited 마다 끝까지 기다리게 하지 않기 위해서다. 게이트는 제목과 본문을 한 번의 PATCH 로 바꾸므로 제목에 번호가 있으면 본문도 채워져 있다. awaitGate 는 이벤트 페이로드의 PR 이 이미 판정 가능하면 API 를 부르지 않고 그대로 돌려준다. 게이트가 채운 뒤의 edited·synchronize 는 종전처럼 페이로드만으로 끝난다. 아니면 live PR 을 5초 간격으로 읽고, 조회 오류는 제한 시간 안에서 다시 시도한다. await <출력 경로> 명령은 그 JSON 을 파일에 쓰고, 제한 시간을 넘겨도 exit 0 과 경고만 남겨 판정을 뒤따르는 검증의 평소 오류 문구에 맡긴다. 인자 없이 부르면 종전처럼 채우기, 그 밖의 명령은 API 호출 없이 실패한다.
  • repository-quality.yml: pull_request 이면서 작성자가 dependabot[bot] 일 때만 PR 사본의 await 로 90초까지 기다린 live JSON 과 그 changed_files 를 쓴다. quota 대기 60초와 합쳐도 job timeout 3분 안에 든다. 사람 PR 과 dispatch 경로는 그대로다.
  • android-managed-device.yml: default branch 사본에 awaitGate 가 있을 때만 게이트 스크립트를 신뢰 정책으로 스테이징한다(dependabot_gate=trusted). 도입 PR 과 bootstrap 은 unavailable 로 종전처럼 페이로드를 읽는다. dependabot PR 이면 그 신뢰 사본으로 180초까지 기다리고, live head 가 이벤트 head 와 다르면 실패한다. 실제 테스트는 attempt 1 에서 돌아 인프라 복구가 그대로 남는다.
  • dependabot-pr-gate.yml: 동작 변경 없음. 머리 주석에 "여기서 검증을 다시 부르지 않고 actions 권한도 두지 않는다" 는 결정과 이유를 적었다.

검증

  • node --test .github/scripts/*.test.mjs 758건, 실패 0(기존 skip 1).

  • 새 단언이 실제로 잡는지 프로덕션 변이 21종(분기 제거, 대기 시간 150초, head 대조 제거, PR 사본 호출, 스테이징 비활성, 게이트 actions: write, 페이로드 우선 제거, 다른 PR 페이로드 사용, 조회 오류 재시도 제거, 마커 기준 종료, 스테이징 grep 문자열 불일치, 인자 없는 호출이 채우기가 아님 등)을 넣어 전부 실패하는 것을 확인했다.

  • 네 관점(정확성·신뢰 경계·설계 반증·정책 테스트) 리뷰와 지적별 반박 검증을 거쳤다. 살아남은 지적(채워진 뒤의 이벤트까지 API 에 기대는 것, 마커 기준 종료, grep 문자열 미대조, 주석에 걸리는 정규식)은 두 번째 커밋에서 고쳤다.

  • actionlint, scripts/repository-quality.sh 통과.

  • 두 워크플로의 스텝 본문을 YAML 에서 그대로 떼어 가짜 API(두 번 미충족, 세 번째에 충족) 앞에서 실행했다.

    경우 Repository Quality 기기 레인
    opened 경합(페이로드 옛 값) API 3회, 채워진 제목 사용 API 3회, mode=none 해석
    페이로드가 이미 채워짐 API 0회 API 0회, mode=none 해석
    대조: 게이트 사본 없음 옛 증상 그대로 "CI Test Plan 섹션이 없습니다" 로 실패
  • 실제 봇 PR 로는 머지 뒤 다음 dependabot 주간 실행(월 21:43Z)에서 사람 편집 없이 초록인지 확인한다. 대기 분기는 dependabot 이 연 PR 에서만 타므로 이 PR 에서는 미리 돌지 않는다.

CI Test Plan

{
  "androidTest": {
    "mode": "full",
    "reason": "android-managed-device.yml 의 신뢰 정책 스테이징과 계획 해석 스텝을 바꾼다. FULL_REQUIRED_PATHS 라 기기 레인 전량으로 검증한다.",
    "tests": []
  }
}

게이트는 GITHUB_TOKEN 으로 편집해 edited 가 다른 워크플로를 깨우지 못하고, PR Validation·Managed Device 는 opened 시점 페이로드를 읽어 red 로 남았다. dependabot 이 연 PR 의 pull_request run 에서만 두 검증이 live PR 을 needsGate 가 false 가 될 때까지 기다린 뒤 그 값으로 판정한다. 기기 레인은 default branch 신뢰 사본으로 기다린다. 게이트 권한은 늘리지 않는다.
…2212)

리뷰에서 나온 지적을 반영한다. 게이트가 채운 뒤의 edited·synchronize 까지 기기 레인이 매번 API 를 불러 일시 오류 하나에 required lane 이 red 가 될 수 있었다. 이벤트 페이로드 제목에 대표 이슈 번호가 이미 있으면 종전처럼 페이로드를 쓴다. 대기 종료는 게이트 마커가 아니라 제목의 대표 이슈 번호로 가른다. 조회 오류는 제한 시간 안에서 다시 시도한다. 스테이징 판별 grep 문자열이 스크립트에 실제로 있는지, 인자 없는 호출이 채우기인지 테스트로 잠근다.
@github-actions github-actions Bot added the android-test PR head에서 Android Managed Device 계측 테스트 실행 label Sep 28, 2026

@Sadturtleman Sadturtleman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dependabot PR 에서만 live PR 을 기다렸다가 판정하고, 기기 레인은 default branch 신뢰 사본으로 대기하며 head 이동도 막아 경합(#2212)을 안전하게 해소합니다. 승인합니다.

@OnlyReadOneBook
OnlyReadOneBook added this pull request to the merge queue Oct 4, 2026
Merged via the queue into develop with commit 1298bab Oct 4, 2026
25 checks passed
@OnlyReadOneBook
OnlyReadOneBook deleted the fix/2212-dependabot-gate-await branch October 4, 2026 02:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

android-test PR head에서 Android Managed Device 계측 테스트 실행

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(platform): dependabot 게이트가 채운 제목·본문을 PR Validation·기기 레인이 못 보고 red 로 남는다

3 participants