From f25cf26fee8c04fe249a756df5f61944e869b76e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=82=98=EB=AF=B8?= Date: Wed, 12 Aug 2026 17:35:14 +0900 Subject: [PATCH] =?UTF-8?q?ci:=20PR=20=EB=B3=80=EA=B2=BD=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=EA=B8=B0=EC=A4=80=20diff=20coverage=20=EA=B2=8C?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 로직이 수정/추가돼도 테스트가 안 따라오는 경우를 CI가 기계적으로 잡을 방법이 없었음(기존 CI는 기존 테스트 통과 여부만 확인). - JaCoco로 커버리지 리포트(xml) 생성 - diff-cover로 PR에서 실제로 바뀐 라인만 커버리지 검사(70% 미만 시 CI 실패) - 전체 커버리지 게이트가 아니라 diff 기준이라, 기존 미테스트 코드가 발목잡지 않으면서 "새로 바뀐 부분"만 강제함 로컬에서 기존 PR #243 diff로 실제 검증: KakaoSignInService(0%), AppleSignInService(16.7%) 등 테스트 없이 들어간 라인을 정확히 잡아냄. --- .github/workflows/prod-ci.yml | 11 +++++++++++ README.md | 11 +++++++++++ build.gradle | 10 ++++++++++ 3 files changed, 32 insertions(+) diff --git a/.github/workflows/prod-ci.yml b/.github/workflows/prod-ci.yml index e8ef38d..19d0461 100644 --- a/.github/workflows/prod-ci.yml +++ b/.github/workflows/prod-ci.yml @@ -40,6 +40,8 @@ jobs: steps: - uses: actions/checkout@v3 + with: + fetch-depth: 0 - name: Set up JDK 11 uses: actions/setup-java@v3 with: @@ -74,3 +76,12 @@ jobs: SPRING_DATASOURCE_USERNAME: runnect SPRING_DATASOURCE_PASSWORD: runnect_local_password SPRING_DATA_REDIS_HOST: localhost + + # PR에서 새로 추가/수정된 라인만 커버리지를 검사한다 (전체 커버리지 게이트가 아님). + # 로직이 바뀌었는데 테스트가 안 따라오는 경우를 CI에서 기계적으로 잡기 위함. + - name: Diff coverage 게이트 (변경된 라인 기준) + run: | + pip install diff-cover + diff-cover build/reports/jacoco/test/jacocoTestReport.xml \ + --compare-branch=origin/${{ github.base_ref }} \ + --fail-under=70 diff --git a/README.md b/README.md index 3f94494..e979ceb 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,17 @@ public class SomeService { yml에 키가 없으면 기본값은 비활성(`false`)이다. +### ✅ Diff Coverage 게이트 + +PR에서 새로 추가/수정된 라인이 테스트로 커버되는지 CI(`build` job)가 자동으로 확인한다 — 로직을 고쳤는데 관련 테스트가 안 따라오는 경우를 기계적으로 잡기 위함. 전체 커버리지가 아니라 **이번 PR에서 바뀐 라인만** 대상으로 하며, 기준은 70%다. + +```bash +# CI에서 실행되는 것과 동일한 방식으로 로컬에서 직접 확인 +./gradlew jacocoTestReport +pip install diff-cover +diff-cover build/reports/jacoco/test/jacocoTestReport.xml --compare-branch=origin/main +``` +

diff --git a/build.gradle b/build.gradle index e2b0549..c17600b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java' + id 'jacoco' id 'org.springframework.boot' version '2.7.14' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } @@ -79,4 +80,13 @@ dependencies { tasks.named('test') { useJUnitPlatform() + finalizedBy jacocoTestReport +} + +jacocoTestReport { + dependsOn test + reports { + xml.required = true + html.required = true + } }