Skip to content

perf(ci): ktlint 를 PR 당 1회로 줄이고 위반을 job summary 로 옮긴다 (closes 1012) [base: develop] - #1034

Merged
OnlyReadOneBook merged 2 commits into
developfrom
perf/1012-ktlint-single-pass
Aug 24, 2026
Merged

OnlyReadOneBook merged 2 commits into
developfrom
perf/1012-ktlint-single-pass

Conversation

@OnlyReadOneBook

Copy link
Copy Markdown
Collaborator

lint.yml 의 ktlint job 은 같은 규칙을 두 번 검사하고 있었다.

스텝 소요 검사 범위
Build ScaCap/action-ktlint@master 12초 (Docker 액션이라 매 run 빌드)
Run Ktlint (reviewdog) 20초 PR diff 의 추가된 줄
Run full Ktlint check (ktlintCheck) 72초 저장소 전체

reviewdog 경로가 32초, job 의 약 30% 다.

왜 지금 빼는가

인라인 코멘트의 원래 수요자는 «Actions 로그 수만 줄을 뒤지기 싫은 사람» 이다. 지금 이 저장소는 작업자 전원이 에이전트(Codex·Claude Code)이고, 에이전트는 gh run view --log 로 로그를 직접 읽는다 — 인라인 코멘트는 오히려 API 를 한 번 더 호출해야 닿는 곳에 있다.

반면 게이트는 그대로 필요하다. 그래서 «막는 것»(ktlintCheck)은 남기고 «알려주는 것»만 검사를 다시 하지 않는 경로로 옮겼다.

변경 — 이슈의 A안

  • ScaCap/action-ktlint 스텝 제거. ktlint 를 실제로 돌리는 자리가 Gradle 태스크 하나가 된다.
  • ktlint-gradle 이 이미 만드는 checkstyle XML 을 읽어 job summary 에 렌더한다 (render-ktlint-summary.mjs). 검사는 재실행하지 않는다 — Android Lint 가 lintDebug XML 을 재활용하는 것과 같은 패턴이다.
  • convention plugin 에 CHECKSTYLE 리포터를 추가했다(기존 PLAIN 유지).
  • ktlint 버전 정본이 libs.versions.toml 하나가 된다. 워크플로에 손으로 적던 ktlint_version: "1.8.0" 이 사라져 두 검사가 갈릴 여지가 없다.

job summary 실제 출력

위반이 있을 때:

## ktlint

❌ **위반 5건** — 파일 1개, 규칙 3종

| 규칙 | 건수 |
| --- | ---: |
| `standard:statement-wrapping` | 3 |
| `standard:no-semi` | 1 |
| `standard:op-spacing` | 1 |

<details><summary>위반 위치</summary>

- `core/common/.../Probe.kt:4:15` — Missing newline after '{' (`standard:statement-wrapping`)
  …
</details>

if: always() 라 검사가 실패해도 렌더된다. 위반 100건까지 나열하고 나머지는 건수만 적는다(job summary 1MB 상한).

Android Lint 는 대상이 아니다

