From ac6cd01477ed88ce1ce8ea5ba53c55a4ffbcf601 Mon Sep 17 00:00:00 2001 From: meraki6512 Date: Fri, 29 Aug 2025 16:04:14 +0900 Subject: [PATCH 1/8] =?UTF-8?q?[#32,=20#25]=20chore:=20Docker=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=20CI=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DB URL에 allowPublicKeyRetrieval 추가 --- .github/workflows/ci-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 5afe25f..00bf487 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -68,7 +68,7 @@ jobs: env: # Spring Boot는 이 환경 변수들을 자동으로 인식하여 DB 설정으로 사용합니다. # URL - localhost: GitHub Actions가 services에 설정된 MySQL 컨테이너를 localhost로 연결 - SPRING_DATASOURCE_URL: jdbc:mysql://localhost:3306/issue_dive?useSSL=false + SPRING_DATASOURCE_URL: jdbc:mysql://localhost:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true SPRING_DATASOURCE_USERNAME: ${{ secrets.DB_USER }} SPRING_DATASOURCE_PASSWORD: ${{ secrets.DB_PASSWORD }} run: | From dd4d11b0d2e2a85d3624a9a54e2c0bf4a16b34ef Mon Sep 17 00:00:00 2001 From: meraki6512 Date: Fri, 29 Aug 2025 16:37:24 +0900 Subject: [PATCH 2/8] =?UTF-8?q?[#32,=20#25]=20chore:=20Docker=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=20CI=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20-=20?= =?UTF-8?q?DB=20URL=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-docker.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 00bf487..151dc83 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -30,6 +30,7 @@ jobs: --health-interval 10s --health-timeout 5s --health-retries 5 + --network-alias mysql # 작업의 단계(Step)들을 정의 steps: @@ -68,12 +69,13 @@ jobs: env: # Spring Boot는 이 환경 변수들을 자동으로 인식하여 DB 설정으로 사용합니다. # URL - localhost: GitHub Actions가 services에 설정된 MySQL 컨테이너를 localhost로 연결 - SPRING_DATASOURCE_URL: jdbc:mysql://localhost:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true + # jdbc:mysql://localhost:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true + # 그치만 Docker container 내부에서는 네트워크 별칭으로 접근하는게 맞음 + SPRING_DATASOURCE_URL: ${{ secrets.DB_URL }} SPRING_DATASOURCE_USERNAME: ${{ secrets.DB_USER }} SPRING_DATASOURCE_PASSWORD: ${{ secrets.DB_PASSWORD }} run: | docker run --rm \ - --network host \ -e SPRING_DATASOURCE_URL=$SPRING_DATASOURCE_URL \ -e SPRING_DATASOURCE_USERNAME=$SPRING_DATASOURCE_USERNAME \ -e SPRING_DATASOURCE_PASSWORD=$SPRING_DATASOURCE_PASSWORD \ From d4b2a8d5da4b3019ab4bee6f419940ec16dc512e Mon Sep 17 00:00:00 2001 From: meraki6512 Date: Fri, 29 Aug 2025 17:03:51 +0900 Subject: [PATCH 3/8] =?UTF-8?q?[#32,=20#25]=20chore:=20Docker=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=20CI=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20-=20?= =?UTF-8?q?secrets=20=EC=9E=84=EC=8B=9C=EB=A1=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ci-docker.yml에서 MySQL 서비스 네트워크 별칭을 'mysql'로 명확히 설정 - 테스트 컨테이너의 SPRING_DATASOURCE_URL을 secrets 대신 하드코딩된 값으로 변경 - Dockerfile gradle.properties 생성 시 echo 리디렉션 방식을 첫 줄 >, 이후 줄 >>로 수정하여 프로퍼티 파일 정상 생성 보장 --- .github/workflows/ci-docker.yml | 27 ++++++++++++++++----------- Dockerfile | 10 ++++++---- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 151dc83..68b6a6f 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -1,11 +1,12 @@ # 워크플로우의 이름 -name: IssueDive Docker CI +name: IssueDive Docker CI Hard # 워크플로우가 언제 실행될지 정의 on: push: branches: [ "dev" ] # dev 브랜치에 push될 때 실행 - pull_request_target: # Fork에서 보낸 PR도 공용 저장소의 Secrets에 접근할 수 있게 pull_request_target으로 변경함 + pull_request: + # pull_request_target: # Fork에서 보낸 PR도 공용 저장소의 Secrets에 접근할 수 있게 pull_request_target으로 변경함 branches: [ "dev" ] # dev 브랜치로 Pull Request가 생성될 때 실행 # 실행될 작업(Job)들을 정의 @@ -21,7 +22,8 @@ jobs: image: mysql:8 # GitHub Secrets를 사용하여 DB를 설정합니다. env: - MYSQL_ROOT_PASSWORD: ${{ secrets.DB_PASSWORD }} + # MYSQL_ROOT_PASSWORD: ${{ secrets.DB_PASSWORD }} + MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: issue_dive ports: - 3306:3306 # Runner의 3306 포트와 컨테이너의 3306 포트를 연결 @@ -44,8 +46,8 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 # 'pull_request_target'을 사용할 때는 어떤 코드를 체크아웃할지 명시해야 합니다. - with: - ref: ${{ github.event.pull_request.head.sha }} + # with: + # ref: ${{ github.event.pull_request.head.sha }} # 3. Docker 이미지 빌드 # Dockerfile을 기반으로 애플리케이션을 빌드하여 Docker 이미지를 생성. @@ -54,9 +56,9 @@ jobs: # GitHub Secrets를 환경 변수로 설정하고, # docker build 명령어에 --build-arg로 전달합니다. env: - DB_URL: ${{ secrets.DB_URL }} - DB_USER: ${{ secrets.DB_USER }} - DB_PASSWORD: ${{ secrets.DB_PASSWORD }} + DB_URL: jdbc:mysql://mysql:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true + DB_USER: root + DB_PASSWORD: password run: | docker build -t issue-dive-app \ --build-arg DB_URL="$DB_URL" \ @@ -71,9 +73,12 @@ jobs: # URL - localhost: GitHub Actions가 services에 설정된 MySQL 컨테이너를 localhost로 연결 # jdbc:mysql://localhost:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true # 그치만 Docker container 내부에서는 네트워크 별칭으로 접근하는게 맞음 - SPRING_DATASOURCE_URL: ${{ secrets.DB_URL }} - SPRING_DATASOURCE_USERNAME: ${{ secrets.DB_USER }} - SPRING_DATASOURCE_PASSWORD: ${{ secrets.DB_PASSWORD }} +# SPRING_DATASOURCE_URL: ${{ secrets.DB_URL }} +# SPRING_DATASOURCE_USERNAME: ${{ secrets.DB_USER }} +# SPRING_DATASOURCE_PASSWORD: ${{ secrets.DB_PASSWORD }} + SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true + SPRING_DATASOURCE_USERNAME: root + SPRING_DATASOURCE_PASSWORD: password run: | docker run --rm \ -e SPRING_DATASOURCE_URL=$SPRING_DATASOURCE_URL \ diff --git a/Dockerfile b/Dockerfile index e2626bc..68c4f6f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,10 +9,12 @@ ARG DB_USER ARG DB_PASSWORD # gradle.properties 파일을 동적으로 생성합니다. -RUN echo "dbUrl=${DB_URL}" >> gradle.properties -RUN echo "dbUser=${DB_USER}" >> gradle.properties -RUN echo "dbPassword=${DB_PASSWORD}" >> gradle.properties - +#RUN echo "dbUrl=${DB_URL}" >> gradle.properties +#RUN echo "dbUser=${DB_USER}" >> gradle.properties +#RUN echo "dbPassword=${DB_PASSWORD}" >> gradle.properties +RUN echo "dbUrl=${DB_URL}" > gradle.properties && \ + echo "dbUser=${DB_USER}" >> gradle.properties && \ + echo "dbPassword=${DB_PASSWORD}" >> gradle.properties # Gradle 캐시 최적화를 위해 build.gradle과 settings.gradle 먼저 복사 COPY build.gradle settings.gradle gradlew ./ From 015ed58bc6192ed97fdd7a6dabaeb967251933db Mon Sep 17 00:00:00 2001 From: meraki6512 Date: Fri, 29 Aug 2025 17:39:29 +0900 Subject: [PATCH 4/8] =?UTF-8?q?[#32,=20#25]=20chore:=20ci-docker.yml=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-docker.yml | 69 ++++++--------------------------- 1 file changed, 11 insertions(+), 58 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 68b6a6f..8a090bc 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -1,60 +1,36 @@ -# 워크플로우의 이름 name: IssueDive Docker CI Hard -# 워크플로우가 언제 실행될지 정의 on: push: - branches: [ "dev" ] # dev 브랜치에 push될 때 실행 + branches: [ "dev" ] pull_request: - # pull_request_target: # Fork에서 보낸 PR도 공용 저장소의 Secrets에 접근할 수 있게 pull_request_target으로 변경함 - branches: [ "dev" ] # dev 브랜치로 Pull Request가 생성될 때 실행 + branches: [ "dev" ] -# 실행될 작업(Job)들을 정의 jobs: - build-and-test: # 작업의 ID - name: Build and Test # 작업의 이름 (GitHub Actions UI에 표시됨) - runs-on: ubuntu-latest # 작업을 실행할 가상 머신 환경 (Ubuntu 최신 버전) + build-and-test: + name: Build and Test + runs-on: ubuntu-latest - # 0. DB 서비스를 여기에 정의합니다. - # 이 작업(Job)이 실행되는 동안 MySQL 컨테이너를 함께 실행합니다. services: mysql: image: mysql:8 - # GitHub Secrets를 사용하여 DB를 설정합니다. env: - # MYSQL_ROOT_PASSWORD: ${{ secrets.DB_PASSWORD }} MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: issue_dive - ports: - - 3306:3306 # Runner의 3306 포트와 컨테이너의 3306 포트를 연결 options: >- --health-cmd "mysqladmin ping" --health-interval 10s --health-timeout 5s --health-retries 5 - --network-alias mysql - # 작업의 단계(Step)들을 정의 steps: - # 1. 소스 코드 체크아웃 - # GitHub Actions Runner가 우리 저장소의 코드에 접근할 수 있도록 내려받는 단계 - name: Checkout source code uses: actions/checkout@v4 - # 2. Docker Buildx 설정 - # Docker 빌드 성능을 향상시키고 다양한 빌드 기능을 활성화하는 단계 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - # 'pull_request_target'을 사용할 때는 어떤 코드를 체크아웃할지 명시해야 합니다. - # with: - # ref: ${{ github.event.pull_request.head.sha }} - # 3. Docker 이미지 빌드 - # Dockerfile을 기반으로 애플리케이션을 빌드하여 Docker 이미지를 생성. - # 이 단계에서 Gradle 빌드가 컨테이너 안에서 먼저 실행됨. - name: Build Docker image - # GitHub Secrets를 환경 변수로 설정하고, - # docker build 명령어에 --build-arg로 전달합니다. env: DB_URL: jdbc:mysql://mysql:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true DB_USER: root @@ -65,43 +41,20 @@ jobs: --build-arg DB_USER="$DB_USER" \ --build-arg DB_PASSWORD="$DB_PASSWORD" \ . - # 4. Docker 컨테이너 안에서 테스트 실행 + - name: Run tests inside Docker container - # GitHub Secrets를 다시 한번 환경 변수로 가져옵니다. env: - # Spring Boot는 이 환경 변수들을 자동으로 인식하여 DB 설정으로 사용합니다. - # URL - localhost: GitHub Actions가 services에 설정된 MySQL 컨테이너를 localhost로 연결 - # jdbc:mysql://localhost:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true - # 그치만 Docker container 내부에서는 네트워크 별칭으로 접근하는게 맞음 -# SPRING_DATASOURCE_URL: ${{ secrets.DB_URL }} -# SPRING_DATASOURCE_USERNAME: ${{ secrets.DB_USER }} -# SPRING_DATASOURCE_PASSWORD: ${{ secrets.DB_PASSWORD }} SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: password run: | + # 네트워크 이름을 동적으로 읽어오기 + NETWORK_NAME=$(docker network ls --filter label=com.docker.compose.project=${{ github.workflow }} --format "{{.Name}}" | head -n 1) + echo "Using docker network: $NETWORK_NAME" + docker run --rm \ + --network $NETWORK_NAME \ -e SPRING_DATASOURCE_URL=$SPRING_DATASOURCE_URL \ -e SPRING_DATASOURCE_USERNAME=$SPRING_DATASOURCE_USERNAME \ -e SPRING_DATASOURCE_PASSWORD=$SPRING_DATASOURCE_PASSWORD \ issue-dive-app ./gradlew test - -# --- 이전 방식 (더 이상 필요 없음) --- -# 이제 모든 빌드와 테스트가 Docker 컨테이너 안에서 이루어지므로, -# GitHub Actions Runner에 직접 Java를 설치하거나 gradlew에 실행 권한을 줄 필요가 없습니다. -# # 2. JDK 17 설치 -# - name: Set up JDK 17 -# uses: actions/setup-java@v4 -# with: -# java-version: '17' -# distribution: 'temurin' - -# # 3. gradlew 파일에 실행 권한 부여 -# - name: Grant execute permission for gradlew -# run: chmod +x ./gradlew - -# # 4. Gradle로 빌드 및 테스트 실행 -# - name: Build with Gradle -# run: ./gradlew build --no-daemon - -# re-run test용 주석 추가 \ No newline at end of file From b57bd2b2dcd4b23f09013c0de8509ab15835fa4a Mon Sep 17 00:00:00 2001 From: meraki6512 Date: Fri, 29 Aug 2025 17:45:53 +0900 Subject: [PATCH 5/8] =?UTF-8?q?[#32,=20#25]=20chore:=20ci-docker.yml=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-docker.yml | 66 +++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 8a090bc..4bde51f 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -48,13 +48,63 @@ jobs: SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: password run: | - # 네트워크 이름을 동적으로 읽어오기 - NETWORK_NAME=$(docker network ls --filter label=com.docker.compose.project=${{ github.workflow }} --format "{{.Name}}" | head -n 1) - echo "Using docker network: $NETWORK_NAME" +name: IssueDive Docker CI Hard + +on: + push: + branches: [ "dev" ] + pull_request: + branches: [ "dev" ] + +jobs: + build-and-test: + name: Build and Test + runs-on: ubuntu-latest + services: + mysql: + image: mysql:8 + env: + MYSQL_ROOT_PASSWORD: password + MYSQL_DATABASE: issue_dive + options: >- + --health-cmd "mysqladmin ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Build Docker image + env: + DB_URL: jdbc:mysql://mysql:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true + DB_USER: root + DB_PASSWORD: password + run: | + docker build -t issue-dive-app \ + --build-arg DB_URL="$DB_URL" \ + --build-arg DB_USER="$DB_USER" \ + --build-arg DB_PASSWORD="$DB_PASSWORD" \ + . + + - name: Run tests inside Docker container + env: + SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true + SPRING_DATASOURCE_USERNAME: root + SPRING_DATASOURCE_PASSWORD: password + run: | + echo "Workflow name is: $GITHUB_WORKFLOW_NAME" + NETWORK_NAME=$(docker network ls --filter label=com.docker.compose.project=$GITHUB_WORKFLOW_NAME --format "{{.Name}}" | head -n 1) + echo "Using docker network: $NETWORK_NAME" + docker run --rm \ - --network $NETWORK_NAME \ - -e SPRING_DATASOURCE_URL=$SPRING_DATASOURCE_URL \ - -e SPRING_DATASOURCE_USERNAME=$SPRING_DATASOURCE_USERNAME \ - -e SPRING_DATASOURCE_PASSWORD=$SPRING_DATASOURCE_PASSWORD \ - issue-dive-app ./gradlew test + --network $NETWORK_NAME \ + -e SPRING_DATASOURCE_URL=$SPRING_DATASOURCE_URL \ + -e SPRING_DATASOURCE_USERNAME=$SPRING_DATASOURCE_USERNAME \ + -e SPRING_DATASOURCE_PASSWORD=$SPRING_DATASOURCE_PASSWORD \ + issue-dive-app ./gradlew test \ No newline at end of file From 590524598649a76c6134e421b88e1cecc6b59621 Mon Sep 17 00:00:00 2001 From: meraki6512 Date: Fri, 29 Aug 2025 17:47:22 +0900 Subject: [PATCH 6/8] =?UTF-8?q?[#32,=20#25]=20chore:=20ci-docker.yml=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-docker.yml | 50 --------------------------------- 1 file changed, 50 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 4bde51f..2ff795e 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -1,55 +1,5 @@ name: IssueDive Docker CI Hard -on: - push: - branches: [ "dev" ] - pull_request: - branches: [ "dev" ] - -jobs: - build-and-test: - name: Build and Test - runs-on: ubuntu-latest - - services: - mysql: - image: mysql:8 - env: - MYSQL_ROOT_PASSWORD: password - MYSQL_DATABASE: issue_dive - options: >- - --health-cmd "mysqladmin ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 - - steps: - - name: Checkout source code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Build Docker image - env: - DB_URL: jdbc:mysql://mysql:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true - DB_USER: root - DB_PASSWORD: password - run: | - docker build -t issue-dive-app \ - --build-arg DB_URL="$DB_URL" \ - --build-arg DB_USER="$DB_USER" \ - --build-arg DB_PASSWORD="$DB_PASSWORD" \ - . - - - name: Run tests inside Docker container - env: - SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true - SPRING_DATASOURCE_USERNAME: root - SPRING_DATASOURCE_PASSWORD: password - run: | -name: IssueDive Docker CI Hard - on: push: branches: [ "dev" ] From dad6ab6ea59b3e455b87e8d8d908566a5e306f72 Mon Sep 17 00:00:00 2001 From: meraki6512 Date: Fri, 29 Aug 2025 17:56:55 +0900 Subject: [PATCH 7/8] =?UTF-8?q?[#32,=20#25]=20chore:=20ci-docker.yml=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 우선 인메모리 H2 디비로 다시 변경 --- .github/workflows/ci-docker.yml | 46 ++++----------------------------- Dockerfile | 35 +++++++++---------------- 2 files changed, 17 insertions(+), 64 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 2ff795e..36d8db2 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -1,4 +1,4 @@ -name: IssueDive Docker CI Hard +name: IssueDive Docker CI New on: push: @@ -10,19 +10,6 @@ jobs: build-and-test: name: Build and Test runs-on: ubuntu-latest - - services: - mysql: - image: mysql:8 - env: - MYSQL_ROOT_PASSWORD: password - MYSQL_DATABASE: issue_dive - options: >- - --health-cmd "mysqladmin ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 - steps: - name: Checkout source code uses: actions/checkout@v4 @@ -30,31 +17,8 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - - name: Build Docker image - env: - DB_URL: jdbc:mysql://mysql:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true - DB_USER: root - DB_PASSWORD: password - run: | - docker build -t issue-dive-app \ - --build-arg DB_URL="$DB_URL" \ - --build-arg DB_USER="$DB_USER" \ - --build-arg DB_PASSWORD="$DB_PASSWORD" \ - . - - - name: Run tests inside Docker container - env: - SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/issue_dive?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true - SPRING_DATASOURCE_USERNAME: root - SPRING_DATASOURCE_PASSWORD: password + - name: Build and Test with Docker + # Docker 빌드 과정에서 Gradle 테스트가 실행됩니다. + # 테스트가 실패하면 빌드도 실패하므로 CI가 중단됩니다. run: | - echo "Workflow name is: $GITHUB_WORKFLOW_NAME" - NETWORK_NAME=$(docker network ls --filter label=com.docker.compose.project=$GITHUB_WORKFLOW_NAME --format "{{.Name}}" | head -n 1) - echo "Using docker network: $NETWORK_NAME" - - docker run --rm \ - --network $NETWORK_NAME \ - -e SPRING_DATASOURCE_URL=$SPRING_DATASOURCE_URL \ - -e SPRING_DATASOURCE_USERNAME=$SPRING_DATASOURCE_USERNAME \ - -e SPRING_DATASOURCE_PASSWORD=$SPRING_DATASOURCE_PASSWORD \ - issue-dive-app ./gradlew test \ No newline at end of file + docker build -t issue-dive-app . \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 68c4f6f..3b2ffe7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,31 +1,21 @@ -# 1. 빌드 스테이지 -FROM gradle:8.14.3-jdk17 AS builder +# 1. 빌드 및 테스트 스테이지 +FROM gradle:8.8.0-jdk17 AS builder WORKDIR /app -# build-arg를 받기 위한 ARG 선언을 추가합니다. -ARG DB_URL -ARG DB_USER -ARG DB_PASSWORD - -# gradle.properties 파일을 동적으로 생성합니다. -#RUN echo "dbUrl=${DB_URL}" >> gradle.properties -#RUN echo "dbUser=${DB_USER}" >> gradle.properties -#RUN echo "dbPassword=${DB_PASSWORD}" >> gradle.properties -RUN echo "dbUrl=${DB_URL}" > gradle.properties && \ - echo "dbUser=${DB_USER}" >> gradle.properties && \ - echo "dbPassword=${DB_PASSWORD}" >> gradle.properties - -# Gradle 캐시 최적화를 위해 build.gradle과 settings.gradle 먼저 복사 +# Gradle 캐시 최적화를 위해 의존성 관련 파일 먼저 복사 COPY build.gradle settings.gradle gradlew ./ COPY gradle ./gradle -# 의존성 다운로드 +# 의존성 다운로드 (네트워크를 사용하는 단계이므로 먼저 실행) RUN ./gradlew --no-daemon dependencies -# 나머지 소스 복사 및 빌드 +# 전체 소스 복사 COPY src ./src -RUN ./gradlew assemble --no-daemon -Dspring.profiles.active=test + +# assemble 대신 build 명령어를 사용해 테스트까지 함께 실행합니다. +# Spring Boot의 테스트 프로필을 활성화하여 H2 DB를 사용하도록 합니다. +RUN ./gradlew build --no-daemon -Dspring.profiles.active=test # 2. 실행 스테이지 @@ -33,9 +23,8 @@ FROM openjdk:17-jdk-slim WORKDIR /app -# 빌드 산출물을 복사 +# 빌드 산출물(테스트가 통과된)을 복사 COPY --from=builder /app/build/libs/*.jar app.jar -# 컨테이너 실행 시 -ENTRYPOINT ["java", "-jar", "app.jar"] - +# 컨테이너 실행 +ENTRYPOINT ["java", "-jar", "app.jar"] \ No newline at end of file From b45080a7ccfe99a4abcc21b884e71e93cc9e15c7 Mon Sep 17 00:00:00 2001 From: meraki6512 Date: Fri, 29 Aug 2025 18:06:24 +0900 Subject: [PATCH 8/8] =?UTF-8?q?[#32,=20#25]=20chore:=20build.gradle=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - flyway 설정 수정 --- build.gradle | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index ebd8998..14f5af4 100644 --- a/build.gradle +++ b/build.gradle @@ -84,8 +84,13 @@ tasks.named('test') { // Flyway 설정 flyway { - url = dbUrl - user = dbUser - password = dbPassword + // CI 환경 등에서 dbUrl 프로퍼티가 없을 수 있으므로, + // 해당 프로퍼티가 존재할 때만 url, user, password를 설정합니다. + if (project.hasProperty('dbUrl')) { + url = dbUrl + user = dbUser + password = dbPassword + } + // cleanDisabled는 DB 연결 정보와 무관하므로 바깥에 두어도 안전합니다. cleanDisabled = false } \ No newline at end of file