Repository navigation
Merged
Conversation
`Report Android Lint (Reviewdog)` 는 lint 위반이 0건인 PR 에서도 job 을 red 로 만들었다. `Check Project Issues (Android Lint)` 가 develop ruleset 의 required check 라 그대로 머지 차단이 된다. 원인은 dvdandroid/action-android-lint 가 도커 액션이고 그 Dockerfile 이 매 run 마다 `wget -O - -q …/install.sh | sh -s` 로 reviewdog 을 받아 설치한다는 것이다. 파이프라인의 exit status 는 마지막 sh 의 것이라 wget 이 실패해도 sh 는 빈 입력을 받고 0 을 낸다. `-q` 라 경고도 없다. 그래서 이미지 빌드는 성공하고 몇 분 뒤 entrypoint 에서 `reviewdog: not found` 로 죽는다. 빈도는 리포터 스텝이 존재한 전 기간 1173 run 중 단독 실패 2건이다. 낮지만 raw.githubusercontent.com 이 흔들리면 그 시간대 모든 PR 이 동시에 red 가 되는 상관 실패다. 반면 산출은 없다 — 최근 PR 12건에서 인라인 코멘트 0건. 재시도로는 못 푼다. 도커 액션 이미지는 job 시작 시 한 번만 빌드되고, reviewdog 부재는 그 빌드 시점에 확정된다. 같은 job 안에서 스텝을 다시 돌려도 같은 이미지가 뜬다. `Merge module lint XMLs into one` 도 같이 지웠다. 모듈별 XML 을 한 파일로 합치던 유일한 소비자가 reviewdog 이었다. 새 스크립트가 모듈별 XML 을 직접 읽으므로 셸+xmllint 로 XML 을 문자열 조작하는 단계가 사라지고, 합치면서 잃던 위반의 모듈 귀속(`:core:common`)이 오히려 보존된다. 파서는 실물로 맞췄다. lint 9.2.1 은 여는 태그를 여러 줄에 걸쳐 쓰고 message 의 닫는 꺾쇠를 이스케이프하지 않는다(`<꺾쇠> 포함`). `[^>]*` 로 태그를 끊으면 거기서 잘려 뒤따르는 위반을 통째로 잃으므로, 따옴표 안팎을 세어 태그 끝을 찾는다. 인라인 코멘트를 job summary 로 옮기는 판단은 ktlint 쪽 선례와 같다 (#1012). 그 결정이 lint-workflow-policy.test.mjs 에 "Android Lint 는 인라인 유지" 로 박혀 있었으므로, #279 회귀 방지라는 의도는 남기고 수단만 바꾸도록 함께 갱신했다.
Sadturtleman
approved these changes
Aug 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Report Android Lint (Reviewdog)스텝을 걷어내고, lint 위반을 job summary 로 렌더한다.Closes #1093
왜
이 스텝은 lint 위반이 0건인 PR 에서도 job 을 red 로 만들었다.
Check Project Issues (Android Lint)는 develop ruleset 의 required check 라 그대로 머지 차단이다.dvdandroid/action-android-lint는 도커 액션이고, Dockerfile 이 매 run 마다 reviewdog 을 받아 설치한다.파이프라인의 exit status 는 마지막
sh의 것이다. wget 이 실패해도sh는 빈 입력을 받고 0 을 내고,-q라 경고도 없다. 이미지 빌드는 성공하고 몇 분 뒤 entrypoint 에서reviewdog: not found로 죽는다.재시도로는 못 푼다. 도커 액션 이미지는 job 시작 시 한 번만 빌드되고(run 32742963935 기준 15:08:04 에
c97262:3363d02d…빌드 → 15:13:01 에 같은 태그로docker run), reviewdog 부재는 그 빌드 시점에 확정된다. 같은 job 안에서 스텝을 다시 돌려도 같은 이미지가 뜬다.빈도와 효용 (실측)
리포터 스텝이 존재한 전 기간
lint.ymlrun 1173건(2026-03-23 ~ 08-24) 전수 조사:Run Android Lint단독 실패0.17% 지만 raw.githubusercontent.com 이 흔들리면 그 시간대 모든 PR 이 동시에 red 가 되는 상관 실패다. 반면 산출은 없다 — 최근 PR 12건(#1056~#1091)에서 인라인 코멘트 0건.
무엇을
Report Android Lint (Reviewdog)삭제 →Summarize Android Lint violations(node …/render-android-lint-summary.mjs)Merge module lint XMLs into one도 삭제. 모듈별 XML 을 한 파일로 합치던 유일한 소비자가 reviewdog 이었다. 새 스크립트가 모듈별 XML 을 직접 읽으므로 셸+xmllint로 XML 을 문자열 조작하는 단계가 사라지고, 합치면서 잃던 위반의 모듈 귀속(:core:common)이 오히려 보존된다.Run Android Lint는 그대로 게이트다 (--continue유지, summary 는if: always()).검증
단위 테스트 —
node --test .github/scripts/*.test.mjs113건 통과 (새 12건 포함).unit-test.yml·dependency-audit.yml이 글롭으로 돌리므로 워크플로 수정 없이 편입된다.실물 XML 로 파서 검증 — 로컬 리포트 28건이 전부 위반 0건이라,
core/common에 위반을 일부러 심고:core:common:lintDebug를 돌려 lint 9.2.1 의 실제 출력을 확보했다. 거기서 두 가지가 나왔다.<issue\n id=…).message의 닫는 꺾쇠를 이스케이프하지 않는다 —message="Hardcoded string "…" 와 <꺾쇠> 포함". 여는 태그를[^>]*로 끊으면 여기서 잘려 뒤따르는 위반을 통째로 잃는다. 따옴표 안팎을 세어 태그 끝을 찾도록 했고, 이 케이스를 테스트 픽스처에 박았다.실물 렌더 결과:
GITHUB_STEP_SUMMARYappend 경로와 리포트 0개 경로도 실행해 확인했다. 임시 probe 는 커밋에 들어가지 않는다.빌드 검증 없음 — 해당 없음. 변경은
.yml과.mjs뿐이라 Kotlin 컴파일 대상이 아니다.시각 검증 skip — 시각 변경 없음. Compose 본문·디자인 토큰·리소스 변경이 없다.
리뷰어에게
Report Android Lint (Reviewdog)의uses줄을@master→21c9fa65(v1.3) 로 고정하는데, 이 PR 은 그 스텝을 통째로 지운다. 먼저 머지되는 쪽에 맞춰 다른 쪽에서 해당 hunk 를 정리해야 한다. 참고로 현재@master가 가리키는 커밋이 곧21c9fa65라, pin 만으로는 이 flake 가 바뀌지 않는다.lint-workflow-policy.test.mjs에 perf(ci): ktlint 를 PR 당 두 번 검사 — reviewdog 경로 32초·버전 이원화 정리 #1012 의 "Android Lint 는 인라인 유지" 결정이 단언으로 박혀 있었다. chore(ci): Reviewdog 가 :feature/* · :core/* 모듈 lint 도 PR 인라인 표시하도록 multi-module 지원 #279 회귀 방지(모듈별 위반이 로그에 묻히지 않을 것)라는 의도는 남기고 수단만 바꿨고,uses: dvdandroid/…금지 줄은 ktlint 쪽uses: ScaCap/…금지와 대칭으로 넣었다.Static Analysis (Reviewdog)는 이 PR 이후 저장소에 reviewdog 이 하나도 없는데도 남는다. 체크 이름은 job name 이라 ruleset 매칭에는 영향이 없어 여기서는 건드리지 않았다 — 별건 chore(ci): lint.yml 이름이 아직Static Analysis (Reviewdog)— 저장소에 reviewdog 이 없다 #1097 로 뗐다.