From 09ede0ca39550a06ab6e1666450d6ab632966eec Mon Sep 17 00:00:00 2001 From: rowing0328 Date: Wed, 5 Feb 2025 02:05:14 +0900 Subject: [PATCH 1/9] =?UTF-8?q?=E2=9E=95=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20:=20SonarQube=20&=20JaCoCo=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 153 +++++++++++++++++++++++++ src/main/resources/application-dev.yml | 38 ------ 2 files changed, 153 insertions(+), 38 deletions(-) delete mode 100644 src/main/resources/application-dev.yml diff --git a/build.gradle b/build.gradle index 8110bd33..18a2f945 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,22 @@ plugins { id 'java' id 'org.springframework.boot' version '3.3.1' id 'io.spring.dependency-management' version '1.1.5' + id "org.sonarqube" version "6.0.1.5171" + id "jacoco" +} + +sonar { + properties { + property "sonar.projectKey", "ITZipProject_itzip_back_a08e7d1d-048d-4a24-882a-266ba11904c2" + property "sonar.projectName", "itzip_back" + property "sonar.language", "java" + property "sonar.sourceEncoding", "UTF-8" + property "sonar.sources", "src/main" + property "sonar.tests", "src/test" + property "sonar.java.binaries", "${buildDir}/classes" + property "sonar.test.inclusions", "**/*Test.java" + property 'sonar.coverage.jacoco.xmlReportPaths', "${buildDir}/reports/jacoco/test/jacocoTestReport.xml" + } } group = 'darkoverload' @@ -138,4 +154,141 @@ clean { tasks.named('test') { useJUnitPlatform() +} + +sonar { + properties { + property "sonar.projectKey", "ITZipProject_itzip_back_a08e7d1d-048d-4a24-882a-266ba11904c2" + property "sonar.projectName", "itzip_back" + property "sonar.language", "java" + property "sonar.sourceEncoding", "UTF-8" + property "sonar.sources", "src/main" + property "sonar.tests", "src/test" + property "sonar.java.binaries", "${buildDir}/classes" + property "sonar.test.inclusions", "**/*Test.java" + property 'sonar.coverage.jacoco.xmlReportPaths', "${buildDir}/reports/jacoco/test/jacocoTestReport.xml" + } +} + +// jacoco 정보 +jacoco { + toolVersion = "0.8.11" + layout.buildDirectory.dir("reports/jacoco") +} + +// jacoco Report 생성 +jacocoTestReport { + dependsOn test // test 종속성 추가 + + reports { + xml.required = true + csv.required = false + html.required = true + } + + def QEntityList = [ + 'darkoverload/itzip/feature/**/entity/QA*', + 'darkoverload/itzip/feature/**/entity/QB*', + 'darkoverload/itzip/feature/**/entity/QC*', + 'darkoverload/itzip/feature/**/entity/QD*', + 'darkoverload/itzip/feature/**/entity/QE*', + 'darkoverload/itzip/feature/**/entity/QF*', + 'darkoverload/itzip/feature/**/entity/QG*', + 'darkoverload/itzip/feature/**/entity/QH*', + 'darkoverload/itzip/feature/**/entity/QI*', + 'darkoverload/itzip/feature/**/entity/QJ*', + 'darkoverload/itzip/feature/**/entity/QK*', + 'darkoverload/itzip/feature/**/entity/QL*', + 'darkoverload/itzip/feature/**/entity/QM*', + 'darkoverload/itzip/feature/**/entity/QN*', + 'darkoverload/itzip/feature/**/entity/QO*', + 'darkoverload/itzip/feature/**/entity/QP*', + 'darkoverload/itzip/feature/**/entity/QQ*', + 'darkoverload/itzip/feature/**/entity/QR*', + 'darkoverload/itzip/feature/**/entity/QS*', + 'darkoverload/itzip/feature/**/entity/QT*', + 'darkoverload/itzip/feature/**/entity/QU*', + 'darkoverload/itzip/feature/**/entity/QV*', + 'darkoverload/itzip/feature/**/entity/QW*', + 'darkoverload/itzip/feature/**/entity/QX*', + 'darkoverload/itzip/feature/**/entity/QY*', + 'darkoverload/itzip/feature/**/entity/QZ*' + ] + + def QDomainList = [ + 'darkoverload/itzip/feature/**/domain/QA*', + 'darkoverload/itzip/feature/**/domain/QB*', + 'darkoverload/itzip/feature/**/domain/QC*', + 'darkoverload/itzip/feature/**/domain/QD*', + 'darkoverload/itzip/feature/**/domain/QE*', + 'darkoverload/itzip/feature/**/domain/QF*', + 'darkoverload/itzip/feature/**/domain/QG*', + 'darkoverload/itzip/feature/**/domain/QH*', + 'darkoverload/itzip/feature/**/domain/QI*', + 'darkoverload/itzip/feature/**/domain/QJ*', + 'darkoverload/itzip/feature/**/domain/QK*', + 'darkoverload/itzip/feature/**/domain/QL*', + 'darkoverload/itzip/feature/**/domain/QM*', + 'darkoverload/itzip/feature/**/domain/QN*', + 'darkoverload/itzip/feature/**/domain/QO*', + 'darkoverload/itzip/feature/**/domain/QP*', + 'darkoverload/itzip/feature/**/domain/QQ*', + 'darkoverload/itzip/feature/**/domain/QR*', + 'darkoverload/itzip/feature/**/domain/QS*', + 'darkoverload/itzip/feature/**/domain/QT*', + 'darkoverload/itzip/feature/**/domain/QU*', + 'darkoverload/itzip/feature/**/domain/QV*', + 'darkoverload/itzip/feature/**/domain/QW*', + 'darkoverload/itzip/feature/**/domain/QX*', + 'darkoverload/itzip/feature/**/domain/QY*', + 'darkoverload/itzip/feature/**/domain/QZ*' + ] + + afterEvaluate { + classDirectories.setFrom(files(classDirectories.files.collect { + fileTree(dir: it, exclude: [ + 'darkoverload/itzip/global/**', + 'darkoverload/itzip/infra/**', + 'darkoverload/itzip/mongo/**', + 'darkoverload/itzip/postgresql/**', + 'darkoverload/itzip/sample/**', + ] + QEntityList + QDomainList) + })) + } + + // finalizedBy 'jacocoTestCoverageVerification' // jacocoTestReport 태스크가 끝난 후 실행 +} + +// jacoco Test 유효성 확인 +jacocoTestCoverageVerification { + def QDomainList = [] + for (qPattern in '*.QA'..'*.QZ') { // QClass 대응 + QDomainList.add(qPattern + '*') + } + + violationRules { + rule { + enabled = true // 규칙 활성화 여부 + element = 'CLASS' // 커버리지를 체크할 단위 설정 + + // 코드 커버리지를 측정할 때 사용되는 지표 + limit { + counter = 'LINE' + value = 'COVEREDRATIO' + minimum = 0.30 + } + + limit { + counter = 'BRANCH' + value = 'COVEREDRATIO' + minimum = 0.30 + } + + excludes = [ + '**/common/**', + '**/*Application*' + ] + QDomainList + } + } + } \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml deleted file mode 100644 index b0b46121..00000000 --- a/src/main/resources/application-dev.yml +++ /dev/null @@ -1,38 +0,0 @@ -# 현재 설정 값은 local만 있음 -spring: - datasource: - url: ${LOC_POSTGRESQL_URL} - username: ${LOC_POSTGRESQL_USERNAME} - password: ${LOC_POSTGRESQL_PASSWORD} - driver-class-name: org.postgresql.Driver - - data: - redis: - host: ${LOC_REDIS_HOST} - port: ${LOC_REDIS_PORT} - password: ${LOC_REDIS_PASSWORD} - - mongodb: - host: ${LOC_MONGO_HOST} - port: ${LOC_MONGO_PORT} - username: ${LOC_MONGO_USERNAME} - password: ${LOC_MONGO_PASSWORD} - database: ${LOC_MONGO_DATABASE} - authentication-database: ${LOC_MONGO_AUTH} - uri: ${LOC_MONGO_URI} - -cloud: - aws: - credentials: - instance-profile: false - accessKey: ${LOC_AWS_ACCESS_KEY} - secretKey: ${LOC_AWS_SECRET_KEY} - s3: - bucket: ${LOC_AWS_BUCKET_NAME} - region: - auto: false - static: ap-northeast-2 - stack: false - -file: - cloudfront-path: ${LOC_FILE_PATH} \ No newline at end of file From 372ca297c7031d4ae82ef9bfe71f4d31f5dbd60d Mon Sep 17 00:00:00 2001 From: rowing0328 Date: Wed, 5 Feb 2025 02:06:08 +0900 Subject: [PATCH 2/9] =?UTF-8?q?=F0=9F=91=B7=20CI=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20:=20SonarQube=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/sonarqube.yml | 57 +++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 .github/workflows/sonarqube.yml diff --git a/.github/workflows/sonarqube.yml b/.github/workflows/sonarqube.yml new file mode 100644 index 00000000..72a3e085 --- /dev/null +++ b/.github/workflows/sonarqube.yml @@ -0,0 +1,57 @@ +name: Java CI with Gradle Build Sonarqube + +on: + pull_request: + branches: + - '*' + +jobs: + sonarqube: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up JDK 21 + uses: actions/setup-java@v3 + with: + java-version: '21' + distribution: 'temurin' + + - name: Cache SonarQube packages + uses: actions/cache@v4 + with: + path: ~/.sonar/cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + + - name: Cache Gradle packages + uses: actions/cache@v4 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: ${{ runner.os }}-gradle + + - name: Secret Test Env File Download + run: | + mkdir -p ./src/test/resources/properties + echo "${{ secrets.TEST_ENV_FILE }}" > ./src/test/resources/properties/test-env.properties + + - name: Build and analyze + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} + run: ./gradlew build sonar + + - name: Send SonarQube Analysis Result to Discord + env: + SONAR_PROJECT_NAME: ${{ secrets.SONAR_PROJECT_NAME }} + SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} + PR_NUMBER: ${{ github.event.pull_request.number }} + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + run: | + curl -H "Content-Type: application/json" \ + -d "{\"content\": \"📊 **SonarQube 분석 결과**\n\n프로젝트: **${SONAR_PROJECT_NAME}**\nPull Request 번호: **${PR_NUMBER}**\n분석 결과 링크: [SonarQube 결과 확인하기](${SONAR_HOST_URL})\"}" \ + $DISCORD_WEBHOOK_URL From 79e65377fbc9d705a02808a9fd2fb702ec4f093b Mon Sep 17 00:00:00 2001 From: rowing0328 Date: Wed, 5 Feb 2025 02:12:18 +0900 Subject: [PATCH 3/9] =?UTF-8?q?=E2=9C=85=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20:=20=EA=B3=B5=EB=B0=B1=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/darkoverload/itzip/ItzipApplicationTests.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/darkoverload/itzip/ItzipApplicationTests.java b/src/test/java/darkoverload/itzip/ItzipApplicationTests.java index 0be6fc44..8e213a27 100644 --- a/src/test/java/darkoverload/itzip/ItzipApplicationTests.java +++ b/src/test/java/darkoverload/itzip/ItzipApplicationTests.java @@ -11,4 +11,5 @@ class ItzipApplicationTests { @Test void contextLoads() { } -} \ No newline at end of file + +} From af144eaafba13a0910b8f7dd9f21c18722c334cf Mon Sep 17 00:00:00 2001 From: rowing0328 Date: Wed, 5 Feb 2025 02:15:23 +0900 Subject: [PATCH 4/9] =?UTF-8?q?=F0=9F=91=B7=20CI=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20:=20SonarQube=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=99=98=EA=B2=BD=ED=8C=8C=EC=9D=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/sonarqube.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/sonarqube.yml b/.github/workflows/sonarqube.yml index 72a3e085..d055a2cb 100644 --- a/.github/workflows/sonarqube.yml +++ b/.github/workflows/sonarqube.yml @@ -34,6 +34,11 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} restore-keys: ${{ runner.os }}-gradle + - name: Secret Prod Env File Download + run: | + mkdir -p ./src/main/resources/properties + echo "${{ secrets.PROD_ENV_FILE }}" > ./src/main/resources/properties/env.properties + - name: Secret Test Env File Download run: | mkdir -p ./src/test/resources/properties From 61e6b3d33b8001d05362ee19a3101d640175c1bc Mon Sep 17 00:00:00 2001 From: rowing0328 Date: Wed, 5 Feb 2025 02:38:20 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=F0=9F=91=B7=20CI=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20:=20SonarQube=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 18a2f945..15cfce09 100644 --- a/build.gradle +++ b/build.gradle @@ -14,9 +14,9 @@ sonar { property "sonar.sourceEncoding", "UTF-8" property "sonar.sources", "src/main" property "sonar.tests", "src/test" - property "sonar.java.binaries", "${buildDir}/classes" + property "sonar.java.binaries", "build/classes" property "sonar.test.inclusions", "**/*Test.java" - property 'sonar.coverage.jacoco.xmlReportPaths', "${buildDir}/reports/jacoco/test/jacocoTestReport.xml" + property 'sonar.coverage.jacoco.xmlReportPaths', "build/reports/jacoco/test/jacocoTestReport.xml" } } From 859b5ab63a06059b7e6d872110ede798757a25ce Mon Sep 17 00:00:00 2001 From: rowing0328 Date: Wed, 5 Feb 2025 02:41:25 +0900 Subject: [PATCH 6/9] =?UTF-8?q?=F0=9F=91=B7=20CI=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20:=20SonarQube=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=98=B5=EC=85=98=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 15cfce09..d060be08 100644 --- a/build.gradle +++ b/build.gradle @@ -10,11 +10,10 @@ sonar { properties { property "sonar.projectKey", "ITZipProject_itzip_back_a08e7d1d-048d-4a24-882a-266ba11904c2" property "sonar.projectName", "itzip_back" - property "sonar.language", "java" property "sonar.sourceEncoding", "UTF-8" property "sonar.sources", "src/main" property "sonar.tests", "src/test" - property "sonar.java.binaries", "build/classes" + property "sonar.java.binaries", "build/classes/java/main" property "sonar.test.inclusions", "**/*Test.java" property 'sonar.coverage.jacoco.xmlReportPaths', "build/reports/jacoco/test/jacocoTestReport.xml" } From f7948082df50d3198bfe0b2cdde5e99b986301e8 Mon Sep 17 00:00:00 2001 From: rowing0328 Date: Wed, 5 Feb 2025 02:50:22 +0900 Subject: [PATCH 7/9] =?UTF-8?q?=F0=9F=91=B7=20CI=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20:=20SonarQube=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/build.gradle b/build.gradle index d060be08..c3247326 100644 --- a/build.gradle +++ b/build.gradle @@ -6,19 +6,6 @@ plugins { id "jacoco" } -sonar { - properties { - property "sonar.projectKey", "ITZipProject_itzip_back_a08e7d1d-048d-4a24-882a-266ba11904c2" - property "sonar.projectName", "itzip_back" - property "sonar.sourceEncoding", "UTF-8" - property "sonar.sources", "src/main" - property "sonar.tests", "src/test" - property "sonar.java.binaries", "build/classes/java/main" - property "sonar.test.inclusions", "**/*Test.java" - property 'sonar.coverage.jacoco.xmlReportPaths', "build/reports/jacoco/test/jacocoTestReport.xml" - } -} - group = 'darkoverload' version = '0.0.1-SNAPSHOT' @@ -159,13 +146,11 @@ sonar { properties { property "sonar.projectKey", "ITZipProject_itzip_back_a08e7d1d-048d-4a24-882a-266ba11904c2" property "sonar.projectName", "itzip_back" - property "sonar.language", "java" property "sonar.sourceEncoding", "UTF-8" property "sonar.sources", "src/main" property "sonar.tests", "src/test" - property "sonar.java.binaries", "${buildDir}/classes" - property "sonar.test.inclusions", "**/*Test.java" - property 'sonar.coverage.jacoco.xmlReportPaths', "${buildDir}/reports/jacoco/test/jacocoTestReport.xml" + property "sonar.java.binaries", "build/classes/java/main" + property "sonar.coverage.jacoco.xmlReportPaths", "build/reports/jacoco/test/jacocoTestReport.xml" } } @@ -181,8 +166,8 @@ jacocoTestReport { reports { xml.required = true - csv.required = false html.required = true + csv.required = false } def QEntityList = [ @@ -247,7 +232,6 @@ jacocoTestReport { classDirectories.setFrom(files(classDirectories.files.collect { fileTree(dir: it, exclude: [ 'darkoverload/itzip/global/**', - 'darkoverload/itzip/infra/**', 'darkoverload/itzip/mongo/**', 'darkoverload/itzip/postgresql/**', 'darkoverload/itzip/sample/**', From a86bec2f1a308c0c35993a95ada1ba8a710199fe Mon Sep 17 00:00:00 2001 From: rowing0328 Date: Wed, 5 Feb 2025 04:45:40 +0900 Subject: [PATCH 8/9] =?UTF-8?q?=F0=9F=91=B7=20CI=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20:=20JUnit=20&=20JaCoCo=20=EC=97=B0?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index c3247326..2600680f 100644 --- a/build.gradle +++ b/build.gradle @@ -140,24 +140,22 @@ clean { tasks.named('test') { useJUnitPlatform() + finalizedBy jacocoTestReport } sonar { properties { property "sonar.projectKey", "ITZipProject_itzip_back_a08e7d1d-048d-4a24-882a-266ba11904c2" property "sonar.projectName", "itzip_back" - property "sonar.sourceEncoding", "UTF-8" - property "sonar.sources", "src/main" - property "sonar.tests", "src/test" - property "sonar.java.binaries", "build/classes/java/main" - property "sonar.coverage.jacoco.xmlReportPaths", "build/reports/jacoco/test/jacocoTestReport.xml" + property "sonar.java.binaries", "$buildDir/classes/java/main" + property "sonar.test.inclusions", "**/*Test.java" + property "sonar.coverage.jacoco.xmlReportPaths", "$buildDir/reports/jacoco/test/jacocoTestReport.xml" } } // jacoco 정보 jacoco { - toolVersion = "0.8.11" - layout.buildDirectory.dir("reports/jacoco") + toolVersion = '0.8.11' } // jacoco Report 생성 From 7e7b9883504ec0cc786bb9dbd77adb84c88f1d76 Mon Sep 17 00:00:00 2001 From: rowing0328 Date: Wed, 5 Feb 2025 04:57:30 +0900 Subject: [PATCH 9/9] =?UTF-8?q?=E2=9E=95=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20:=20Application=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 2600680f..254f1c58 100644 --- a/build.gradle +++ b/build.gradle @@ -233,6 +233,7 @@ jacocoTestReport { 'darkoverload/itzip/mongo/**', 'darkoverload/itzip/postgresql/**', 'darkoverload/itzip/sample/**', + 'darkoverload/itzip/*Application*' ] + QEntityList + QDomainList) })) }