From 2c04982870e1f631c3e44a217a7e830746625882 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Wed, 23 Jul 2025 23:10:07 +0900 Subject: [PATCH 01/28] =?UTF-8?q?infra:=20Dockerfile=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..256825c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +# Dockerfile +FROM openjdk:21-jdk-slim +ARG JAR_FILE=build/libs/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java", "-jar", "/app.jar"] From b998a1bff7d89bb68ed3276002eff021d6f233c1 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 00:27:59 +0900 Subject: [PATCH 02/28] =?UTF-8?q?infra:=20push-cd-dev=20workflows=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 65 +++++++++++++++++++++++ src/main/resources/application-sample.yml | 8 +-- 2 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/push-cd-dev.yml diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml new file mode 100644 index 0000000..bfd1d26 --- /dev/null +++ b/.github/workflows/push-cd-dev.yml @@ -0,0 +1,65 @@ +name: Build and Deploy Spring Server + +on: + push: + branches: [ dev ] + +permissions: + contents: read + +jobs: + build-and-deploy: + name: Build Docker and Deploy to Oracle Cloud + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: Log in to Docker Hub + run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin + + - name: Build Docker image + run: | + docker build -t ${{ secrets.DOCKER_REPO }}:latest . + + - name: Push Docker image + run: | + docker push ${{ secrets.DOCKER_REPO }}:latest + + - name: Create .env file + run: | + echo "${{ secrets.ENV_FILE }}" > .env + + - name: Install SSH client + run: sudo apt-get install -y openssh-client + + - name: Setup SSH key + run: | + mkdir -p ~/.ssh + echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa + chmod 400 ~/.ssh/id_rsa + ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts + + - name: Copy .env to server + run: | + scp .env ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/home/${{ secrets.SERVER_USER }}/.env + + - name: SSH into server and deploy + run: | + ssh ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' + docker stop devnogi-open-api-batch-server || true + docker rm devnogi-open-api-batch-server || true + docker pull ${{ secrets.DOCKER_REPO }}:latest + docker run -d \ + --name devnogi-open-api-batch-server \ + --env-file /home/${{ secrets.SERVER_USER }}/.env \ + -p 8080:8080 \ + ${{ secrets.DOCKER_REPO }}:latest + EOF diff --git a/src/main/resources/application-sample.yml b/src/main/resources/application-sample.yml index b7b97da..c2872d8 100644 --- a/src/main/resources/application-sample.yml +++ b/src/main/resources/application-sample.yml @@ -47,9 +47,9 @@ spring: ignore-accept-header: true jwt: - secret-key: ${JWT_SECRET_KEY:e4f1a5c8d2b7e9f0a6c3d1b8e5f2c7a9d4e6f3b1a2c8d5e9f0b3a7c2d1e8f5a4} - access-token-validity: ${JWT_ACCESS_TOKEN_VALIDITY:3600} # seconds (1 hour) - refresh-token-validity: ${JWT_REFRESH_TOKEN_VALIDITY:86400} # seconds (1 day) + secret-key: ${JWT_SECRET_KEY} + access-token-validity: ${JWT_ACCESS_TOKEN_VALIDITY} # seconds (1 hour) + refresh-token-validity: ${JWT_REFRESH_TOKEN_VALIDITY} # seconds (1 day) springdoc: swagger-ui: @@ -94,7 +94,7 @@ openapi: default-timeout-seconds: 5 auction-history: delay-ms: 1000 - cron: "0 0 */1 * * *" # 1시간마다 실행 + cron: "0 0 */4 * * *" # 1시간마다 실행 min-price: cron: "0 0 */4 * * *" From b48f4df4c52bd180c15dd4362b2659652d28a7d6 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 00:30:33 +0900 Subject: [PATCH 03/28] =?UTF-8?q?chore:=20dockerignore=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..6028e99 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,50 @@ +# ----------------------------- +# default +# ----------------------------- +.git +.gitignore +*.log +*.md +.DS_Store +*.iml + +# ----------------------------- +# IDE 관련 +# ----------------------------- +.idea/ +.vscode/ +*.swp + +# ----------------------------- +# OS/툴 관련 캐시 +# ----------------------------- +Thumbs.db +ehthumbs.db +desktop.ini + +# ----------------------------- +# Gradle 빌드 결과물 및 캐시 +# ----------------------------- +build/ +.gradle/ +!gradle/wrapper/gradle-wrapper.jar +.gradle/ + +# ----------------------------- +# 환경/인증 관련 (보안 목적) +# ----------------------------- +.env +*.pem +*.crt +*.key + +# ----------------------------- +# 테스트/커버리지 +# ----------------------------- +test-results/ +test-output/ +jacoco*.exec +coverage/ +*.html +*.xml +*.json From e920f7e83fdc19c3b769831ee83e2a369fc68923 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 00:34:43 +0900 Subject: [PATCH 04/28] =?UTF-8?q?chore:=20push-cd-dev=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=9A=A9=20=EC=9E=84=EC=8B=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index bfd1d26..8621f25 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -1,8 +1,9 @@ name: Build and Deploy Spring Server on: - push: + pull_request: branches: [ dev ] + types: [ opened, synchronize, reopened ] permissions: contents: read From 2ea1bae5e2b83b5db2cf45e2038efdafa98ce0a8 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 00:47:45 +0900 Subject: [PATCH 05/28] =?UTF-8?q?infra:=20push-cd-dev=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=EC=9D=98=20build=20step=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index 8621f25..08724da 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -1,4 +1,4 @@ -name: Build and Deploy Spring Server +name: Spring CD for Dev Push on: pull_request: @@ -23,6 +23,12 @@ jobs: java-version: '21' distribution: 'temurin' + - name: Grant execute permission for gradlew + run: chmod +x ./gradlew + + - name: Build JAR + run: ./gradlew clean bootJar + - name: Log in to Docker Hub run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin From e8d85f71b843357e7bf3f4fb121848837b6223d4 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 01:00:37 +0900 Subject: [PATCH 06/28] =?UTF-8?q?chore:=20dockerfile=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 3 +++ Dockerfile => open-api-batch-server/Dockerfile | 0 2 files changed, 3 insertions(+) rename Dockerfile => open-api-batch-server/Dockerfile (100%) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index 08724da..ebaa520 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -25,9 +25,11 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x ./gradlew + working-directory: ./open-api-batch-server - name: Build JAR run: ./gradlew clean bootJar + working-directory: ./open-api-batch-server - name: Log in to Docker Hub run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin @@ -35,6 +37,7 @@ jobs: - name: Build Docker image run: | docker build -t ${{ secrets.DOCKER_REPO }}:latest . + working-directory: ./open-api-batch-server - name: Push Docker image run: | diff --git a/Dockerfile b/open-api-batch-server/Dockerfile similarity index 100% rename from Dockerfile rename to open-api-batch-server/Dockerfile From a5cda2c58eafe0fb48979d96e2aae873925327dd Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 01:04:22 +0900 Subject: [PATCH 07/28] =?UTF-8?q?fix:=20push-cd-dev=20=EC=9E=98=EB=AA=BB?= =?UTF-8?q?=EB=90=9C=20=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 --- .github/workflows/push-cd-dev.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index ebaa520..ca31551 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -25,7 +25,6 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x ./gradlew - working-directory: ./open-api-batch-server - name: Build JAR run: ./gradlew clean bootJar From 382476862c07ccdc64343f20805cea378c99a7cc Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 01:06:43 +0900 Subject: [PATCH 08/28] =?UTF-8?q?fix:=20push-cd-dev=20=EC=9E=98=EB=AA=BB?= =?UTF-8?q?=EB=90=9C=20gradlew=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index ca31551..de33a4e 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -28,7 +28,6 @@ jobs: - name: Build JAR run: ./gradlew clean bootJar - working-directory: ./open-api-batch-server - name: Log in to Docker Hub run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin From 7ad89ae435dbdacd5fe3fc30b85bd3f980a94e73 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 01:14:25 +0900 Subject: [PATCH 09/28] =?UTF-8?q?chore:=20jar=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=ED=8C=8C=EC=95=85=EC=9A=A9=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index de33a4e..eebd501 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -27,7 +27,16 @@ jobs: run: chmod +x ./gradlew - name: Build JAR - run: ./gradlew clean bootJar + run: | + ./gradlew clean bootJar + echo "✅ JAR 파일 생성 위치 확인:" + find ./ -type f -name "*.jar" + + - name: Show Dockerfile COPY 대상 로그 + run: | + echo "📦 Dockerfile에서 복사할 JAR 경로 예상: build/libs/" + ls -al ./open-api-batch-server/build/libs + working-directory: ./open-api-batch-server - name: Log in to Docker Hub run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin From 0bc81d2c3e36379562f768dbf5d039793f7e28d3 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 01:19:45 +0900 Subject: [PATCH 10/28] =?UTF-8?q?chore:=20dockerfile=20jar=20=EA=B2=BD?= =?UTF-8?q?=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 --- open-api-batch-server/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/open-api-batch-server/Dockerfile b/open-api-batch-server/Dockerfile index 256825c..a20bb9a 100644 --- a/open-api-batch-server/Dockerfile +++ b/open-api-batch-server/Dockerfile @@ -1,5 +1,5 @@ # Dockerfile FROM openjdk:21-jdk-slim -ARG JAR_FILE=build/libs/*.jar +ARG JAR_FILE=build/libs/DevnogiServer.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java", "-jar", "/app.jar"] From 7c9ad1c66c2c975712c3fd34b1a6fc09526e3671 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 01:24:33 +0900 Subject: [PATCH 11/28] =?UTF-8?q?fix:=20dockerfile=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 12 +----------- open-api-batch-server/Dockerfile => Dockerfile | 0 2 files changed, 1 insertion(+), 11 deletions(-) rename open-api-batch-server/Dockerfile => Dockerfile (100%) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index eebd501..08724da 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -27,16 +27,7 @@ jobs: run: chmod +x ./gradlew - name: Build JAR - run: | - ./gradlew clean bootJar - echo "✅ JAR 파일 생성 위치 확인:" - find ./ -type f -name "*.jar" - - - name: Show Dockerfile COPY 대상 로그 - run: | - echo "📦 Dockerfile에서 복사할 JAR 경로 예상: build/libs/" - ls -al ./open-api-batch-server/build/libs - working-directory: ./open-api-batch-server + run: ./gradlew clean bootJar - name: Log in to Docker Hub run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin @@ -44,7 +35,6 @@ jobs: - name: Build Docker image run: | docker build -t ${{ secrets.DOCKER_REPO }}:latest . - working-directory: ./open-api-batch-server - name: Push Docker image run: | diff --git a/open-api-batch-server/Dockerfile b/Dockerfile similarity index 100% rename from open-api-batch-server/Dockerfile rename to Dockerfile From fb1169fed29bdad16b00ad80ebaf57f950efe927 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 01:38:29 +0900 Subject: [PATCH 12/28] =?UTF-8?q?fix:=20dockerignore=20build/=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 1 + .github/workflows/push-cd-dev.yml | 8 ++++---- Dockerfile | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.dockerignore b/.dockerignore index 6028e99..eddf54e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -26,6 +26,7 @@ desktop.ini # Gradle 빌드 결과물 및 캐시 # ----------------------------- build/ +!build/libs/*.jar .gradle/ !gradle/wrapper/gradle-wrapper.jar .gradle/ diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index 08724da..c4f911e 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -29,12 +29,12 @@ jobs: - name: Build JAR run: ./gradlew clean bootJar - - name: Log in to Docker Hub - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - name: Build Docker image run: | - docker build -t ${{ secrets.DOCKER_REPO }}:latest . + docker build -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest . + + - name: Log in to Docker Hub + run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - name: Push Docker image run: | diff --git a/Dockerfile b/Dockerfile index a20bb9a..256825c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Dockerfile FROM openjdk:21-jdk-slim -ARG JAR_FILE=build/libs/DevnogiServer.jar +ARG JAR_FILE=build/libs/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java", "-jar", "/app.jar"] From 4cce7f989f38265ae9919d4fe0bad8280ace31ec Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 01:44:01 +0900 Subject: [PATCH 13/28] =?UTF-8?q?fix:=20push-cd-dev=20docker=20build=20pus?= =?UTF-8?q?h=20=EA=B2=BD=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index c4f911e..6c4c49b 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -38,7 +38,7 @@ jobs: - name: Push Docker image run: | - docker push ${{ secrets.DOCKER_REPO }}:latest + docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest - name: Create .env file run: | From 2d927f0c7ce7e6885e23179a7c5a3434c5050420 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 01:50:04 +0900 Subject: [PATCH 14/28] =?UTF-8?q?feat:=20push-cd-dev=20pem=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index 6c4c49b..bd8fcdc 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -44,29 +44,26 @@ jobs: run: | echo "${{ secrets.ENV_FILE }}" > .env - - name: Install SSH client - run: sudo apt-get install -y openssh-client - - name: Setup SSH key run: | mkdir -p ~/.ssh - echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa - chmod 400 ~/.ssh/id_rsa + echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/my-key.pem + chmod 400 ~/.ssh/my-key.pem ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts - - name: Copy .env to server + - name: Upload .env file to server run: | - scp .env ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/home/${{ secrets.SERVER_USER }}/.env + scp -i ~/.ssh/my-key.pem .env ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/home/${{ secrets.SERVER_USER }}/.env - - name: SSH into server and deploy + - name: Deploy on remote server run: | - ssh ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' + ssh -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' docker stop devnogi-open-api-batch-server || true docker rm devnogi-open-api-batch-server || true - docker pull ${{ secrets.DOCKER_REPO }}:latest + docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest docker run -d \ --name devnogi-open-api-batch-server \ --env-file /home/${{ secrets.SERVER_USER }}/.env \ -p 8080:8080 \ - ${{ secrets.DOCKER_REPO }}:latest - EOF + ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest + EOF \ No newline at end of file From 56d5d1049063411e100cffe858695d45ec3f5116 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Fri, 25 Jul 2025 01:58:09 +0900 Subject: [PATCH 15/28] =?UTF-8?q?refactor:=20push-cd-dev=20self-hosted?= =?UTF-8?q?=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98=EA=B2=8C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index bd8fcdc..027763d 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -51,19 +51,18 @@ jobs: chmod 400 ~/.ssh/my-key.pem ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts - - name: Upload .env file to server + - name: Create .env file from secret run: | - scp -i ~/.ssh/my-key.pem .env ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/home/${{ secrets.SERVER_USER }}/.env + mkdir -p ~/deploy + echo "${{ secrets.ENV_FILE }}" > ~/deploy/.env - - name: Deploy on remote server + - name: Restart Docker container run: | - ssh -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' - docker stop devnogi-open-api-batch-server || true - docker rm devnogi-open-api-batch-server || true - docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest - docker run -d \ - --name devnogi-open-api-batch-server \ - --env-file /home/${{ secrets.SERVER_USER }}/.env \ - -p 8080:8080 \ - ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest - EOF \ No newline at end of file + docker stop devnogi-open-api-batch-server || true + docker rm devnogi-open-api-batch-server || true + docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest + docker run -d \ + --name devnogi-open-api-batch-server \ + --env-file ~/deploy/.env \ + -p 8080:8080 \ + ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest \ No newline at end of file From 76669a5ea5a10f3ee44d50b90da8a1dfee65602c Mon Sep 17 00:00:00 2001 From: Lee Sanghyun <59863112+dev-ant@users.noreply.github.com> Date: Wed, 30 Jul 2025 11:54:22 +0900 Subject: [PATCH 16/28] =?UTF-8?q?feat:=20push-cd-dev=20deploy=20ssh=20key?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 32 +++++++++++-------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index 027763d..d33c50d 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -10,7 +10,7 @@ permissions: jobs: build-and-deploy: - name: Build Docker and Deploy to Oracle Cloud + name: Build Docker and Deploy to Remote Server runs-on: ubuntu-latest steps: @@ -37,12 +37,7 @@ jobs: run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - name: Push Docker image - run: | - docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest - - - name: Create .env file - run: | - echo "${{ secrets.ENV_FILE }}" > .env + run: docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest - name: Setup SSH key run: | @@ -51,18 +46,13 @@ jobs: chmod 400 ~/.ssh/my-key.pem ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts - - name: Create .env file from secret - run: | - mkdir -p ~/deploy - echo "${{ secrets.ENV_FILE }}" > ~/deploy/.env - - - name: Restart Docker container + - name: Deploy and Restart via Docker Compose run: | - docker stop devnogi-open-api-batch-server || true - docker rm devnogi-open-api-batch-server || true - docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest - docker run -d \ - --name devnogi-open-api-batch-server \ - --env-file ~/deploy/.env \ - -p 8080:8080 \ - ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest \ No newline at end of file + ssh -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' + set -e + echo "${{ secrets.ENV_FILE }}" > ~/app/.env + cd ~/app + docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest + docker-compose -f docker-compose-dev.yml down + docker-compose -f docker-compose-dev.yml up -d + EOF From b786a9acdafa253eff7d60ca29087e047dee80ed Mon Sep 17 00:00:00 2001 From: Lee Sanghyun <59863112+dev-ant@users.noreply.github.com> Date: Wed, 30 Jul 2025 12:02:03 +0900 Subject: [PATCH 17/28] =?UTF-8?q?infra:=20docke-compose-dev.yaml=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docke-compose-dev.yaml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 docke-compose-dev.yaml diff --git a/docke-compose-dev.yaml b/docke-compose-dev.yaml new file mode 100644 index 0000000..fb2d533 --- /dev/null +++ b/docke-compose-dev.yaml @@ -0,0 +1,31 @@ +version: "3.8" + +services: + spring-app: + image: yourdockerid/my-spring-app:latest + container_name: spring-app + ports: + - "${SERVER_PORT}:${SERVER_PORT}" + env_file: + - .env + volumes: + - ./logs:/app/logs + - ./config:/app/config:ro + restart: always + networks: + - app-network + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:${SERVER_PORT}/actuator/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + +networks: + app-network: + driver: bridge From b83f70e129fceebaa3208879eecf47dc35aed2af Mon Sep 17 00:00:00 2001 From: Lee Sanghyun <59863112+dev-ant@users.noreply.github.com> Date: Wed, 30 Jul 2025 12:27:05 +0900 Subject: [PATCH 18/28] =?UTF-8?q?feat:=20push-cd-dev=EC=97=90=20docker-com?= =?UTF-8?q?pose=20=EA=B4=80=EB=A0=A8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 38 ++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index d33c50d..369981a 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -38,21 +38,33 @@ jobs: - name: Push Docker image run: docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest - - - name: Setup SSH key + + - name: Send docker-compose-dev.yml to server run: | - mkdir -p ~/.ssh - echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/my-key.pem - chmod 400 ~/.ssh/my-key.pem - ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts + scp -i ~/.ssh/my-key.pem docker-compose-dev.yml ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/home/${{ secrets.SERVER_USER }}/app/docker-compose-dev.yml - - name: Deploy and Restart via Docker Compose + - name: Deploy and Restart Container run: | - ssh -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' - set -e - echo "${{ secrets.ENV_FILE }}" > ~/app/.env - cd ~/app + ssh -tt -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' + mkdir -p /home/${{ secrets.SERVER_USER }}/app + + echo "${{ secrets.ENV_FILE }}" > /home/${{ secrets.SERVER_USER }}/app/.env + + cd /home/${{ secrets.SERVER_USER }}/app docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest - docker-compose -f docker-compose-dev.yml down - docker-compose -f docker-compose-dev.yml up -d + docker compose -f docker-compose-dev.yml down + docker compose -f docker-compose-dev.yml up -d + EOF + + - name: Check Docker container health + run: | + ssh -tt -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' + CONTAINER_ID=$(docker ps -q --filter "ancestor=${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest") + if [ -z "$CONTAINER_ID" ]; then + echo "ERROR: container does not run" + exit 1 + fi + + echo "SUCCESS: container run success" + docker ps --filter "id=$CONTAINER_ID" EOF From 7143ae29c8924342c55b93542dadc4d97c332ee9 Mon Sep 17 00:00:00 2001 From: Lee Sanghyun <59863112+dev-ant@users.noreply.github.com> Date: Wed, 30 Jul 2025 12:30:54 +0900 Subject: [PATCH 19/28] =?UTF-8?q?fix:=20push-cd-dev=20=EC=98=A4=ED=83=88?= =?UTF-8?q?=EC=9E=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index 369981a..4a283aa 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -39,9 +39,9 @@ jobs: - name: Push Docker image run: docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest - - name: Send docker-compose-dev.yml to server + - name: Send docker-compose-dev.yaml to server run: | - scp -i ~/.ssh/my-key.pem docker-compose-dev.yml ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/home/${{ secrets.SERVER_USER }}/app/docker-compose-dev.yml + scp -i ~/.ssh/my-key.pem docker-compose-dev.yaml ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/home/${{ secrets.SERVER_USER }}/app/docker-compose-dev.yaml - name: Deploy and Restart Container run: | @@ -52,8 +52,8 @@ jobs: cd /home/${{ secrets.SERVER_USER }}/app docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest - docker compose -f docker-compose-dev.yml down - docker compose -f docker-compose-dev.yml up -d + docker compose -f docker-compose-dev.yaml down + docker compose -f docker-compose-dev.yaml up -d EOF - name: Check Docker container health From 53a5bb32f195d74f2372b5acd31b0032eed3053c Mon Sep 17 00:00:00 2001 From: Lee Sanghyun <59863112+dev-ant@users.noreply.github.com> Date: Wed, 30 Jul 2025 12:36:14 +0900 Subject: [PATCH 20/28] =?UTF-8?q?fix:=20docke-compose-dev.yaml=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EB=AA=85=20=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docke-compose-dev.yaml => docker-compose-dev.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docke-compose-dev.yaml => docker-compose-dev.yaml (100%) diff --git a/docke-compose-dev.yaml b/docker-compose-dev.yaml similarity index 100% rename from docke-compose-dev.yaml rename to docker-compose-dev.yaml From 73be8de63342cc02f20bd092f2ba308c530d15f6 Mon Sep 17 00:00:00 2001 From: Lee Sanghyun <59863112+dev-ant@users.noreply.github.com> Date: Wed, 30 Jul 2025 12:42:53 +0900 Subject: [PATCH 21/28] =?UTF-8?q?fix:=20push-cd-dev=20ssh=20key=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index 4a283aa..1668d5c 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -38,7 +38,14 @@ jobs: - name: Push Docker image run: docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest - + + - name: Setup SSH key + run: | + mkdir -p ~/.ssh + echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/my-key.pem + chmod 400 ~/.ssh/my-key.pem + ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts + - name: Send docker-compose-dev.yaml to server run: | scp -i ~/.ssh/my-key.pem docker-compose-dev.yaml ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/home/${{ secrets.SERVER_USER }}/app/docker-compose-dev.yaml From 443b6b73dc26fe55b1f3bfe061db248a3932efc3 Mon Sep 17 00:00:00 2001 From: Lee Sanghyun <59863112+dev-ant@users.noreply.github.com> Date: Wed, 30 Jul 2025 12:52:06 +0900 Subject: [PATCH 22/28] =?UTF-8?q?fix:=20push-cd-dev=20mkdir=20docker=20com?= =?UTF-8?q?pose=20path=20=EB=AA=85=EB=A0=B9=EC=96=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index 1668d5c..59e4ad3 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -45,7 +45,11 @@ jobs: echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/my-key.pem chmod 400 ~/.ssh/my-key.pem ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts - + + - name: Create app directory on server + run: | + ssh -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} "mkdir -p /home/${{ secrets.SERVER_USER }}/app" + - name: Send docker-compose-dev.yaml to server run: | scp -i ~/.ssh/my-key.pem docker-compose-dev.yaml ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/home/${{ secrets.SERVER_USER }}/app/docker-compose-dev.yaml From 67404acfa6557aaef3b5b9ebc01616850b5fc592 Mon Sep 17 00:00:00 2001 From: Lee Sanghyun <59863112+dev-ant@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:03:51 +0900 Subject: [PATCH 23/28] =?UTF-8?q?fix:=20docker-compose-dev.yaml=20?= =?UTF-8?q?=EC=98=A4=ED=83=88=EC=9E=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose-dev.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-dev.yaml b/docker-compose-dev.yaml index fb2d533..e8c0b8e 100644 --- a/docker-compose-dev.yaml +++ b/docker-compose-dev.yaml @@ -2,7 +2,7 @@ version: "3.8" services: spring-app: - image: yourdockerid/my-spring-app:latest + image: ${DOCKER_USERNAME}/${DOCKER_REPO}:latest container_name: spring-app ports: - "${SERVER_PORT}:${SERVER_PORT}" From c6cd3b31440aab2d33bf1ea777b976319c970019 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Thu, 31 Jul 2025 21:17:29 +0900 Subject: [PATCH 24/28] =?UTF-8?q?refactor:=20auction=20history=20web=20cli?= =?UTF-8?q?ent=20log=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 5 +- .../client/AuctionHistoryClient.java | 53 ++++++++++++------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index 59e4ad3..b342523 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -49,10 +49,7 @@ jobs: - name: Create app directory on server run: | ssh -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} "mkdir -p /home/${{ secrets.SERVER_USER }}/app" - - - name: Send docker-compose-dev.yaml to server - run: | - scp -i ~/.ssh/my-key.pem docker-compose-dev.yaml ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/home/${{ secrets.SERVER_USER }}/app/docker-compose-dev.yaml + - name: Deploy and Restart Container run: | diff --git a/src/main/java/until/the/eternity/auctionhistory/infrastructure/client/AuctionHistoryClient.java b/src/main/java/until/the/eternity/auctionhistory/infrastructure/client/AuctionHistoryClient.java index 80f78e0..3242a41 100644 --- a/src/main/java/until/the/eternity/auctionhistory/infrastructure/client/AuctionHistoryClient.java +++ b/src/main/java/until/the/eternity/auctionhistory/infrastructure/client/AuctionHistoryClient.java @@ -1,9 +1,12 @@ package until.the.eternity.auctionhistory.infrastructure.client; +import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; import reactor.core.publisher.Mono; import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryListResponse; import until.the.eternity.common.enums.ItemCategory; @@ -34,38 +37,48 @@ public OpenApiAuctionHistoryListResponse fetchAuctionHistory( ItemCategory category, String cursor) { try { - // TODO: 하드코딩 값 변경 - log.info( - "Calling 'https://open.api.nexon.com/mabinogi/v1/auction/history?auction_item_category={} with cursor='{}'", - category.getSubCategory(), - cursor == null ? "" : "&cursor=" + cursor); + // URI 구성 + UriComponents uriComponents = + UriComponentsBuilder.newInstance() + .path("/auction/history") + .queryParam("auction_item_category", category.getSubCategory()) + .queryParamIfPresent("cursor", Optional.ofNullable(cursor)) + .build(); + + log.info("Calling Nexon OPEN API URI: {}", uriComponents.toUriString()); return openApiWebClient .get() - .uri( - uriBuilder -> - uriBuilder - .path("/auction/history") - .queryParam( - "auction_item_category", - category.getSubCategory()) - .queryParamIfPresent( - "cursor", - Mono.justOrEmpty(cursor).blockOptional()) - .build()) + .uri(uriComponents.toUri()) .retrieve() + .onStatus( + status -> status.is4xxClientError() || status.is5xxServerError(), + clientResponse -> + clientResponse + .bodyToMono(String.class) + .flatMap( + errorBody -> { + log.error( + "Received error response: status={}, body={}", + clientResponse.statusCode(), + errorBody); + return Mono.error( + new RuntimeException( + "API response error: " + + errorBody)); + })) .bodyToMono(OpenApiAuctionHistoryListResponse.class) - // 필터에서 재시도·타임아웃·에러로깅이 이미 적용됨 .onErrorResume( throwable -> { - log.warn( - "Failed to fetch auction history [category={} cursor={}]: {}", + log.error( + "Exception while calling auction history API [category={}, cursor={}]", category, cursor, - throwable.toString()); + throwable); return Mono.empty(); // graceful fail }) .block(); + } catch (Exception ex) { log.error("Unexpected exception during auction history fetch", ex); return null; From d22fdd0efe446e379352976bf555d8456fde0133 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Thu, 31 Jul 2025 21:29:49 +0900 Subject: [PATCH 25/28] =?UTF-8?q?fix:=20push-cd-dev=20.env=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=AA=85=EB=A0=B9=EC=96=B4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index b342523..d32caca 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -56,8 +56,6 @@ jobs: ssh -tt -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' mkdir -p /home/${{ secrets.SERVER_USER }}/app - echo "${{ secrets.ENV_FILE }}" > /home/${{ secrets.SERVER_USER }}/app/.env - cd /home/${{ secrets.SERVER_USER }}/app docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest docker compose -f docker-compose-dev.yaml down From ae709c981b15d2a0d73551f85bc7c4574a63bdda Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Thu, 31 Jul 2025 22:05:48 +0900 Subject: [PATCH 26/28] =?UTF-8?q?feat:=20push=20cd=20dev=20ssh=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EC=9C=A0=EC=A7=80=20=EB=AA=85=EB=A0=B9=EC=96=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index d32caca..6f976e2 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -38,39 +38,43 @@ jobs: - name: Push Docker image run: docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest - - - name: Setup SSH key + + - name: Setup SSH key and config run: | mkdir -p ~/.ssh echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/my-key.pem chmod 400 ~/.ssh/my-key.pem ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts - + echo -e "Host *\n ServerAliveInterval 60\n ServerAliveCountMax 3" >> ~/.ssh/config + - name: Create app directory on server run: | ssh -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} "mkdir -p /home/${{ secrets.SERVER_USER }}/app" - - name: Deploy and Restart Container run: | - ssh -tt -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' + ssh -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' mkdir -p /home/${{ secrets.SERVER_USER }}/app - cd /home/${{ secrets.SERVER_USER }}/app + + echo "${{ secrets.ENV_FILE }}" > /home/${{ secrets.SERVER_USER }}/app/.env + docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest docker compose -f docker-compose-dev.yaml down docker compose -f docker-compose-dev.yaml up -d + + echo "✅ Docker Compose finished. Containers should be up." EOF - name: Check Docker container health run: | - ssh -tt -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' + ssh -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF' CONTAINER_ID=$(docker ps -q --filter "ancestor=${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest") if [ -z "$CONTAINER_ID" ]; then - echo "ERROR: container does not run" + echo "❌ ERROR: container does not run" exit 1 fi - echo "SUCCESS: container run success" + echo "✅ SUCCESS: container is running" docker ps --filter "id=$CONTAINER_ID" EOF From 9ab5c36e3f5c8ca7cda10316034aecaff2c8ced1 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Thu, 31 Jul 2025 22:29:59 +0900 Subject: [PATCH 27/28] =?UTF-8?q?fix:=20acution=20history=20client=20?= =?UTF-8?q?=EC=9B=90=EB=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/AuctionHistoryClient.java | 53 +++++++------------ 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/src/main/java/until/the/eternity/auctionhistory/infrastructure/client/AuctionHistoryClient.java b/src/main/java/until/the/eternity/auctionhistory/infrastructure/client/AuctionHistoryClient.java index 3242a41..80f78e0 100644 --- a/src/main/java/until/the/eternity/auctionhistory/infrastructure/client/AuctionHistoryClient.java +++ b/src/main/java/until/the/eternity/auctionhistory/infrastructure/client/AuctionHistoryClient.java @@ -1,12 +1,9 @@ package until.the.eternity.auctionhistory.infrastructure.client; -import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; import reactor.core.publisher.Mono; import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryListResponse; import until.the.eternity.common.enums.ItemCategory; @@ -37,48 +34,38 @@ public OpenApiAuctionHistoryListResponse fetchAuctionHistory( ItemCategory category, String cursor) { try { - // URI 구성 - UriComponents uriComponents = - UriComponentsBuilder.newInstance() - .path("/auction/history") - .queryParam("auction_item_category", category.getSubCategory()) - .queryParamIfPresent("cursor", Optional.ofNullable(cursor)) - .build(); - - log.info("Calling Nexon OPEN API URI: {}", uriComponents.toUriString()); + // TODO: 하드코딩 값 변경 + log.info( + "Calling 'https://open.api.nexon.com/mabinogi/v1/auction/history?auction_item_category={} with cursor='{}'", + category.getSubCategory(), + cursor == null ? "" : "&cursor=" + cursor); return openApiWebClient .get() - .uri(uriComponents.toUri()) + .uri( + uriBuilder -> + uriBuilder + .path("/auction/history") + .queryParam( + "auction_item_category", + category.getSubCategory()) + .queryParamIfPresent( + "cursor", + Mono.justOrEmpty(cursor).blockOptional()) + .build()) .retrieve() - .onStatus( - status -> status.is4xxClientError() || status.is5xxServerError(), - clientResponse -> - clientResponse - .bodyToMono(String.class) - .flatMap( - errorBody -> { - log.error( - "Received error response: status={}, body={}", - clientResponse.statusCode(), - errorBody); - return Mono.error( - new RuntimeException( - "API response error: " - + errorBody)); - })) .bodyToMono(OpenApiAuctionHistoryListResponse.class) + // 필터에서 재시도·타임아웃·에러로깅이 이미 적용됨 .onErrorResume( throwable -> { - log.error( - "Exception while calling auction history API [category={}, cursor={}]", + log.warn( + "Failed to fetch auction history [category={} cursor={}]: {}", category, cursor, - throwable); + throwable.toString()); return Mono.empty(); // graceful fail }) .block(); - } catch (Exception ex) { log.error("Unexpected exception during auction history fetch", ex); return null; From 030a971f6d7b3161e5ee680a3def534af7951b2f Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Thu, 31 Jul 2025 22:38:45 +0900 Subject: [PATCH 28/28] =?UTF-8?q?feat:=20push-cd-dev=20trigger=20push?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push-cd-dev.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/push-cd-dev.yml b/.github/workflows/push-cd-dev.yml index 6f976e2..d812f9e 100644 --- a/.github/workflows/push-cd-dev.yml +++ b/.github/workflows/push-cd-dev.yml @@ -1,9 +1,8 @@ name: Spring CD for Dev Push on: - pull_request: - branches: [ dev ] - types: [ opened, synchronize, reopened ] + push: + branches: [ dev, main ] permissions: contents: read