Skip to content

fix(ci): Android Lint 리포터를 job summary 로 교체 — 매 run reviewdog 을 네트워크 설치하던 도커 액션 제거 (closes 1093) [base: develop] - #1096

Merged
1hyok merged 1 commit into
developfrom
fix/1093
Aug 25, 2026
Merged

1hyok merged 1 commit into
developfrom
fix/1093

Conversation

@1hyok

@1hyok 1hyok commented Aug 24, 2026 •

Copy link
Copy Markdown
Collaborator

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 을 받아 설치한다.

FROM alpine:3.11
RUN wget -O - -q https://raw.githubusercontent.com/reviewdog/reviewdog/<sha>/install.sh| sh -s

파이프라인의 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.yml run 1173건(2026-03-23 ~ 08-24) 전수 조사:

분류 건수
리포터 단독 실패 (lint 는 성공) 2건
lint + 리포터 동시 실패 95건 — 전부 2026-03~05, #279 의 merge 스텝 도입 전 국면
Run Android Lint 단독 실패 73건 — 실제 위반, 정상

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()).
  • 인라인을 job summary 로 옮기는 판단은 ktlint 쪽 선례와 같다 (perf(ci): ktlint 를 PR 당 두 번 검사 — reviewdog 경로 32초·버전 이원화 정리 #1012).

검증

단위 테스트 — node --test .github/scripts/*.test.mjs 113건 통과 (새 12건 포함). unit-test.yml·dependency-audit.yml 이 글롭으로 돌리므로 워크플로 수정 없이 편입된다.

실물 XML 로 파서 검증 — 로컬 리포트 28건이 전부 위반 0건이라, core/common 에 위반을 일부러 심고 :core:common:lintDebug 를 돌려 lint 9.2.1 의 실제 출력을 확보했다. 거기서 두 가지가 나왔다.

  1. 여는 태그가 여러 줄에 걸친다 (<issue\n id=…).
  2. message 의 닫는 꺾쇠를 이스케이프하지 않는다 — message="Hardcoded string "…" 와 &lt;꺾쇠> 포함". 여는 태그를 [^>]* 로 끊으면 여기서 잘려 뒤따르는 위반을 통째로 잃는다. 따옴표 안팎을 세어 태그 끝을 찾도록 했고, 이 케이스를 테스트 픽스처에 박았다.

실물 렌더 결과:

## Android Lint

❌ **위반 2건** — 모듈 1개, 규칙 2종

| 규칙 | severity | 건수 |
| --- | --- | ---: |
| `HardcodedText` | Warning | 1 |
| `SimpleDateFormat` | Warning | 1 |

- `:core:common` `core/common/src/main/res/layout/tmp_lint_probe.xml:9:9` — Hardcoded string "하드코딩된 문자열 "따옴표" 와 <꺾쇠> 포함", should use `@string` resource (`HardcodedText`)

GITHUB_STEP_SUMMARY append 경로와 리포트 0개 경로도 실행해 확인했다. 임시 probe 는 커밋에 들어가지 않는다.

빌드 검증 없음 — 해당 없음. 변경은 .yml 과 .mjs 뿐이라 Kotlin 컴파일 대상이 아니다.

시각 검증 skip — 시각 변경 없음. Compose 본문·디자인 토큰·리소스 변경이 없다.

리뷰어에게

`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 의
닫는 꺾쇠를 이스케이프하지 않는다(`&lt;꺾쇠> 포함`). `[^>]*` 로 태그를 끊으면
거기서 잘려 뒤따르는 위반을 통째로 잃으므로, 따옴표 안팎을 세어 태그 끝을 찾는다.

인라인 코멘트를 job summary 로 옮기는 판단은 ktlint 쪽 선례와 같다 (#1012).
그 결정이 lint-workflow-policy.test.mjs 에 "Android Lint 는 인라인 유지" 로 박혀
있었으므로, #279 회귀 방지라는 의도는 남기고 수단만 바꾸도록 함께 갱신했다.
@1hyok
1hyok merged commit 833a3d0 into develop Aug 25, 2026
15 checks passed
@1hyok
1hyok deleted the fix/1093 branch August 25, 2026 03:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(ci): Android Lint 리포터가 매 run reviewdog 을 네트워크 설치 — 실패 시 required check 가 red, 재시도로는 못 푼다

2 participants