-
Notifications
You must be signed in to change notification settings - Fork 1
chore: JaCoCo와 SonarCloud를 연동한 Gradle 빌드 및 품질 관리 시스템 구축 #30
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
📝 Walkthrough## Walkthrough
SonarCloud와 JaCoCo 통합을 위해 Gradle 빌드 스크립트와 GitHub Actions CI 워크플로가 대폭 수정되었습니다. 모든 서브프로젝트에 JaCoCo 적용, 커버리지 집계, SonarQube 분석 및 연동, CI에서 SonarCloud 인증 및 캐시 사용, 편의성 높은 Gradle 태스크 추가 등이 이루어졌습니다.
## Changes
| 파일/경로 | 변경 요약 |
|-------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|
| .github/workflows/ci-pr.yml | PR CI 워크플로: 타임아웃 15분으로 증가, SonarCloud 캐시 추가, Gradle 태스크를 fullCheck 및 Sonar 분석으로 변경 |
| build.gradle.kts | JaCoCo/ SonarQube 플러그인 통합, 커버리지 집계, SonarQube 설정, 커버리지 제외 패턴, 여러 편의 태스크 추가 |
| buildSrc/src/main/kotlin/Plugins.kt, buildSrc/src/main/kotlin/Versions.kt | JaCoCo 및 SonarQube 플러그인/버전 상수 추가 |
| settings.gradle.kts | 루트 프로젝트명 "reed"로 변경 |
## Sequence Diagram(s)
```mermaid
sequenceDiagram
participant Developer
participant GitHub Actions
participant Gradle
participant SonarCloud
Developer->>GitHub Actions: PR 생성/업데이트
GitHub Actions->>Gradle: ./gradlew fullCheck
Gradle->>Gradle: 모든 서브모듈 테스트, JaCoCo 리포트 생성
Gradle->>Gradle: jacocoRootReport(집계 커버리지)
Gradle->>SonarCloud: SonarQube 분석 및 커버리지 업로드
SonarCloud-->>Gradle: 분석 결과 반환
Gradle-->>GitHub Actions: 빌드 및 분석 완료 Assessment against linked issues
Assessment against linked issues: Out-of-scope changes해당 변경사항들은 모두 SonarCloud와 JaCoCo 연동, 커버리지 분석 및 CI 설정에 집중되어 있으며, 명시된 이슈(#28)의 범위를 벗어나는 기능적 변경이나 불필요한 코드 추가는 발견되지 않았습니다.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (5)
.github/workflows/ci-pr.yml
(2 hunks)build.gradle.kts
(4 hunks)buildSrc/src/main/kotlin/Plugins.kt
(1 hunks)buildSrc/src/main/kotlin/Versions.kt
(1 hunks)settings.gradle.kts
(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: build-validation
🔇 Additional comments (4)
settings.gradle.kts (1)
1-1
: 프로젝트 이름 변경 후 레거시 참조 없음 확인전체 코드베이스에서
multi-module-test
문자열을 검색한 결과가 없으므로 하드코딩된 참조는 더 이상 존재하지 않습니다.buildSrc/src/main/kotlin/Versions.kt (1)
7-8
: 버전 상수 추가 👍SonarQube / JaCoCo 버전을 상수로 관리한 점이 가독성과 유지보수에 도움이 됩니다.
buildSrc/src/main/kotlin/Plugins.kt (1)
6-7
: 플러그인 상수 정의 적절
JACOCO
,SONAR_QUBE
상수 추가가 일관된 DSL 구성을 돕습니다..github/workflows/ci-pr.yml (1)
57-62
:GITHUB_TOKEN
은 기본 제공 토큰 사용을 권장CI 실행 환경에는
secrets.GITHUB_TOKEN
이 자동 주입됩니다. 별도의PAT_TOKEN
을 지정할 필요가 없다면 기본 토큰으로 대체해 보안 노출을 줄이세요.
…일 경로를 지연된 방식으로 참조하도록 수정
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
♻️ Duplicate comments (1)
build.gradle.kts (1)
13-13
: 루트·서브모듈 중복 Jacoco 플러그인 적용이전 리뷰에서 이미 동일한 제안을 드렸습니다. 여전히 루트와 서브모듈에 모두
id(Plugins.JACOCO)
가 선언되어 있습니다. 루트에는 불필요하므로 제거하여 설정 중복과 태스크 생성 오버헤드를 줄이십시오.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (1)
build.gradle.kts
(4 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: build-validation
🔇 Additional comments (1)
build.gradle.kts (1)
164-165
:sonar.kotlin.source.version
값 형식 확인 필요SonarCloud 문서상 해당 속성은
1.9
처럼 메이저.마이너 를 기대합니다.Versions.KOTLIN
상수가1.9.22
같은 패치 버전까지 포함하면 파싱 오류가 날 수 있으니 실제 분석 로그를 확인하십시오.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (1)
build.gradle.kts (1)
12-13
: 플러그인 적용 중복 이슈 확인 필요루트 프로젝트와 모든 서브모듈에 JaCoCo 플러그인을 중복 적용하고 있습니다. 이는 빌드 성능에 영향을 줄 수 있습니다.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (2)
build.gradle.kts
(4 hunks)buildSrc/src/main/kotlin/Versions.kt
(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: build-validation
🔇 Additional comments (7)
buildSrc/src/main/kotlin/Versions.kt (1)
6-7
: 새로운 도구 버전 상수 추가가 적절합니다JaCoCo 0.8.13과 SonarQube 6.2.0.5505는 안정적이고 최신 기능을 지원하는 버전입니다. Kover에서 JaCoCo로의 전환에 맞춰 적절히 업데이트되었습니다.
build.gradle.kts (6)
1-1
: SonarQube 확장 임포트 추가가 적절합니다SonarQube 설정을 위한 필수 임포트문이 올바르게 추가되었습니다.
24-44
: 제외 패턴 정의가 체계적이고 포괄적입니다테스트 제외 패턴과 SonarQube 전체 분석 제외 패턴이 잘 정의되어 있습니다. 특히 DTO, Entity, Config 클래스들을 적절히 제외하여 의미 있는 커버리지 측정이 가능합니다.
85-118
: 서브모듈 JaCoCo 설정이 잘 구성되었습니다각 서브모듈의 JaCoCo 설정이 체계적으로 구성되어 있습니다. 특히
executionData.setFrom(fileTree(...))
를 사용하여 이전 리뷰에서 지적된 실행 데이터 누락 문제가 해결되었습니다.
139-143
: 실행 데이터 수집 방식이 개선되었습니다하드코딩된
.exec
파일 경로 대신fileTree
와include("*.exec")
를 사용하여 모든 실행 데이터 파일을 안전하게 수집하도록 개선되었습니다. 이는 이전 리뷰에서 지적된 문제를 해결합니다.
186-229
: 편의성 태스크들이 잘 설계되었습니다
fullCheck
,checkCoverage
,cleanReports
등의 편의성 태스크들이 명확한 목적과 적절한 의존성을 가지고 잘 구성되어 있습니다. 특히 CI/CD 파이프라인과 로컬 개발 환경을 고려한 구분이 훌륭합니다.
75-78
: Kotlin 컴파일러 플래그 지원 여부 검증 필요File: build.gradle.kts
Lines: 75–78freeCompilerArgs = listOf( "-Xjsr305=strict", "-Xconsistent-data-class-copy-visibility" )현재 Kotlin 1.9.25에서
-Xconsistent-data-class-copy-visibility
플래그의 공식 지원 여부는 확인되지 않습니다. 아래를 검토해 주세요:
- JetBrains 공식 문서 및 블로그
- Kotlin GitHub 저장소의 1.9.25 릴리스 노트
해당 플래그가 지원되지 않으면 제거하거나, 필요시 Kotlin 버전 업그레이드를 고려해야 합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (1)
.github/workflows/ci-pr.yml (1)
47-52
: SonarCloud 캐시 키에 의존성 해시를 포함하세요지난 리뷰에서 동일 지적이 있었습니다만 아직
runner.os
만 사용하고 있습니다. Sonar 플러그인 버전이나 Gradle 스크립트 변경 시 캐시 미스가 잦아집니다.-key: ${{ runner.os }}-sonar -restore-keys: ${{ runner.os }}-sonar +key: ${{ runner.os }}-sonar-${{ hashFiles('**/build.gradle.kts', '**/gradle.properties') }} +restore-keys: | + ${{ runner.os }}-sonar-
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (1)
.github/workflows/ci-pr.yml
(2 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: build-validation
🔇 Additional comments (1)
.github/workflows/ci-pr.yml (1)
20-20
: 타임아웃 15 분 증설 👍빌드 + Sonar 분석을 고려하면 10 분은 촉박했습니다. 15 분 증설 잘 반영되었습니다.
- 현재 프로젝트는 Kotlin으로만 작성되어 'build/classes/java/main' 디렉토리가 존재하지 않습니다. - 하지만 JaCoCo는 기본적으로 이 경로를 확인하려 시도하여 불필요한 "not found" 경고가 발생했습니다. - 이를 해결하기 위해, classDirectories가 실제로 컴파일된 클래스 파일이 있는 경로('classesDirs')만 참조하도록 설정을 최적화하여 경고 로그를 제거했습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (4)
.github/workflows/ci-pr.yml (2)
47-53
: SonarCloud 캐시 키 세분화 제안이 아직 반영되지 않았습니다
key: ${{ runner.os }}-sonar
한 줄만으로는 Sonar 패키지 버전 변경 시 캐시 적중률이 급락합니다.
이전 리뷰에서 제안드린hashFiles('**/build.gradle.kts')
등 의존 파일 해시를 포함하는 방식으로 수정해 주세요.
57-61
: PAT_TOKEN 사용 이유가 명확하지 않습니다
여전히GITHUB_TOKEN
대신PAT_TOKEN
을 주입하고 있습니다. 기본 제공 토큰으로도 PR 데코레이션이 가능하므로 불필요할 경우 제거하거나, 꼭 필요하다면 최소 권한으로 축소해 주세요.build.gradle.kts (2)
12-13
: 루트·서브모듈에 Jacoco 플러그인이 중복 적용되고 있습니다
루트에만 적용해도 통합 리포트 생성에는 지장이 없습니다. 중복 선언을 제거해 빌드 시간을 단축하세요.Also applies to: 52-53
154-156
: 프로젝트 키·조직 하드코딩이 여전히 남아 있습니다
다른 환경 재사용성을 위해 Gradle 속성이나 환경변수로 분리하는 지난 제안이 반영되지 않았습니다.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (2)
.github/workflows/ci-pr.yml
(2 hunks)build.gradle.kts
(4 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: build-validation
🔇 Additional comments (2)
.github/workflows/ci-pr.yml (1)
20-20
: 빌드 타임아웃 15 분 상향은 합리적입니다
CI 환경(ubuntu-24.04)에서fullCheck
전체 파이프라인을 돌릴 때 10 분은 촉박하므로 15 분 상향을 승인합니다.build.gradle.kts (1)
75-78
: Kotlin 컴파일러 플래그 추가 승인
-Xconsistent-data-class-copy-visibility
플래그 추가는 호환성 유지에 도움이 됩니다. 문제 없다고 판단됩니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
♻️ Duplicate comments (4)
.github/workflows/ci-pr.yml (2)
47-52
: SonarCloud 캐시 키 세분화 제안이 아직 반영되지 않았습니다
runner.os
만 사용하면 패키지 버전 변경 시 캐시 적중률이 급격히 떨어집니다. 이전 리뷰에서 제안된hashFiles('**/build.gradle.kts')
등을 포함한 키로 세분화해 주세요.
57-61
:PAT_TOKEN
대신 기본GITHUB_TOKEN
사용 검토 필요
별도 PAT를 쓰지 않아도 PR 데코레이션이 가능합니다. 불필요한 범위 확장을 피하기 위해 기본 토큰으로 교체하거나, 꼭 필요하다면 최소 권한만 부여해 주세요.build.gradle.kts (2)
12-13
: 루트 프로젝트에 JaCoCo 플러그인 중복 적용
서브모듈 전역apply(plugin = Plugins.JACOCO)
호출이 이미 있으므로 루트 선언은 불필요합니다. 빌드 속도·가독성 개선을 위해 제거를 권장합니다.
151-175
: SonarQube 프로젝트 키·조직명 하드코딩 유지
다른 환경 재사용성을 위해 Gradle 속성·환경변수로 분리하라는 이전 제안이 아직 반영되지 않았습니다. 추후 멀티 환경 지원을 고려해 동적 값으로 전환해 주세요.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (2)
.github/workflows/ci-pr.yml
(2 hunks)build.gradle.kts
(4 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: build-validation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (3)
build.gradle.kts (3)
11-12
: 루트·서브모듈 모두에 JaCoCo 플러그인 적용 – 여전히 중복입니다
루트(plugins
블록)와subprojects
블록(50 라인) 양쪽에서id(Plugins.JACOCO)
를 선언하고 있습니다. 루트에서 굳이 적용하지 않아도 통합 리포트 생성에는 지장이 없으니, 빌드 시간·설정 복잡도를 줄이려면 한쪽(보통 서브모듈)만 남기는 편이 좋습니다.
118-118
: BootJar 비활성화 범위가 루트만 포함 – 서브모듈까지 확장 필요
withType<BootJar> { enabled = false }
가 루트의tasks
컨테이너에만 적용돼 서브모듈의bootJar
태스크는 그대로 남아 있습니다. 모든 모듈에서 BootJar 출력을 막으려면subprojects { tasks.withType<BootJar> { enabled = false } }형태로 변경해 주세요.
150-156
: SonarCloud 프로젝트 키·조직명 하드코딩 – 환경변수/Gradle 프로퍼티로 분리 권장
재사용성과 보안을 위해sonar.projectKey
,sonar.organization
값을 하드코딩 대신project.findProperty(...)
나System.getenv(...)
로 주입하도록 이전 리뷰에서 제안드렸습니다. 아직 반영되지 않았습니다.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (1)
build.gradle.kts
(3 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: build-validation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
♻️ Duplicate comments (3)
build.gradle.kts (3)
11-12
: 루트·서브모듈에 JaCoCo 플러그인이 중복 적용되고 있습니다지난 라운드에서 동일한 사안이 지적되었으나 여전히 남아 있습니다. 루트와 서브모듈 모두에
id(Plugins.JACOCO)
를 선언하면 설정 난해도·태스크 중복이 발생합니다. 루트 집계 리포트만 필요하다면 루트에서 제거하고 서브모듈에만 유지하는 편이 깔끔합니다.Also applies to: 50-51
113-116
: BootJar 비활성화 범위가 서브모듈에 적용되지 않았습니다이전 리뷰에서 동일 내용이 언급됐습니다. 서브모듈의
bootJar
태스크도 함께 끄려면 다음과 같이 추가하세요.subprojects { tasks.withType<BootJar> { enabled = false } }
145-161
: SonarCloud 설정 값 하드코딩 지속프로젝트 키·조직명이 그대로 하드코딩되어 있어 포크/다른 조직 사용 시 변경이 번거롭습니다.
project.findProperty("sonar.projectKey") ?: "default"
형태로 외부 프로퍼티를 우선시하도록 한 번 더 검토해 주세요.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (1)
build.gradle.kts
(3 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: build-validation
🔇 Additional comments (1)
build.gradle.kts (1)
69-72
: 컴파일러 플래그 누적 방식 적용 👍
+=
형태로 변경돼 기존 플래그 손실 우려가 해소되었습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (4)
build.gradle.kts (4)
11-12
: 루트·서브모듈에jacoco
중복 적용 문제 여전히 존재이 줄에서 루트에
jacoco
플러그인을 적용하고, 아래subprojects { ... }
블록에서도 다시 적용하고 있습니다. 이전 리뷰에서도 동일 지적이 있었으나 반영되지 않았습니다. 루트 선언을 제거하거나apply false
처리해 중복을 없애세요.
84-92
:finalizedBy("jacocoTestReport")
— 문자열 참조는 다중 Test 태스크에서 누락 가능
integrationTest
‧functionalTest
등 추가 Test 태스크가 있는 모듈은jacocoTestReport
실행이 보장되지 않습니다.
이전 리뷰와 동일한 지적이므로finalizedBy(tasks.named<JacocoReport>("jacocoTestReport"))
로 변경하거나, 특정 테스트 태스크만 선택적으로 지정하세요.
107-109
: 존재하지 않는.exec
파일 접근 시 경고 발생 가능
fileTree
결과에filter { it.exists() }
가 없어 빌드 초기 경고가 그대로 발생합니다. 지난 리뷰와 동일 지적입니다.
144-160
: Sonar 설정 하드코딩 및 속성 오용
sonar.projectKey
,sonar.organization
값이 그대로 하드코딩돼 있습니다. 지난 리뷰와 동일 지적입니다.project.findProperty(...) ?: System.getenv(...)
방식으로 분리해 주세요.sonar.kotlin.coveragePlugin
에Plugins.JACOCO
상수를 넘기면 실제 값이jacoco
가 아닐 수 있습니다. 문서상 허용 값은"jacoco"
문자열입니다. 확인 후 문자열 리터럴로 지정하거나 속성을 제거하세요.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (1)
build.gradle.kts
(3 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: build-validation
🔇 Additional comments (1)
build.gradle.kts (1)
69-72
: 컴파일러 플래그 누적 방식 변경 반영 👍
+=
로 누적하도록 수정되어 기존 플래그 손실 위험이 해소됐습니다.
// 루트 프로젝트 JaCoCo 통합 리포트 설정 | ||
tasks.register<JacocoReport>("jacocoRootReport") { | ||
description = "Generates an aggregate report from all subprojects" | ||
group = "reporting" | ||
|
||
dependsOn(subprojects.map { it.tasks.named("test") }) | ||
|
||
sourceDirectories.setFrom(subprojects.map { it.the<SourceSetContainer>()["main"].allSource.srcDirs }) | ||
classDirectories.setFrom(subprojects.map { subproject -> | ||
subproject.fileTree(subproject.layout.buildDirectory.get().asFile.resolve("classes/kotlin/main")) { | ||
exclude(testExclusionPatterns) | ||
} | ||
}) | ||
executionData.from(subprojects.map { subproject -> | ||
subproject.fileTree(subproject.layout.buildDirectory.dir("jacoco")) { | ||
include("**/*.exec") | ||
} | ||
}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
통합 리포트에도 .exec
존재 여부 필터 필요
jacocoRootReport
의 executionData.from(...)
에서도 .exec
파일이 없을 때 경고가 출력됩니다. 아래처럼 필터를 추가해 안전하게 수집하세요.
- executionData.from(subprojects.map { subproject ->
- subproject.fileTree(subproject.layout.buildDirectory.dir("jacoco")) {
- include("**/*.exec")
- }
- })
+ executionData.from(subprojects.map { sp ->
+ sp.fileTree("${sp.buildDir}/jacoco") {
+ include("**/*.exec")
+ }.filter { it.exists() }
+ })
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
// 루트 프로젝트 JaCoCo 통합 리포트 설정 | |
tasks.register<JacocoReport>("jacocoRootReport") { | |
description = "Generates an aggregate report from all subprojects" | |
group = "reporting" | |
dependsOn(subprojects.map { it.tasks.named("test") }) | |
sourceDirectories.setFrom(subprojects.map { it.the<SourceSetContainer>()["main"].allSource.srcDirs }) | |
classDirectories.setFrom(subprojects.map { subproject -> | |
subproject.fileTree(subproject.layout.buildDirectory.get().asFile.resolve("classes/kotlin/main")) { | |
exclude(testExclusionPatterns) | |
} | |
}) | |
executionData.from(subprojects.map { subproject -> | |
subproject.fileTree(subproject.layout.buildDirectory.dir("jacoco")) { | |
include("**/*.exec") | |
} | |
}) | |
// 루트 프로젝트 JaCoCo 통합 리포트 설정 | |
tasks.register<JacocoReport>("jacocoRootReport") { | |
description = "Generates an aggregate report from all subprojects" | |
group = "reporting" | |
dependsOn(subprojects.map { it.tasks.named("test") }) | |
sourceDirectories.setFrom(subprojects.map { it.the<SourceSetContainer>()["main"].allSource.srcDirs }) | |
classDirectories.setFrom(subprojects.map { subproject -> | |
subproject.fileTree(subproject.layout.buildDirectory.get().asFile.resolve("classes/kotlin/main")) { | |
exclude(testExclusionPatterns) | |
} | |
}) | |
executionData.from(subprojects.map { sp -> | |
sp.fileTree("${sp.buildDir}/jacoco") { | |
include("**/*.exec") | |
}.filter { it.exists() } | |
}) | |
} |
🤖 Prompt for AI Agents
In build.gradle.kts around lines 118 to 135, the jacocoRootReport task's
executionData.from(...) collects .exec files without checking if they exist,
causing warnings when no .exec files are present. Modify the code to filter out
empty file collections by adding a check to include only non-empty file trees,
ensuring safe and warning-free aggregation of execution data.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
테스트 커버리지 측정은 저 커맨트 명령어로 해도 좋은 것 같아요!
추후에 테스트코드 작성할 때 최소 몇퍼 커버리지로 가져갈지
테스트 코드에 대한 컨벤션도 맞춰보면 좋을 것 같습니다
고생하셨습니다~
🔗 관련 이슈
📘 작업 유형
📙 작업 내역
🎯 개요
✨ 주요 변경 사항
0. kover 대신 JaCoCo 사용
1. JaCoCo 테스트 커버리지 설정
2. SonarQube 정적 분석 연동
3. Gradle 빌드 스크립트 고도화
4. 편의 태스크 추가 및 정리
5. CI 워크플로우 간소화 (GitHub Actions)
🚀 실행 방법
./gradlew checkCoverage
./gradlew cleanReports
./gradlew fullCheck
가 자동으로 실행됩니다.🧪 테스트 내역
🎨 스크린샷 또는 시연 영상 (선택)
✅ PR 체크리스트
💬 추가 설명 or 리뷰 포인트 (선택)
Summary by CodeRabbit
Summary by CodeRabbit
새로운 기능
개선 사항