dvdandroid/action-android-lint 는 lintDebug 가 만든 XML 을 재활용한다. 검사를 다시 하지 않으므로 추가 비용이 거의 없고, 모듈별 위반이 수만 줄 로그에 묻히던 문제(#279)를 푼다. 유지한다.

검증

  • 위반을 심고 ktlintCheck → EXIT=1, summary 가 위 표대로 렌더
  • 클린 상태(--rerun-tasks) → EXIT=0, 리포트 77건, ✅ 위반 없음
  • node --test .github/scripts/*.test.mjs → 74/74 통과 (신규 12건 포함)
  • actionlint · scripts/repository-quality.sh (16 workflows, 4 shell scripts) 통과
  • 시각 변경 없음 — screenshot baseline 사이클 해당 없음

#875 회귀 없음

삭제만으로 발생하는 파일 단위 위반을 잡는 것은 ktlintCheck 가 저장소 전체를 검사하는 성질이고, reviewdog 를 빼도 그대로다. 그 성질이 사라지지 않도록 lint-workflow-policy.test.mjs 가 고정한다 — ktlint 실행이 1회일 것, ktlint_version 을 워크플로에 적지 않을 것, filter_mode(diff 필터)가 없을 것, summary 스텝이 always() 일 것, Android Lint 는 XML 재활용을 유지할 것.

리뷰어에게

  • job 소요 감소 수치는 이 PR 의 실제 run 에서 재서 perf(ci): ktlint 를 PR 당 두 번 검사 — reviewdog 경로 32초·버전 이원화 정리 #1012 에 남긴다. 이슈의 완료 조건이라 PR 이 아니라 이슈 쪽에 기록한다.
  • 로컬에서 ktlintCheck 를 반복 실행하면 삭제한 파일의 위반이 계속 보고될 수 있다. ktlint-gradle 14.2.0 의 up-to-date 오판이며(runKtlintCheckOverMainSourceSet UP-TO-DATE) 이 PR 과 무관하다. CI 는 매 run 이 clean checkout 이라 해당 없고, 로컬에서는 --rerun-tasks 로 확인된다.

Closes #1012

lint.yml 의 ktlint job 은 같은 규칙을 두 번 검사했다. ScaCap/action-ktlint
(reviewdog)가 PR diff 의 추가된 줄을 12+20초에, ktlintCheck 가 저장소 전체를
72초에 각각 돌아 reviewdog 경로만 job 의 약 30% 였다.

인라인 코멘트의 원래 수요자는 «Actions 로그 수만 줄을 뒤지기 싫은 사람» 인데,
이 저장소 작업자는 전원 에이전트라 로그를 gh run view --log 로 직접 읽는다.
막는 것(ktlintCheck)만 남기고 알려주는 것은 검사를 다시 하지 않는 경로로 옮긴다.

- ScaCap/action-ktlint 스텝 제거. ktlint 실행은 Gradle 태스크 하나뿐이다.
- ktlint-gradle 이 이미 만드는 checkstyle XML 을 읽어 job summary 에 위반
  위치·규칙별 집계를 렌더한다(render-ktlint-summary.mjs). 검사는 재실행하지 않는다.
- ktlint 버전 정본이 libs.versions.toml 하나가 된다. 워크플로에 손으로 적던
  ktlint_version: "1.8.0" 이 사라져 두 검사가 갈릴 여지가 없다.
- @master 미고정 액션 의존이 하나 줄어든다 (#847 대상 축소).

Android Lint 는 그대로 둔다. dvdandroid/action-android-lint 는 lintDebug 가
만든 XML 을 재활용할 뿐 검사를 다시 하지 않고, 모듈별 위반이 로그에 묻히던
문제(#279)를 푼다.

실측:
- 위반을 심고 ktlintCheck → EXIT=1, summary 가 위반 5건·규칙 3종·파일:라인:칼럼 렌더
- 클린 상태(--rerun-tasks) → EXIT=0, 리포트 77건, "위반 없음"
- node --test .github/scripts/*.test.mjs → 74/74 통과 (신규 12건 포함)
- actionlint · repository-quality.sh 통과

#875 회귀(삭제로 생긴 파일 단위 위반)는 ktlintCheck 가 저장소 전체를 검사하는
성질이 담당하며, 그 성질을 lint-workflow-policy.test.mjs 가 고정한다.

closes #1012
@OnlyReadOneBook
OnlyReadOneBook merged commit efbb125 into develop Aug 24, 2026
13 checks passed
@OnlyReadOneBook
OnlyReadOneBook deleted the perf/1012-ktlint-single-pass branch August 24, 2026 10:56
@github-actions

Copy link
Copy Markdown
Contributor

🚀 QA 배포 권장

QA 포인트

이 판단은 배포를 자동 실행하지 않습니다. deploy일 때 Release Distribution을 수동 실행하세요.

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.

perf(ci): ktlint 를 PR 당 두 번 검사 — reviewdog 경로 32초·버전 이원화 정리

1 participant