From 2678b6a1ed384b446cf528f753ebc72a3838aeae Mon Sep 17 00:00:00 2001 From: so1eeee Date: Sat, 31 May 2025 04:50:29 +0900 Subject: [PATCH 01/12] =?UTF-8?q?[chore/#39]=20CI/CD=20=ED=8C=8C=EC=9D=B4?= =?UTF-8?q?=ED=94=84=EB=9D=BC=EC=9D=B8=EC=97=90=20script=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20=EA=B2=BD=EB=A1=9C=20=EB=B0=98=EC=98=81=20=EB=B0=8F?= =?UTF-8?q?=20=EB=B0=B0=ED=8F=AC=20=ED=8C=8C=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 --- .github/workflows/cicd.yml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index e6494fe..b73754a 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -56,7 +56,7 @@ jobs: aws-region: ap-northeast-2 - name: Make dir - run: mkdir cicd + run: mkdir -p cicd/script - name: Copy jar run: cp ./build/libs/*.jar ./cicd @@ -64,8 +64,17 @@ jobs: - name: Copy appspec run: cp ./appspec.yml ./cicd - - name: Copy script - run: cp ./deploy.sh ./cicd + - name: Copy Docker files + run: | + cp ./Dockerfile ./cicd + cp ./docker-compose.blue.yml ./cicd + cp ./docker-compose.green.yml ./cicd + cp ./script/deploy.sh ./cicd/script/ + cp ./script/rollback.sh ./cicd/script/ + cp ./script/init-deploy.sh ./cicd/script/ + chmod +x ./cicd/script/deploy.sh + chmod +x ./cicd/script/rollback.sh + chmod +x ./cicd/script/init-deploy.sh - name: Make zip run: zip -r -qq -j ./deploy.zip ./cicd From 6311a42591bcaeea6828fea6799510a1e81e3674 Mon Sep 17 00:00:00 2001 From: so1eeee Date: Sat, 31 May 2025 04:50:37 +0900 Subject: [PATCH 02/12] =?UTF-8?q?[fix/#39]=20Blue-Green=20=EB=B0=B0?= =?UTF-8?q?=ED=8F=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A6=BD=ED=8A=B8=20=EA=B2=BD=EB=A1=9C=20=EB=B0=8F=20=ED=9B=85?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appspec.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/appspec.yml b/appspec.yml index 4615117..46fe835 100644 --- a/appspec.yml +++ b/appspec.yml @@ -1,4 +1,4 @@ -version : 0.0 +version: 0.0 os: linux files: - source: / @@ -13,7 +13,11 @@ permissions: group: ubuntu hooks: + BeforeInstall: + - location: script/init-deploy.sh + timeout: 300 + runas: root ApplicationStart: - - location: deploy.sh - timeout: 60 + - location: script/deploy.sh + timeout: 300 runas: root From c66108c68e385683925fc37b30cb7b37837b87d3 Mon Sep 17 00:00:00 2001 From: so1eeee Date: Sat, 31 May 2025 04:53:10 +0900 Subject: [PATCH 03/12] =?UTF-8?q?[feat/#39]=20Blue-Green=20=EB=B0=B0?= =?UTF-8?q?=ED=8F=AC=20=EC=9E=90=EB=8F=99=ED=99=94=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A6=BD=ED=8A=B8(Docker/Nginx)=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 18 ------------- script/deploy.sh | 60 +++++++++++++++++++++++++++++++++++++++++++ script/init-deploy.sh | 36 ++++++++++++++++++++++++++ script/rollback.sh | 47 +++++++++++++++++++++++++++++++++ 4 files changed, 143 insertions(+), 18 deletions(-) delete mode 100644 deploy.sh create mode 100644 script/deploy.sh create mode 100644 script/init-deploy.sh create mode 100644 script/rollback.sh diff --git a/deploy.sh b/deploy.sh deleted file mode 100644 index f704414..0000000 --- a/deploy.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -CURRENT_PID=$(pgrep -f .jar) -echo "$CURRENT_PID" -if [ -z "$CURRENT_PID" ]; then - echo "no process" -else - echo "kill $CURRENT_PID" - kill -9 "$CURRENT_PID" - sleep 3 -fi - -mkdir -p /home/ubuntu/gooroomi/gooroomi-prod-logs -chmod 755 /home/ubuntu/gooroomi/gooroomi-prod-logs - -JAR_PATH="/home/ubuntu/gooroomi/gooroomi-0.0.1-SNAPSHOT.jar" -echo "jar path : $JAR_PATH" -chmod +x $JAR_PATH -nohup java -Duser.timezone=Asia/Seoul -jar $JAR_PATH --spring.profiles.active=prod > /home/ubuntu/gooroomi/gooroomi-prod-logs/application.log 2>&1 & \ No newline at end of file diff --git a/script/deploy.sh b/script/deploy.sh new file mode 100644 index 0000000..3d1403e --- /dev/null +++ b/script/deploy.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +# Nginx conf 경로 +NGINX_CONF="/etc/nginx/conf.d/gooroomi.conf" + +# 현재 활성화된 환경 확인 (주석 처리 여부로 판단) +if grep -q '^\s*server 127.0.0.1:8081;' $NGINX_CONF; then + CURRENT_ENV="blue" +else + CURRENT_ENV="green" +fi + +echo "현재 활성화된 환경: $CURRENT_ENV" + +# 환경 전환 +echo "트래픽을 전환합니다..." +if [ "$CURRENT_ENV" == "blue" ]; then + TARGET_ENV="green" +else + TARGET_ENV="blue" +fi + +# 대상 환경 빌드 및 실행 +echo "$TARGET_ENV 환경을 빌드하고 실행합니다..." +docker-compose -f /home/ubuntu/gooroomi/docker-compose.$TARGET_ENV.yml build +docker-compose -f /home/ubuntu/gooroomi/docker-compose.$TARGET_ENV.yml up -d + +# 새 환경이 준비될 때까지 대기 +echo "새 환경이 준비될 때까지 10초 대기..." +sleep 10 + +# 대상 환경 상태 확인 +PORT=$(if [ "$TARGET_ENV" == "blue" ]; then echo "8081"; else echo "8082"; fi) +HEALTH_CHECK=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:$PORT/actuator/health") + +if [ "$HEALTH_CHECK" == "200" ]; then + echo "Health check 성공, Nginx 설정을 업데이트합니다..." + + # Nginx 설정에서 기존 활성화 서버를 주석 처리, 대상 서버를 활성화 + if [ "$TARGET_ENV" == "blue" ]; then + sudo sed -i 's/^\s*#\?server 127.0.0.1:8081;/ server 127.0.0.1:8081;/' $NGINX_CONF + sudo sed -i 's/^\s*server 127.0.0.1:8082;/ #server 127.0.0.1:8082;/' $NGINX_CONF + else + sudo sed -i 's/^\s*#\?server 127.0.0.1:8082;/ server 127.0.0.1:8082;/' $NGINX_CONF + sudo sed -i 's/^\s*server 127.0.0.1:8081;/ #server 127.0.0.1:8081;/' $NGINX_CONF + fi + + # Nginx 설정 리로드 + sudo nginx -s reload + + echo "Nginx 설정이 업데이트되었습니다. 트래픽이 $TARGET_ENV 환경으로 전환됩니다." + + # 이전 환경은 잠시 유지 (롤백을 위해) + echo "이전 환경($CURRENT_ENV)은 잠시 유지됩니다." +else + echo "Health check 실패! 배포를 중단합니다." + echo "$TARGET_ENV 환경을 중지합니다..." + docker-compose -f /home/ubuntu/gooroomi/docker-compose.$TARGET_ENV.yml down + exit 1 +fi \ No newline at end of file diff --git a/script/init-deploy.sh b/script/init-deploy.sh new file mode 100644 index 0000000..65b2e8a --- /dev/null +++ b/script/init-deploy.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# 작업 디렉토리를 확인하고 필요한 디렉토리 생성 +mkdir -p /home/ubuntu/gooroomi/gooroomi-prod-logs +chmod 755 /home/ubuntu/gooroomi/gooroomi-prod-logs + +# Docker 네트워크 생성 +docker network create gooroomi-network || true + +# Blue 환경 시작 +echo "Blue 환경을 시작합니다..." +docker-compose -f /home/ubuntu/gooroomi/docker-compose.blue.yml build +docker-compose -f /home/ubuntu/gooroomi/docker-compose.blue.yml up -d + +# Blue 환경이 준비될 때까지 대기 +echo "Blue 환경이 준비될 때까지 10초 대기..." +sleep 10 + +# Blue 환경 상태 확인 +HEALTH_CHECK=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8081/actuator/health) + +if [ "$HEALTH_CHECK" == "200" ]; then + echo "Blue 환경 Health check 성공" + + # Green 환경도 시작 + echo "Green 환경을 시작합니다..." + docker-compose -f /home/ubuntu/gooroomi/docker-compose.green.yml build + docker-compose -f /home/ubuntu/gooroomi/docker-compose.green.yml up -d + + echo "Blue-Green 배포 환경이 준비되었습니다." + echo "현재 Blue 환경이 활성화되어 있습니다." +else + echo "Blue 환경 Health check 실패! 초기 설정을 중단합니다." + docker-compose -f /home/ubuntu/gooroomi/docker-compose.blue.yml down + exit 1 +fi \ No newline at end of file diff --git a/script/rollback.sh b/script/rollback.sh new file mode 100644 index 0000000..4b3e4f2 --- /dev/null +++ b/script/rollback.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# Nginx conf 경로 +NGINX_CONF="/etc/nginx/conf.d/gooroomi.conf" + +# 현재 활성화된 환경 확인 (주석 처리 여부로 판단) +if grep -q '^\s*server 127.0.0.1:8081;' $NGINX_CONF; then + CURRENT_ENV="blue" +else + CURRENT_ENV="green" +fi + +echo "현재 활성화된 환경: $CURRENT_ENV" + +# 롤백할 환경 결정 +echo "트래픽을 롤백합니다..." +if [ "$CURRENT_ENV" == "blue" ]; then + TARGET_ENV="green" +else + TARGET_ENV="blue" +fi + +# 롤백 대상 환경 상태 확인 +PORT=$(if [ "$TARGET_ENV" == "blue" ]; then echo "8081"; else echo "8082"; fi) +HEALTH_CHECK=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:$PORT/actuator/health") + +if [ "$HEALTH_CHECK" == "200" ]; then + echo "롤백 대상 환경 Health check 성공, Nginx 설정을 업데이트합니다..." + + # Nginx 설정에서 기존 활성화 서버를 주석 처리, 대상 서버를 활성화 + if [ "$TARGET_ENV" == "blue" ]; then + sudo sed -i 's/^\s*#\?server 127.0.0.1:8081;/ server 127.0.0.1:8081;/' $NGINX_CONF + sudo sed -i 's/^\s*server 127.0.0.1:8082;/ #server 127.0.0.1:8082;/' $NGINX_CONF + else + sudo sed -i 's/^\s*#\?server 127.0.0.1:8082;/ server 127.0.0.1:8082;/' $NGINX_CONF + sudo sed -i 's/^\s*server 127.0.0.1:8081;/ #server 127.0.0.1:8081;/' $NGINX_CONF + fi + + # Nginx 설정 리로드 + sudo nginx -s reload + + echo "Nginx 설정이 업데이트되었습니다. 트래픽이 $TARGET_ENV 환경으로 롤백됩니다." +else + echo "롤백 대상 환경 Health check 실패! 롤백을 중단합니다." + echo "문제를 해결한 후 다시 시도하세요." + exit 1 +fi \ No newline at end of file From 640ea0e4603fd4595566293a8d1601acbd4a74ea Mon Sep 17 00:00:00 2001 From: so1eeee Date: Sat, 31 May 2025 04:53:55 +0900 Subject: [PATCH 04/12] =?UTF-8?q?[feat/#39]=20Blue-Green=20=EB=B0=B0?= =?UTF-8?q?=ED=8F=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20Dockerfile=20?= =?UTF-8?q?=EB=B0=8F=20docker-compose=20=ED=99=98=EA=B2=BD=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 5 +++++ docker-compose.blue.yml | 21 +++++++++++++++++++++ docker-compose.green.yml | 21 +++++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 Dockerfile create mode 100644 docker-compose.blue.yml create mode 100644 docker-compose.green.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..60edb4a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:17-jdk + +COPY ./build/libs/gooroomi-0.0.1-SNAPSHOT.jar gooroomi-backend.jar + +ENTRYPOINT ["java", "-jar", "-Duser.timezone=Asia/Seoul", "/gooroomi-backend.jar"] \ No newline at end of file diff --git a/docker-compose.blue.yml b/docker-compose.blue.yml new file mode 100644 index 0000000..0759373 --- /dev/null +++ b/docker-compose.blue.yml @@ -0,0 +1,21 @@ +version: '3' + +services: + gooroomi-blue: + build: + context: . + dockerfile: Dockerfile + container_name: gooroomi-blue + ports: + - "8081:8080" + environment: + - SPRING_PROFILES_ACTIVE=prod + networks: + - gooroomi-network + restart: always + volumes: + - /home/ubuntu/gooroomi/gooroomi-prod-logs:/app/logs + +networks: + gooroomi-network: + driver: bridge \ No newline at end of file diff --git a/docker-compose.green.yml b/docker-compose.green.yml new file mode 100644 index 0000000..00cbcd5 --- /dev/null +++ b/docker-compose.green.yml @@ -0,0 +1,21 @@ +version: '3' + +services: + gooroomi-green: + build: + context: . + dockerfile: Dockerfile + container_name: gooroomi-green + ports: + - "8082:8080" + environment: + - SPRING_PROFILES_ACTIVE=prod + networks: + - gooroomi-network + restart: always + volumes: + - /home/ubuntu/gooroomi/gooroomi-prod-logs:/app/logs + +networks: + gooroomi-network: + driver: bridge \ No newline at end of file From d95f99f576dbb47f6a91dd6872a90682cf4d5bca Mon Sep 17 00:00:00 2001 From: so1eeee Date: Sat, 31 May 2025 05:06:56 +0900 Subject: [PATCH 05/12] =?UTF-8?q?[fix/#39]=20=EB=B0=B0=ED=8F=AC=20zip=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EB=82=B4=20=EB=94=94=EB=A0=89=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EA=B5=AC=EC=A1=B0=20=EB=B3=B4=EC=A1=B4=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=B4=20-j=20=EC=98=B5=EC=85=98=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cicd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index b73754a..e25f1d1 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -77,7 +77,7 @@ jobs: chmod +x ./cicd/script/init-deploy.sh - name: Make zip - run: zip -r -qq -j ./deploy.zip ./cicd + run: zip -r -qq ./deploy.zip ./cicd - run: ls -al - name : Upload S3 From d16d813565c29bfc3c28796ce6a014ff6278f279 Mon Sep 17 00:00:00 2001 From: so1eeee Date: Sat, 31 May 2025 06:27:00 +0900 Subject: [PATCH 06/12] =?UTF-8?q?[fix/#39]=20docker-compose=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EC=83=81=EB=8C=80=EA=B2=BD=EB=A1=9C=EB=A1=9C=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 --- script/init-deploy.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/script/init-deploy.sh b/script/init-deploy.sh index 65b2e8a..6befbcd 100644 --- a/script/init-deploy.sh +++ b/script/init-deploy.sh @@ -1,6 +1,6 @@ #!/bin/bash -# 작업 디렉토리를 확인하고 필요한 디렉토리 생성 +# 로그 디렉토리 생성 mkdir -p /home/ubuntu/gooroomi/gooroomi-prod-logs chmod 755 /home/ubuntu/gooroomi/gooroomi-prod-logs @@ -9,8 +9,8 @@ docker network create gooroomi-network || true # Blue 환경 시작 echo "Blue 환경을 시작합니다..." -docker-compose -f /home/ubuntu/gooroomi/docker-compose.blue.yml build -docker-compose -f /home/ubuntu/gooroomi/docker-compose.blue.yml up -d +docker-compose -f docker-compose.blue.yml build +docker-compose -f docker-compose.blue.yml up -d # Blue 환경이 준비될 때까지 대기 echo "Blue 환경이 준비될 때까지 10초 대기..." @@ -24,13 +24,13 @@ if [ "$HEALTH_CHECK" == "200" ]; then # Green 환경도 시작 echo "Green 환경을 시작합니다..." - docker-compose -f /home/ubuntu/gooroomi/docker-compose.green.yml build - docker-compose -f /home/ubuntu/gooroomi/docker-compose.green.yml up -d + docker-compose -f docker-compose.green.yml build + docker-compose -f docker-compose.green.yml up -d echo "Blue-Green 배포 환경이 준비되었습니다." echo "현재 Blue 환경이 활성화되어 있습니다." else echo "Blue 환경 Health check 실패! 초기 설정을 중단합니다." - docker-compose -f /home/ubuntu/gooroomi/docker-compose.blue.yml down + docker-compose -f docker-compose.blue.yml down exit 1 fi \ No newline at end of file From 9a01d4c49c75020435db6880273fb2a069633b8f Mon Sep 17 00:00:00 2001 From: so1eeee Date: Sat, 31 May 2025 06:37:46 +0900 Subject: [PATCH 07/12] =?UTF-8?q?[fix/#39]=20init-deploy.sh=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=20=EC=9C=84=EC=B9=98=20=EB=B3=B4=EC=A0=95=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 --- script/init-deploy.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/init-deploy.sh b/script/init-deploy.sh index 6befbcd..5f71bb3 100644 --- a/script/init-deploy.sh +++ b/script/init-deploy.sh @@ -1,5 +1,7 @@ #!/bin/bash +cd "$(dirname "$0")/.." + # 로그 디렉토리 생성 mkdir -p /home/ubuntu/gooroomi/gooroomi-prod-logs chmod 755 /home/ubuntu/gooroomi/gooroomi-prod-logs From a5b89088bddf3a832b6b33eef6acda9cd3880c65 Mon Sep 17 00:00:00 2001 From: so1eeee Date: Sat, 31 May 2025 06:52:06 +0900 Subject: [PATCH 08/12] =?UTF-8?q?[fix/#39]=20Dockerfile=20COPY=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 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 60edb4a..5679ec2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ FROM openjdk:17-jdk -COPY ./build/libs/gooroomi-0.0.1-SNAPSHOT.jar gooroomi-backend.jar +COPY ./gooroomi-0.0.1-SNAPSHOT.jar gooroomi-backend.jar ENTRYPOINT ["java", "-jar", "-Duser.timezone=Asia/Seoul", "/gooroomi-backend.jar"] \ No newline at end of file From 0c1b2dfa06f6d3da45e74697300b609434d05c86 Mon Sep 17 00:00:00 2001 From: so1eeee Date: Sat, 31 May 2025 07:34:20 +0900 Subject: [PATCH 09/12] =?UTF-8?q?[chore/#39]=20health=20check=20=EB=8C=80?= =?UTF-8?q?=EA=B8=B0=20=EC=8B=9C=EA=B0=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/init-deploy.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/init-deploy.sh b/script/init-deploy.sh index 5f71bb3..47924c9 100644 --- a/script/init-deploy.sh +++ b/script/init-deploy.sh @@ -15,8 +15,8 @@ docker-compose -f docker-compose.blue.yml build docker-compose -f docker-compose.blue.yml up -d # Blue 환경이 준비될 때까지 대기 -echo "Blue 환경이 준비될 때까지 10초 대기..." -sleep 10 +echo "Blue 환경이 준비될 때까지 30초 대기..." +sleep 30 # Blue 환경 상태 확인 HEALTH_CHECK=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8081/actuator/health) From a9193e960192d1f0b4de49892da7abc86c97d49c Mon Sep 17 00:00:00 2001 From: so1eeee Date: Sat, 31 May 2025 13:55:40 +0900 Subject: [PATCH 10/12] =?UTF-8?q?[refactor/#39]=20=EB=B0=B0=ED=8F=AC=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=A6=BD=ED=8A=B8=20=EB=8B=A8=EC=9D=BC?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appspec.yml | 6 +---- script/deploy.sh | 52 +++++++++++++++++++++++++++++-------------- script/init-deploy.sh | 38 ------------------------------- 3 files changed, 36 insertions(+), 60 deletions(-) delete mode 100644 script/init-deploy.sh diff --git a/appspec.yml b/appspec.yml index 46fe835..b6479b4 100644 --- a/appspec.yml +++ b/appspec.yml @@ -13,11 +13,7 @@ permissions: group: ubuntu hooks: - BeforeInstall: - - location: script/init-deploy.sh - timeout: 300 - runas: root ApplicationStart: - location: script/deploy.sh timeout: 300 - runas: root + runas: root \ No newline at end of file diff --git a/script/deploy.sh b/script/deploy.sh index 3d1403e..eef919f 100644 --- a/script/deploy.sh +++ b/script/deploy.sh @@ -3,22 +3,31 @@ # Nginx conf 경로 NGINX_CONF="/etc/nginx/conf.d/gooroomi.conf" +# 로그 디렉토리 생성 +mkdir -p /home/ubuntu/gooroomi/gooroomi-prod-logs +chmod 755 /home/ubuntu/gooroomi/gooroomi-prod-logs + +# Docker 네트워크 생성 (없으면 생성) +docker network create gooroomi-network 2>/dev/null || true + # 현재 활성화된 환경 확인 (주석 처리 여부로 판단) -if grep -q '^\s*server 127.0.0.1:8081;' $NGINX_CONF; then +if grep -q '^\s*server 127.0.0.1:8081;' $NGINX_CONF 2>/dev/null; then CURRENT_ENV="blue" + TARGET_ENV="green" else + # 초기 배포이거나 green이 활성화된 경우 CURRENT_ENV="green" + TARGET_ENV="blue" fi echo "현재 활성화된 환경: $CURRENT_ENV" +echo "대상 환경: $TARGET_ENV" -# 환경 전환 -echo "트래픽을 전환합니다..." -if [ "$CURRENT_ENV" == "blue" ]; then - TARGET_ENV="green" -else - TARGET_ENV="blue" -fi +# 기존에 실행 중인 대상 환경 컨테이너 정리 +echo "기존 $TARGET_ENV 환경을 정리합니다..." +docker-compose -f /home/ubuntu/gooroomi/docker-compose.$TARGET_ENV.yml down 2>/dev/null || true +docker rm -f gooroomi-$TARGET_ENV 2>/dev/null || true +sleep 5 # 컨테이너가 완전히 종료될 때까지 대기 # 대상 환경 빌드 및 실행 echo "$TARGET_ENV 환경을 빌드하고 실행합니다..." @@ -26,8 +35,8 @@ docker-compose -f /home/ubuntu/gooroomi/docker-compose.$TARGET_ENV.yml build docker-compose -f /home/ubuntu/gooroomi/docker-compose.$TARGET_ENV.yml up -d # 새 환경이 준비될 때까지 대기 -echo "새 환경이 준비될 때까지 10초 대기..." -sleep 10 +echo "새 환경이 준비될 때까지 30초 대기..." +sleep 30 # 대상 환경 상태 확인 PORT=$(if [ "$TARGET_ENV" == "blue" ]; then echo "8081"; else echo "8082"; fi) @@ -35,7 +44,6 @@ HEALTH_CHECK=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:$PORT/ac if [ "$HEALTH_CHECK" == "200" ]; then echo "Health check 성공, Nginx 설정을 업데이트합니다..." - # Nginx 설정에서 기존 활성화 서버를 주석 처리, 대상 서버를 활성화 if [ "$TARGET_ENV" == "blue" ]; then sudo sed -i 's/^\s*#\?server 127.0.0.1:8081;/ server 127.0.0.1:8081;/' $NGINX_CONF @@ -46,15 +54,25 @@ if [ "$HEALTH_CHECK" == "200" ]; then fi # Nginx 설정 리로드 - sudo nginx -s reload - - echo "Nginx 설정이 업데이트되었습니다. 트래픽이 $TARGET_ENV 환경으로 전환됩니다." + if command -v nginx >/dev/null 2>&1; then + sudo nginx -s reload + echo "Nginx 설정이 업데이트되었습니다. 트래픽이 $TARGET_ENV 환경으로 전환됩니다." + else + echo "Nginx가 설치되어 있지 않습니다. 설치 후 다시 시도하세요." + exit 1 + fi - # 이전 환경은 잠시 유지 (롤백을 위해) - echo "이전 환경($CURRENT_ENV)은 잠시 유지됩니다." + # 이전 환경이 실행 중인지 확인하고, 실행 중이면 유지 + if docker ps | grep -q "gooroomi-$CURRENT_ENV"; then + echo "이전 환경($CURRENT_ENV)은 롤백을 위해 유지됩니다." + else + echo "이전 환경이 실행 중이 아닙니다. 필요시 다시 배포하세요." + fi else echo "Health check 실패! 배포를 중단합니다." + echo "컨테이너 로그를 확인합니다:" + docker logs gooroomi-$TARGET_ENV --tail 50 echo "$TARGET_ENV 환경을 중지합니다..." - docker-compose -f /home/ubuntu/gooroomi/docker-compose.$TARGET_ENV.yml down + docker-compose -f /home/ubuntu/gooroomi/docker-compose.$TARGET_ENV.yml down || docker rm -f gooroomi-$TARGET_ENV 2>/dev/null || true exit 1 fi \ No newline at end of file diff --git a/script/init-deploy.sh b/script/init-deploy.sh deleted file mode 100644 index 47924c9..0000000 --- a/script/init-deploy.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -cd "$(dirname "$0")/.." - -# 로그 디렉토리 생성 -mkdir -p /home/ubuntu/gooroomi/gooroomi-prod-logs -chmod 755 /home/ubuntu/gooroomi/gooroomi-prod-logs - -# Docker 네트워크 생성 -docker network create gooroomi-network || true - -# Blue 환경 시작 -echo "Blue 환경을 시작합니다..." -docker-compose -f docker-compose.blue.yml build -docker-compose -f docker-compose.blue.yml up -d - -# Blue 환경이 준비될 때까지 대기 -echo "Blue 환경이 준비될 때까지 30초 대기..." -sleep 30 - -# Blue 환경 상태 확인 -HEALTH_CHECK=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8081/actuator/health) - -if [ "$HEALTH_CHECK" == "200" ]; then - echo "Blue 환경 Health check 성공" - - # Green 환경도 시작 - echo "Green 환경을 시작합니다..." - docker-compose -f docker-compose.green.yml build - docker-compose -f docker-compose.green.yml up -d - - echo "Blue-Green 배포 환경이 준비되었습니다." - echo "현재 Blue 환경이 활성화되어 있습니다." -else - echo "Blue 환경 Health check 실패! 초기 설정을 중단합니다." - docker-compose -f docker-compose.blue.yml down - exit 1 -fi \ No newline at end of file From eb0c42fd68e1f8d4d99b96b88d8b454b638d8158 Mon Sep 17 00:00:00 2001 From: so1eeee Date: Sat, 31 May 2025 14:14:32 +0900 Subject: [PATCH 11/12] =?UTF-8?q?[fix/#39]=20CI/CD=20=ED=8C=8C=EC=9D=B4?= =?UTF-8?q?=ED=94=84=EB=9D=BC=EC=9D=B8=EC=97=90=EC=84=9C=20init-deploy.sh?= =?UTF-8?q?=20=EC=B0=B8=EC=A1=B0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cicd.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index e25f1d1..3cec3bb 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -71,10 +71,8 @@ jobs: cp ./docker-compose.green.yml ./cicd cp ./script/deploy.sh ./cicd/script/ cp ./script/rollback.sh ./cicd/script/ - cp ./script/init-deploy.sh ./cicd/script/ chmod +x ./cicd/script/deploy.sh chmod +x ./cicd/script/rollback.sh - chmod +x ./cicd/script/init-deploy.sh - name: Make zip run: zip -r -qq ./deploy.zip ./cicd From a4698c872dbccb0cf1d704401269cec2457975af Mon Sep 17 00:00:00 2001 From: so1eeee Date: Sat, 31 May 2025 15:44:27 +0900 Subject: [PATCH 12/12] =?UTF-8?q?[feat/#39]=20health=20check=20=EB=B0=98?= =?UTF-8?q?=EB=B3=B5=20=EC=8B=9C=EB=8F=84=20=EB=B0=8F=20=EB=8C=80=EA=B8=B0?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EB=8F=84=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/deploy.sh | 92 ++++++++++++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 35 deletions(-) diff --git a/script/deploy.sh b/script/deploy.sh index eef919f..49d5182 100644 --- a/script/deploy.sh +++ b/script/deploy.sh @@ -34,45 +34,67 @@ echo "$TARGET_ENV 환경을 빌드하고 실행합니다..." docker-compose -f /home/ubuntu/gooroomi/docker-compose.$TARGET_ENV.yml build docker-compose -f /home/ubuntu/gooroomi/docker-compose.$TARGET_ENV.yml up -d -# 새 환경이 준비될 때까지 대기 -echo "새 환경이 준비될 때까지 30초 대기..." -sleep 30 +# 새 환경이 준비될 때까지 대기 및 health check 실행 +echo "새 환경이 준비될 때까지 대기합니다..." -# 대상 환경 상태 확인 +# 포트 설정 PORT=$(if [ "$TARGET_ENV" == "blue" ]; then echo "8081"; else echo "8082"; fi) -HEALTH_CHECK=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:$PORT/actuator/health") -if [ "$HEALTH_CHECK" == "200" ]; then - echo "Health check 성공, Nginx 설정을 업데이트합니다..." - # Nginx 설정에서 기존 활성화 서버를 주석 처리, 대상 서버를 활성화 - if [ "$TARGET_ENV" == "blue" ]; then - sudo sed -i 's/^\s*#\?server 127.0.0.1:8081;/ server 127.0.0.1:8081;/' $NGINX_CONF - sudo sed -i 's/^\s*server 127.0.0.1:8082;/ #server 127.0.0.1:8082;/' $NGINX_CONF - else - sudo sed -i 's/^\s*#\?server 127.0.0.1:8082;/ server 127.0.0.1:8082;/' $NGINX_CONF - sudo sed -i 's/^\s*server 127.0.0.1:8081;/ #server 127.0.0.1:8081;/' $NGINX_CONF - fi +# Health check 설정 +MAX_ATTEMPTS=12 # 최대 시도 횟수 (5초 간격으로 12번 = 최대 60초) +WAIT_TIME=5 # 시도 간격 (초) +ATTEMPT=1 - # Nginx 설정 리로드 - if command -v nginx >/dev/null 2>&1; then - sudo nginx -s reload - echo "Nginx 설정이 업데이트되었습니다. 트래픽이 $TARGET_ENV 환경으로 전환됩니다." - else - echo "Nginx가 설치되어 있지 않습니다. 설치 후 다시 시도하세요." - exit 1 - fi +while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do + echo "Health check 시도 $ATTEMPT/$MAX_ATTEMPTS (포트: $PORT)..." - # 이전 환경이 실행 중인지 확인하고, 실행 중이면 유지 - if docker ps | grep -q "gooroomi-$CURRENT_ENV"; then - echo "이전 환경($CURRENT_ENV)은 롤백을 위해 유지됩니다." + # Health check 실행 + HEALTH_CHECK=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:$PORT/actuator/health") + + if [ "$HEALTH_CHECK" == "200" ]; then + echo "Health check 성공, Nginx 설정을 업데이트합니다..." + + # Nginx 설정에서 기존 활성화 서버를 주석 처리, 대상 서버를 활성화 + if [ "$TARGET_ENV" == "blue" ]; then + sudo sed -i 's/^\s*#\?server 127.0.0.1:8081;/ server 127.0.0.1:8081;/' $NGINX_CONF + sudo sed -i 's/^\s*server 127.0.0.1:8082;/ #server 127.0.0.1:8082;/' $NGINX_CONF + else + sudo sed -i 's/^\s*#\?server 127.0.0.1:8082;/ server 127.0.0.1:8082;/' $NGINX_CONF + sudo sed -i 's/^\s*server 127.0.0.1:8081;/ #server 127.0.0.1:8081;/' $NGINX_CONF + fi + + # Nginx 설정 리로드 + if command -v nginx >/dev/null 2>&1; then + sudo nginx -s reload + echo "Nginx 설정이 업데이트되었습니다. 트래픽이 $TARGET_ENV 환경으로 전환됩니다." + else + echo "Nginx가 설치되어 있지 않습니다. 설치 후 다시 시도하세요." + exit 1 + fi + + # 이전 환경이 실행 중인지 확인하고, 실행 중이면 유지 + if docker ps | grep -q "gooroomi-$CURRENT_ENV"; then + echo "이전 환경($CURRENT_ENV)은 롤백을 위해 유지됩니다." + else + echo "이전 환경이 실행 중이 아닙니다. 필요시 다시 배포하세요." + fi + + exit 0 else - echo "이전 환경이 실행 중이 아닙니다. 필요시 다시 배포하세요." + echo "Health check 실패 (HTTP 코드: $HEALTH_CHECK). ${WAIT_TIME}초 후 재시도..." + + # 마지막 시도가 아니면 잠시 대기 후 다음 시도 + if [ $ATTEMPT -lt $MAX_ATTEMPTS ]; then + sleep $WAIT_TIME + ATTEMPT=$((ATTEMPT+1)) + else + # 마지막 시도에서 실패한 경우 + echo "최대 시도 횟수($MAX_ATTEMPTS)를 초과했습니다. 배포를 중단합니다." + echo "컨테이너 로그를 확인합니다:" + docker logs gooroomi-$TARGET_ENV + echo "$TARGET_ENV 환경을 중지합니다..." + docker-compose -f /home/ubuntu/gooroomi/docker-compose.$TARGET_ENV.yml down || docker rm -f gooroomi-$TARGET_ENV 2>/dev/null || true + exit 1 + fi fi -else - echo "Health check 실패! 배포를 중단합니다." - echo "컨테이너 로그를 확인합니다:" - docker logs gooroomi-$TARGET_ENV --tail 50 - echo "$TARGET_ENV 환경을 중지합니다..." - docker-compose -f /home/ubuntu/gooroomi/docker-compose.$TARGET_ENV.yml down || docker rm -f gooroomi-$TARGET_ENV 2>/dev/null || true - exit 1 -fi \ No newline at end of file +done \ No newline at end of file