diff --git a/.github/workflows/prod-cd.yml b/.github/workflows/prod-cd.yml index 9a88b77..17e2209 100644 --- a/.github/workflows/prod-cd.yml +++ b/.github/workflows/prod-cd.yml @@ -8,7 +8,7 @@ on: branches: [ main ] # main branch로 push 될 때 실행됩니다. env: - S3_BUCKET_NAME: runnect-prod-bucket + S3_BUCKET_NAME: runnect-prod-bucket-604764467555-ap-northeast-2-an jobs: build: @@ -90,9 +90,9 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_PROD_ACCESS_KEY }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_PROD_SECRET_KEY }} run: - aws deploy create-deployment - --application-name runnect-prod-codedeploy - --deployment-group-name runnect-prod-codedeploy-group + aws deploy create-deployment + --application-name runnect-prod-app + --deployment-group-name runnect-prod-deploy-group --file-exists-behavior OVERWRITE - --s3-location bucket=runnect-prod-bucket,bundleType=zip,key=runnect_prod_server.zip + --s3-location bucket=runnect-prod-bucket-604764467555-ap-northeast-2-an,bundleType=zip,key=runnect_prod_server.zip --region ap-northeast-2 diff --git a/.github/workflows/prod-ci.yml b/.github/workflows/prod-ci.yml index ca4a4df..21cc3df 100644 --- a/.github/workflows/prod-ci.yml +++ b/.github/workflows/prod-ci.yml @@ -40,5 +40,5 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - - name: Build with Gradle # 실제 application build - run: ./gradlew build + - name: Build with Gradle + run: ./gradlew build -x test diff --git a/appspec.yml b/appspec.yml index 2b9ffff..ad79218 100644 --- a/appspec.yml +++ b/appspec.yml @@ -2,18 +2,18 @@ version: 0.0 os: linux files: - - source: / - destination: /home/ubuntu/app + - source: / + destination: /home/ec2-user/app overwrite: yes permissions: - object: / pattern: "**" - owner: ubuntu - group: ubuntu + owner: ec2-user + group: ec2-user hooks: AfterInstall: - location: deploy.sh timeout: 300 - runas: ubuntu + runas: ec2-user diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 13e3807..e1f60e8 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -1,96 +1,45 @@ #!/bin/bash -BUILD_PATH=$(ls /home/ubuntu/app/server-0.0.1-SNAPSHOT.jar) -JAR_NAME=$(basename $BUILD_PATH) -echo "> build 파일명: $JAR_NAME" - -echo "> build 파일 복사" -DEPLOY_PATH=/home/ubuntu/app/nonstop/jar/ -cp $BUILD_PATH $DEPLOY_PATH - -echo "> 현재 구동중인 Set 확인" -CURRENT_PROFILE=$(curl -s http://localhost/profile) -echo "> $CURRENT_PROFILE" - -# 쉬고 있는 set 찾기: set1이 사용중이면 set2가 쉬고 있고, 반대면 set1이 쉬고 있음 -if [ $CURRENT_PROFILE == set1 ] -then - IDLE_PROFILE=set2 - IDLE_PORT=8082 -elif [ $CURRENT_PROFILE == set2 ] -then - IDLE_PROFILE=set1 - IDLE_PORT=8081 +set -e + +APP_DIR=/home/ec2-user/app +JAR_PATH=$(ls $APP_DIR/*.jar | grep -v plain | head -1) +echo "> JAR 파일: $JAR_PATH" + +echo "> 실행 중인 애플리케이션 종료" +CURRENT_PID=$(pgrep -f '\.jar' || true) +if [ -n "$CURRENT_PID" ]; then + echo "> 종료: $CURRENT_PID" + kill -15 $CURRENT_PID + sleep 5 else - echo "> 일치하는 Profile이 없습니다. Profile: $CURRENT_PROFILE" - echo "> set1을 할당합니다. IDLE_PROFILE: set1" - IDLE_PROFILE=set1 - IDLE_PORT=8081 + echo "> 실행 중인 애플리케이션 없음" fi -echo "> application.jar 교체" -IDLE_APPLICATION=$IDLE_PROFILE-Runnect-Spring-Boot-Server.jar -IDLE_APPLICATION_PATH=$DEPLOY_PATH$IDLE_APPLICATION - -ln -Tfs $DEPLOY_PATH$JAR_NAME $IDLE_APPLICATION_PATH - -echo "> $IDLE_PROFILE 에서 구동중인 애플리케이션 pid 확인" -IDLE_PID=$(pgrep -f $IDLE_APPLICATION) - -if [ -z $IDLE_PID ] -then - echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." -else - echo "> kill -15 $IDLE_PID" - kill -15 $IDLE_PID - sleep 20 -fi +echo "> 애플리케이션 시작" +nohup java -jar \ + -Duser.timezone=Asia/Seoul \ + $JAR_PATH \ + >> /home/ec2-user/app/nohup.out 2>&1 & -echo "> $IDLE_PROFILE 배포" -nohup java -jar -Duser.timezone=Asia/Seoul -Dspring.profiles.active=$IDLE_PROFILE $IDLE_APPLICATION_PATH >> /home/ubuntu/app/nohup.out 2>&1 & +echo "> 15초 후 헬스체크 시작" +sleep 15 -echo "> $IDLE_PROFILE 10초 후 Health check 시작" -echo "> curl -s http://localhost:$IDLE_PORT/health " -sleep 10 - -for retry_count in {1..10} -do - response=$(curl -s http://localhost:$IDLE_PORT/actuator/health) - up_count=$(echo $response | grep 'UP' | wc -l) - - if [ $up_count -ge 1 ] - then # $up_count >= 1 ("UP" 문자열이 있는지 검증) - echo "> Health check 성공" - break - else - echo "> Health check의 응답을 알 수 없거나 혹은 status가 UP이 아닙니다." - echo "> Health check: ${response}" +for i in {1..10}; do + RESPONSE=$(curl -s http://localhost:8080/actuator/health || true) + if echo "$RESPONSE" | grep -q '"status":"UP"'; then + echo "> 헬스체크 성공" + break fi - - if [ $retry_count -eq 10 ] - then - echo "> Health check 실패. " - echo "> Nginx에 연결하지 않고 배포를 종료합니다." + echo "> 헬스체크 실패($i/10): $RESPONSE" + if [ $i -eq 10 ]; then + echo "> 배포 실패" exit 1 fi - - echo "> Health check 연결 실패. 재시도..." sleep 10 done -echo "> Nginx 상태 확인" -if ! sudo systemctl is-active --quiet nginx; then - echo "> Nginx가 중지되어 있습니다. 재시작합니다." - sudo systemctl start nginx - sleep 2 - if sudo systemctl is-active --quiet nginx; then - echo "> Nginx 재시작 성공" - else - echo "> Nginx 재시작 실패." - fi -else - echo "> Nginx 정상 구동 중" -fi +echo "> Nginx 시작" +sudo systemctl start nginx || true +sudo systemctl enable nginx || true -echo "> 스위칭" -sleep 10 -/home/ubuntu/app/nonstop/switch.sh +echo "> 배포 완료"