From 44d320b9aa01cdce09d4c79661976199c2dd8491 Mon Sep 17 00:00:00 2001 From: can019 Date: Sat, 27 Sep 2025 15:12:03 +0900 Subject: [PATCH 1/7] =?UTF-8?q?refactor:=20ci-java=EC=97=90=20gradle=20act?= =?UTF-8?q?ion=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-java.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-java.yml b/.github/workflows/ci-java.yml index e3349be5..39d9a9a4 100644 --- a/.github/workflows/ci-java.yml +++ b/.github/workflows/ci-java.yml @@ -37,7 +37,9 @@ jobs: with: java-version: '21' distribution: 'temurin' - cache: 'gradle' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 - name: Grant execute permission for Gradle wrapper run: chmod +x ./gradlew @@ -64,7 +66,9 @@ jobs: with: java-version: '${{ matrix.java-version }}' distribution: 'temurin' - cache: 'gradle' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 - name: Grant execute permission for Gradle wrapper run: chmod +x ./gradlew From 393e5bed7b250b4fd373766db3920f3eafff0896 Mon Sep 17 00:00:00 2001 From: can019 Date: Sat, 27 Sep 2025 15:33:49 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20gradle=20properties=EC=97=90?= =?UTF-8?q?=EC=84=9C=20build=20caching=20=ED=99=9C=EC=84=B1=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 각 Job 내에서 변경되지 않은 task는 UP-TO-DATE 처리 - Job 간 중복 컴파일은 그대로 두되, Job 내 불필요한 재작업 방지 - 안전하고 검증된 기본 최적화 --- .github/workflows/ci-java.yml | 1 + apps/user-service/gradle.properties | 1 + 2 files changed, 2 insertions(+) create mode 100644 apps/user-service/gradle.properties diff --git a/.github/workflows/ci-java.yml b/.github/workflows/ci-java.yml index 39d9a9a4..49a6b8f9 100644 --- a/.github/workflows/ci-java.yml +++ b/.github/workflows/ci-java.yml @@ -12,6 +12,7 @@ on: - release/** paths: - "apps/user-service/**" + - ".github/workflows/ci-java.yml" permissions: contents: read diff --git a/apps/user-service/gradle.properties b/apps/user-service/gradle.properties new file mode 100644 index 00000000..5f1ed7bb --- /dev/null +++ b/apps/user-service/gradle.properties @@ -0,0 +1 @@ +org.gradle.caching=true \ No newline at end of file From c045bf0868f97f62ab26beee1679757b87e1d9e2 Mon Sep 17 00:00:00 2001 From: can019 Date: Sat, 27 Sep 2025 15:39:48 +0900 Subject: [PATCH 3/7] =?UTF-8?q?refactor:=20Test,=20document=20step=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-java.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/ci-java.yml b/.github/workflows/ci-java.yml index 49a6b8f9..fef3c290 100644 --- a/.github/workflows/ci-java.yml +++ b/.github/workflows/ci-java.yml @@ -90,6 +90,14 @@ jobs: fi working-directory: apps/user-service + - name: Generate documents + run: | + ./gradlew javadoc + if [ "${{ github.base_ref }}" = "main" ] || [[ "${{ github.ref }}" == refs/tags/* ]]; then + ./gradlew openapi3 + fi + working-directory: apps/user-service + - name: Upload build artifacts if: matrix.java-version == '21' && startsWith(github.ref, 'refs/tags/') uses: actions/upload-artifact@v4 From 3c7b607171b201d9d4571a512431018c10386fb5 Mon Sep 17 00:00:00 2001 From: can019 Date: Sat, 27 Sep 2025 15:59:21 +0900 Subject: [PATCH 4/7] =?UTF-8?q?chore:=20=EC=93=B8=EB=AA=A8=EC=97=86?= =?UTF-8?q?=EB=8A=94=20dev=20container=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../site/icebang/TestUserServiceApplication.java | 12 ------------ .../site/icebang/TestcontainersConfiguration.java | 6 ------ 2 files changed, 18 deletions(-) delete mode 100644 apps/user-service/src/test/java/site/icebang/TestUserServiceApplication.java delete mode 100644 apps/user-service/src/test/java/site/icebang/TestcontainersConfiguration.java diff --git a/apps/user-service/src/test/java/site/icebang/TestUserServiceApplication.java b/apps/user-service/src/test/java/site/icebang/TestUserServiceApplication.java deleted file mode 100644 index ba8c2403..00000000 --- a/apps/user-service/src/test/java/site/icebang/TestUserServiceApplication.java +++ /dev/null @@ -1,12 +0,0 @@ -package site.icebang; - -import org.springframework.boot.SpringApplication; - -public class TestUserServiceApplication { - - public static void main(String[] args) { - SpringApplication.from(UserServiceApplication::main) - .with(TestcontainersConfiguration.class) - .run(args); - } -} diff --git a/apps/user-service/src/test/java/site/icebang/TestcontainersConfiguration.java b/apps/user-service/src/test/java/site/icebang/TestcontainersConfiguration.java deleted file mode 100644 index b9eb7b76..00000000 --- a/apps/user-service/src/test/java/site/icebang/TestcontainersConfiguration.java +++ /dev/null @@ -1,6 +0,0 @@ -package site.icebang; - -import org.springframework.boot.test.context.TestConfiguration; - -@TestConfiguration(proxyBeanMethods = false) -class TestcontainersConfiguration {} From 64eca6d1d2e878ced712284ffa0796bbb28c1ed3 Mon Sep 17 00:00:00 2001 From: can019 Date: Sat, 27 Sep 2025 16:00:33 +0900 Subject: [PATCH 5/7] =?UTF-8?q?refactor:=20lint,=20test=20=20step=20?= =?UTF-8?q?=EC=88=98=ED=96=89=20=EC=A1=B0=EA=B1=B4=20=ED=8F=89=EA=B0=80=20?= =?UTF-8?q?=ED=9B=84=20=EC=8B=A4=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 각 step이 자신에게 관게있는 파일 변경 시에만 실행 --- .github/workflows/ci-java.yml | 78 ++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci-java.yml b/.github/workflows/ci-java.yml index fef3c290..212532a2 100644 --- a/.github/workflows/ci-java.yml +++ b/.github/workflows/ci-java.yml @@ -33,20 +33,41 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Check for Java-related changes + uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + java-source: + - 'apps/user-service/src/main/**' + - 'apps/user-service/build.gradle' + - 'apps/user-service/gradle.properties' + - 'apps/user-service/gradle/**' + unit-tests: + - 'apps/user-service/src/test/**/unit/**' + integration-tests: + - 'apps/user-service/src/test/**/integration/**' + e2e-tests: + - 'apps/user-service/src/test/**/e2e/**' + - name: Set up JDK 21 + if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' uses: actions/setup-java@v4 with: java-version: '21' distribution: 'temurin' - name: Setup Gradle + if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' uses: gradle/actions/setup-gradle@v3 - name: Grant execute permission for Gradle wrapper + if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' run: chmod +x ./gradlew working-directory: apps/user-service - name: Run Spotless Check + if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' run: ./gradlew spotlessCheck working-directory: apps/user-service @@ -62,40 +83,67 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Check for Java-related changes + uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + java-source: + - 'apps/user-service/src/main/**' + - 'apps/user-service/build.gradle' + - 'apps/user-service/gradle.properties' + - 'apps/user-service/gradle/**' + unit-tests: + - 'apps/user-service/src/test/**/unit/**' + integration-tests: + - 'apps/user-service/src/test/**/integration/**' + e2e-tests: + - 'apps/user-service/src/test/**/e2e/**' + - name: Set up JDK ${{ matrix.java-version }} + if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' uses: actions/setup-java@v4 with: java-version: '${{ matrix.java-version }}' distribution: 'temurin' - name: Setup Gradle + if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' uses: gradle/actions/setup-gradle@v3 - name: Grant execute permission for Gradle wrapper + if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' run: chmod +x ./gradlew working-directory: apps/user-service - name: Run Gradle Build + if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' run: ./gradlew build -x test working-directory: apps/user-service - - name: Run Tests - run: | - ./gradlew unitTest - ./gradlew integrationTest - ./gradlew javadoc - if [ "${{ github.base_ref }}" = "main" ] || [[ "${{ github.ref }}" == refs/tags/* ]]; then - ./gradlew e2eTest - ./gradlew openapi3 - fi + - name: Run Unit Tests + if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' + run: ./gradlew unitTest working-directory: apps/user-service - - name: Generate documents - run: | - ./gradlew javadoc - if [ "${{ github.base_ref }}" = "main" ] || [[ "${{ github.ref }}" == refs/tags/* ]]; then - ./gradlew openapi3 - fi + - name: Run Integration Tests + if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.integration-tests == 'true' + run: ./gradlew integrationTest + working-directory: apps/user-service + + - name: Run E2E Tests + if: (steps.changes.outputs.java-source == 'true' || steps.changes.outputs.e2e-tests == 'true') && (github.base_ref == 'main' || startsWith(github.ref, 'refs/tags/')) + run: ./gradlew e2eTest + working-directory: apps/user-service + + - name: Generate Javadoc + if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' + run: ./gradlew javadoc + working-directory: apps/user-service + + - name: Generate OpenAPI + if: (steps.changes.outputs.java-source == 'true' || steps.changes.outputs.integration-tests == 'true') && (github.base_ref == 'main' || startsWith(github.ref, 'refs/tags/')) + run: ./gradlew openapi3 working-directory: apps/user-service - name: Upload build artifacts From 7e20e1536f9948ed9a940851fa4bbf9b0d588806 Mon Sep 17 00:00:00 2001 From: can019 Date: Sat, 27 Sep 2025 16:12:24 +0900 Subject: [PATCH 6/7] =?UTF-8?q?chore:=20=EB=B3=80=EA=B2=BD=EC=A0=90?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=9D=BC=20step=20=EC=8B=A4=ED=96=89=20re?= =?UTF-8?q?vert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR sync시에도 base와 변경점을 감지 - 소스 변경: 모든 테스트 영향 (컴파일 필요) - 테스트 변경: 빌드는 필요 - 의존성 복잡: Unit ↔ Integration 경계 모호 - 복잡성 증가 > 성능 향상 - 조건문 길어짐: 가독성 저하 - 멀티 모듈이라면 의미가 있지만 단일 모듈, 의미 없다고 판단 --- .github/workflows/ci-java.yml | 72 +++++------------------------------ 1 file changed, 9 insertions(+), 63 deletions(-) diff --git a/.github/workflows/ci-java.yml b/.github/workflows/ci-java.yml index 212532a2..71fc148f 100644 --- a/.github/workflows/ci-java.yml +++ b/.github/workflows/ci-java.yml @@ -33,41 +33,21 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Check for Java-related changes - uses: dorny/paths-filter@v3 - id: changes - with: - filters: | - java-source: - - 'apps/user-service/src/main/**' - - 'apps/user-service/build.gradle' - - 'apps/user-service/gradle.properties' - - 'apps/user-service/gradle/**' - unit-tests: - - 'apps/user-service/src/test/**/unit/**' - integration-tests: - - 'apps/user-service/src/test/**/integration/**' - e2e-tests: - - 'apps/user-service/src/test/**/e2e/**' - name: Set up JDK 21 - if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' uses: actions/setup-java@v4 with: java-version: '21' distribution: 'temurin' - name: Setup Gradle - if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' uses: gradle/actions/setup-gradle@v3 - name: Grant execute permission for Gradle wrapper - if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' run: chmod +x ./gradlew working-directory: apps/user-service - name: Run Spotless Check - if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' run: ./gradlew spotlessCheck working-directory: apps/user-service @@ -83,67 +63,33 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Check for Java-related changes - uses: dorny/paths-filter@v3 - id: changes - with: - filters: | - java-source: - - 'apps/user-service/src/main/**' - - 'apps/user-service/build.gradle' - - 'apps/user-service/gradle.properties' - - 'apps/user-service/gradle/**' - unit-tests: - - 'apps/user-service/src/test/**/unit/**' - integration-tests: - - 'apps/user-service/src/test/**/integration/**' - e2e-tests: - - 'apps/user-service/src/test/**/e2e/**' - name: Set up JDK ${{ matrix.java-version }} - if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' uses: actions/setup-java@v4 with: java-version: '${{ matrix.java-version }}' distribution: 'temurin' - name: Setup Gradle - if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' uses: gradle/actions/setup-gradle@v3 - name: Grant execute permission for Gradle wrapper - if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' run: chmod +x ./gradlew working-directory: apps/user-service - name: Run Gradle Build - if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' run: ./gradlew build -x test working-directory: apps/user-service - - name: Run Unit Tests - if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' - run: ./gradlew unitTest - working-directory: apps/user-service - - - name: Run Integration Tests - if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.integration-tests == 'true' - run: ./gradlew integrationTest - working-directory: apps/user-service - - - name: Run E2E Tests - if: (steps.changes.outputs.java-source == 'true' || steps.changes.outputs.e2e-tests == 'true') && (github.base_ref == 'main' || startsWith(github.ref, 'refs/tags/')) - run: ./gradlew e2eTest - working-directory: apps/user-service - - - name: Generate Javadoc - if: steps.changes.outputs.java-source == 'true' || steps.changes.outputs.unit-tests == 'true' || steps.changes.outputs.integration-tests == 'true' || steps.changes.outputs.e2e-tests == 'true' - run: ./gradlew javadoc - working-directory: apps/user-service - - - name: Generate OpenAPI - if: (steps.changes.outputs.java-source == 'true' || steps.changes.outputs.integration-tests == 'true') && (github.base_ref == 'main' || startsWith(github.ref, 'refs/tags/')) - run: ./gradlew openapi3 + - name: Run Tests + run: | + ./gradlew unitTest + ./gradlew integrationTest + ./gradlew javadoc + if [ "${{ github.base_ref }}" = "main" ] || [[ "${{ github.ref }}" == refs/tags/* ]]; then + ./gradlew e2eTest + ./gradlew openapi3 + fi working-directory: apps/user-service - name: Upload build artifacts From dc9ff0047c92658769d2ce64fffff9f37740058b Mon Sep 17 00:00:00 2001 From: can019 Date: Sat, 27 Sep 2025 16:31:29 +0900 Subject: [PATCH 7/7] =?UTF-8?q?refactor:=20Tag=20=EB=B0=9C=ED=96=89=20?= =?UTF-8?q?=EC=8B=9C=20cache=EA=B0=80=20=EC=93=B0=EC=9D=B4=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-java.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci-java.yml b/.github/workflows/ci-java.yml index 71fc148f..0cae6a72 100644 --- a/.github/workflows/ci-java.yml +++ b/.github/workflows/ci-java.yml @@ -42,6 +42,8 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 + with: + cache-read-only: ${{ github.event_name == 'pull_request' }} - name: Grant execute permission for Gradle wrapper run: chmod +x ./gradlew @@ -72,6 +74,8 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 + with: + cache-read-only: ${{ github.event_name == 'pull_request' }} - name: Grant execute permission for Gradle wrapper run: chmod +x ./gradlew