diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cb614bf7..98d0796a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,18 +9,16 @@ name: BackEnd - CI/CD(build) on: pull_request: - branches: [ "main","develop" ] + branches: [ "develop", "release/v**", "main" ] push: - branches: [ "develop" ] + branches: [ "develop", "release/v**" ] permissions: contents: read jobs: build: - runs-on: ubuntu-latest - steps: - uses: actions/checkout@v3 # JDK를 17 버전으로 셋팅한다. diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy-dev.yml similarity index 67% rename from .github/workflows/deploy.yml rename to .github/workflows/deploy-dev.yml index 2959257a..acfb5c18 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy-dev.yml @@ -9,28 +9,33 @@ name: BackEnd - CI/CD(deploy) on: pull_request: - types: [ closed ] branches: [ "develop" ] + types: [ closed ] + permissions: contents: read jobs: - deploy: + deploy-dev: if: github.event.pull_request.merged == true runs-on: ubuntu-latest - + environment: develop + env: + DEPLOYMENT_GROUP_NAME: meeteam-dev + S3_BUCKET_DIR_NAME: dev steps: - - uses: actions/checkout@v3 + - name: ✅ Checkout branch + uses: actions/checkout@v3 # JDK를 17 버전으로 셋팅한다. - - name: Set up JDK 17 + - name: ⚙️ Set up JDK 17 uses: actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' # Gradle을 캐싱한다 -> 빌드 속도가 증가하는 효과가 있다. - - name: Gradle 캐싱 + - name: ✅ Gradle 캐싱 uses: actions/cache@v3 with: path: | @@ -41,15 +46,19 @@ jobs: ${{ runner.os }}-gradle- # 프로젝트 저장소에 업로드하면 안되는 설정 파일들을 만들어줍니다. - - name: Make application.yml & KEYS & ApproveMail.html + - name: 🗂️ Make config run: | # src/main/resources 경로 이동 - cd ./src/main/resources + cd ./src/main/resources # yml 파일 생성 touch ./application-dev.yml echo "$APPLICATION_DEV" > ./application-dev.yml + # 키 파일 생성 + touch ./private-key.pem + echo "$CLOUD_FRONT_KEY" > ./private-key.pem + # 폴더 생성 mkdir templates @@ -69,49 +78,49 @@ jobs: MAIL_APPROVE_TEMPLATE: ${{ secrets.MAIL_APPROVE_TEMPLATE }} MAIL_VERIFY_TEMPLATE: ${{ secrets.MAIL_VERIFY_TEMPLATE }} MAIL_APPLICATION_NOTIFICATION_TEMPLATE: ${{ secrets.MAIL_APPLICATION_NOTIFICATION_TEMPLATE }} + CLOUD_FRONT_KEY: ${{ secrets.CLOUD_FRONT_KEY }} shell: bash - - name: Gradle 권한 부여 + - name: ⚙️ Gradle 권한 부여 run: chmod +x gradlew - - name: Gradle로 빌드 실행 + - name: ⚙️ Gradle로 빌드 실행 run: ./gradlew bootjar - - - # 배포에 필요한 여러 설정 파일과 프로젝트 빌드파일을 zip 파일로 모아줍니다. - - name: zip file 생성 + # 배포에 필요한 여러 설정 파일과 프로젝트 빌드파일을 zip 파일로 모아준다. + - name: 📦 zip file 생성 run: | mkdir deploy - cp ./docker/docker-compose.blue.yml ./deploy/ - cp ./docker/docker-compose.green.yml ./deploy/ + mkdir deploy/dev + cp ./docker/dev/docker-compose.dev.yml ./deploy/dev + cp ./docker/dev/Dockerfile ./deploy/dev + cp ./src/main/resources/private-key.pem ./deploy/dev + cp ./build/libs/*.jar ./deploy/dev cp ./appspec.yml ./deploy/ - cp ./docker/Dockerfile ./deploy/ - cp ./scripts/*.sh ./deploy/ - cp ./build/libs/*.jar ./deploy/ - zip -r -qq -j ./spring-build.zip ./deploy + cp ./scripts/deploy.sh ./deploy/ + zip -r -qq ./spring-app.zip ./deploy - # AWS에 연결해줍니다. - - name: AWS 연결 + # AWS에 연결해준다. + - name: 🌎 AWS 연결 uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ secrets.AWS_REGION }} - # S3에 프로젝트를 업로드 합니다. - - name: S3에 프로젝트 업로드 + # S3에 프로젝트를 업로드 한다. + - name: 🚛 S3에 프로젝트 업로드 run: | aws s3 cp \ --region ap-northeast-2 \ - ./spring-build.zip s3://meeteam-backend-bucket + ./spring-app.zip s3://${{ secrets.S3_BUCKET_NAME }}/${{ env.S3_BUCKET_DIR_NAME }}/spring-app.zip - # CodeDelploy에 배포를 요청합니다. - - name: Code Deploy 배포 요청 + # CodeDelploy에 배포를 요청한다. + - name: 🚀 Code Deploy 배포 요청 run: aws deploy create-deployment --application-name meeteam-app --deployment-config-name CodeDeployDefault.OneAtATime - --deployment-group-name meeteam-app - --s3-location bucket=meeteam-backend-bucket,bundleType=zip,key=spring-build.zip + --deployment-group-name ${{ env.DEPLOYMENT_GROUP_NAME }} + --s3-location bucket=${{ secrets.S3_BUCKET_NAME }},bundleType=zip,key=${{ env.S3_BUCKET_DIR_NAME }}/spring-app.zip - name: Discord 알림 봇 uses: sarisia/actions-status-discord@v1 diff --git a/.github/workflows/deploy-prod.yml b/.github/workflows/deploy-prod.yml new file mode 100644 index 00000000..935108d8 --- /dev/null +++ b/.github/workflows/deploy-prod.yml @@ -0,0 +1,131 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle + +name: BackEnd - CI/CD(deploy) + +on: + pull_request: + branches: [ "main" ] + types: [ closed ] + + +permissions: + contents: read + +jobs: + deploy-prod: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + environment: production + env: + DEPLOYMENT_GROUP_NAME: meeteam-app + S3_BUCKET_DIR_NAME: prod + steps: + - name: ✅ Checkout branch + uses: actions/checkout@v3 + # JDK를 17 버전으로 셋팅한다. + - name: ⚙️ Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + + # Gradle을 캐싱한다 -> 빌드 속도가 증가하는 효과가 있다. + - name: ✅ Gradle 캐싱 + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + # 프로젝트 저장소에 업로드하면 안되는 설정 파일들을 만들어줍니다. + - name: 🗂️ Make config + run: | + # src/main/resources 경로 이동 + cd ./src/main/resources + + # yml 파일 생성 + touch ./application-prod.yml + echo "$APPLICATION_PROD" > ./application-prod.yml + + # 키 파일 생성 + touch ./private-key.pem + echo "$CLOUD_FRONT_KEY" > ./private-key.pem + + # 폴더 생성 + mkdir templates + + # 메일 관련된 html 파일 생성 + cd ./templates + touch ./ApproveMail.html + echo "$MAIL_APPROVE_TEMPLATE" > ./ApproveMail.html + + touch ./UniversityAuthMail.html + echo "$MAIL_VERIFY_TEMPLATE" > ./UniversityAuthMail.html + + touch ./ApplicationNotificationMail.html + echo "$MAIL_APPLICATION_NOTIFICATION_TEMPLATE" > ./ApplicationNotificationMail.html + + env: + APPLICATION_PROD: ${{ secrets.APPLICATION_PROD }} + MAIL_APPROVE_TEMPLATE: ${{ secrets.MAIL_APPROVE_TEMPLATE }} + MAIL_VERIFY_TEMPLATE: ${{ secrets.MAIL_VERIFY_TEMPLATE }} + MAIL_APPLICATION_NOTIFICATION_TEMPLATE: ${{ secrets.MAIL_APPLICATION_NOTIFICATION_TEMPLATE }} + CLOUD_FRONT_KEY: ${{ secrets.CLOUD_FRONT_KEY }} + shell: bash + + - name: ⚙️ Gradle 권한 부여 + run: chmod +x gradlew + + - name: ⚙️ Gradle로 빌드 실행 + run: ./gradlew bootjar + # 배포에 필요한 여러 설정 파일과 프로젝트 빌드파일을 zip 파일로 모아준다. + - name: 📦 zip file 생성 + run: | + mkdir deploy + mkdir deploy/prod + cp ./docker/prod/docker-compose.prod.yml ./deploy/prod + cp ./docker/prod/Dockerfile ./deploy/prod + cp ./src/main/resources/private-key.pem ./deploy/prod + cp ./build/libs/*.jar ./deploy/prod + cp ./scripts/deploy.sh ./deploy/ + cp ./appspec.yml ./deploy/ + zip -r -qq ./spring-app.zip ./deploy + + + # AWS에 연결해준다. + - name: 🌎 AWS 연결 + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ secrets.AWS_REGION }} + + # S3에 프로젝트를 업로드 한다. + - name: 🚛 S3에 프로젝트 업로드 + run: | + aws s3 cp \ + --region ap-northeast-2 \ + ./spring-app.zip s3://${{ secrets.S3_BUCKET_NAME }}/${{ env.S3_BUCKET_DIR_NAME }}/spring-app.zip + + # CodeDelploy에 배포를 요청한다. + - name: 🚀 Code Deploy 배포 요청 + run: aws deploy create-deployment --application-name meeteam-app + --deployment-config-name CodeDeployDefault.OneAtATime + --deployment-group-name ${{ env.DEPLOYMENT_GROUP_NAME }} + --s3-location bucket=${{ secrets.S3_BUCKET_NAME }},bundleType=zip,key=${{ env.S3_BUCKET_DIR_NAME }}/spring-app.zip + + - name: Discord 알림 봇 + uses: sarisia/actions-status-discord@v1 + if: ${{ failure() }} + with: + title: ❗️ Backend CD failed ❗️ + webhook: ${{ secrets.DISCORD_WEBHOOK }} + color: FF0000 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 012ccb18..1646b5b4 100644 --- a/.gitignore +++ b/.gitignore @@ -177,7 +177,7 @@ replay_pid* # End of https://www.toptal.com/developers/gitignore/api/intellij,java -*.yml +src/**/*.yml *.sql *.html src/main/generated diff --git a/appspec.yml b/appspec.yml index 10b3366e..43d0fc97 100644 --- a/appspec.yml +++ b/appspec.yml @@ -11,6 +11,7 @@ files: destination: /home/ubuntu/app # 대상 경로에 이미 파일이 존재하는 경우, 덮어쓰기를 허용할지 여부 overwrite: yes +file_exists_behavior: OVERWRITE # 파일 및 디렉토리 권한에 관련된 설정 permissions: diff --git a/docker/Dockerfile b/docker/dev/Dockerfile similarity index 92% rename from docker/Dockerfile rename to docker/dev/Dockerfile index c84cd232..a71d1a79 100644 --- a/docker/Dockerfile +++ b/docker/dev/Dockerfile @@ -5,6 +5,6 @@ ARG JAR_FILE=*.jar ### JAR_FILE 경로에 해당하는 파일을 Docker 이미지 내부로 복사한다. COPY ${JAR_FILE} meeteam.jar ### CloudFront Private Key 복사 -COPY private_key.pem /app/private_key.pem +COPY private-key.pem /app/private-key.pem ### Docker 컨테이너가 시작될 때 실행할 명령을 지정한다. ENTRYPOINT ["java","-jar","-Dspring.profiles.active=dev","-Duser.timezone=Asia/Seoul","meeteam.jar"] diff --git a/docker/dev/docker-compose.dev.yml b/docker/dev/docker-compose.dev.yml new file mode 100644 index 00000000..123e797e --- /dev/null +++ b/docker/dev/docker-compose.dev.yml @@ -0,0 +1,26 @@ +version: '3.8' + +networks: + development_network: + driver: bridge + +services: + redis: + image: "redis:alpine" + container_name: redis-dev + networks: + - development_network + expose: + - "6379" + + spring-app: + build: + context: . + dockerfile: Dockerfile + container_name: dev-spring-app + environment: + - SPRING_PROFILES_ACTIVE=dev + networks: + - development_network + ports: + - "1821:8080" diff --git a/docker/docker-compose.blue.yml b/docker/docker-compose.blue.yml deleted file mode 100644 index 5b2624a2..00000000 --- a/docker/docker-compose.blue.yml +++ /dev/null @@ -1,18 +0,0 @@ -#blue -version: '3' -services: - # 서비스의 이름 - backend: - # 현재 디렉토리에서의 Dockerfile을 사용하여 Docker 이미지를 빌드 - build: . - # 호스트의 8081 포트와 컨테이너의 80 포트를 매핑 - environment: - TZ: "Asia/Seoul" - ports: - - "8081:8080" - # 컨테이너의 이름 - container_name: spring-blue - extra_hosts: - - "host.docker.internal:host-gateway" - volumes: - - /home/ubuntu/app/log:/log \ No newline at end of file diff --git a/docker/docker-compose.green.yml b/docker/docker-compose.green.yml deleted file mode 100644 index 2bfc80ad..00000000 --- a/docker/docker-compose.green.yml +++ /dev/null @@ -1,14 +0,0 @@ -#green -version: '3' -services: - backend: - build: . - ports: - - "8082:8080" - container_name: spring-green - environment: - TZ: "Asia/Seoul" - extra_hosts: - - "host.docker.internal:host-gateway" - volumes: - - /home/ubuntu/app/log:/log \ No newline at end of file diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile new file mode 100644 index 00000000..0687d2e9 --- /dev/null +++ b/docker/prod/Dockerfile @@ -0,0 +1,10 @@ +### Docker 이미지를 생성할 때 기반이 되는 베이스 이미지를 설정한다. +FROM openjdk:17 +### Dockerfile 내에서 사용할 변수 JAR_FILE을 정의한다. +ARG JAR_FILE=*.jar +### JAR_FILE 경로에 해당하는 파일을 Docker 이미지 내부로 복사한다. +COPY ${JAR_FILE} meeteam.jar +### CloudFront Private Key 복사 +COPY private-key.pem /app/private-key.pem +### Docker 컨테이너가 시작될 때 실행할 명령을 지정한다. +ENTRYPOINT ["java","-jar","-Dspring.profiles.active=prod","-Duser.timezone=Asia/Seoul","meeteam.jar"] diff --git a/docker/prod/docker-compose.prod.yml b/docker/prod/docker-compose.prod.yml new file mode 100644 index 00000000..7efe4d6c --- /dev/null +++ b/docker/prod/docker-compose.prod.yml @@ -0,0 +1,44 @@ +version: '3.8' + +networks: + production_network: + name: production_network + driver: bridge + +services: + redis: + image: "redis:alpine" + container_name: redis + restart: always + networks: + - production_network + expose: + - "6379" + volumes: + - redis_data:/data + + spring-app-blue: + build: . + container_name: prod-blue + networks: + - production_network + ports: + - "8081:8080" + volumes: + - /home/ubuntu/app/log:/log + depends_on: + - redis + + spring-app-green: + build: . + container_name: prod-green + networks: + - production_network + ports: + - "8082:8080" + volumes: + - /home/ubuntu/app/log:/log + depends_on: + - redis +volumes: + redis_data: \ No newline at end of file diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 2dc5e6d1..0c5b02d8 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -1,74 +1,126 @@ #!/bin/bash -# 작업 디렉토리를 /home/ubuntu/app으로 변경 -cd /home/ubuntu/app - -# 환경변수 DOCKER_APP_NAME을 spring으로 설정 -DOCKER_APP_NAME=spring +DEPLOYMENT_ID=$DEPLOYMENT_ID +# 배포 ID가 제공되지 않으면 오류를 출력하고 종료 +if [ -z "$DEPLOYMENT_ID" ]; then + echo "Deployment ID is not set. Please ensure the deployment ID is provided." + exit 1 +fi +# AWS CLI를 사용하여 배포 세부 정보 가져오기 +DEPLOYMENT_DETAILS=$(aws deploy get-deployment --deployment-id $DEPLOYMENT_ID) -# 실행중인 blue가 있는지 확인 -# 프로젝트의 실행 중인 컨테이너를 확인하고, 해당 컨테이너가 실행 중인지 여부를 EXIST_BLUE 변수에 저장 -EXIST_BLUE=$(sudo docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml ps | grep Up) +# 배포 그룹 이름 추출 +DEPLOYMENT_GROUP_NAME=$(echo $DEPLOYMENT_DETAILS | jq -r '.deploymentInfo.deploymentGroupName') +echo $DEPLOYMENT_GROUP_NAME -# 배포 시작한 날짜와 시간을 기록 -echo "배포 시작일자 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log +# 만약 배포가 prod 라면 +if [ "$DEPLOYMENT_GROUP_NAME" = "spring-app" ]; then + # 작업 디렉토리를 /home/ubuntu/app/prod으로 변경 + cd /home/ubuntu/app/prod -# green이 실행중이면 blue up -# EXIST_BLUE 변수가 비어있는지 확인 -if [ -z "$EXIST_BLUE" ]; then + # 환경변수 DOCKER_APP_NAME을 spring-app으로 설정 + DOCKER_APP_NAME=spring-app - # 로그 파일(/home/ubuntu/deploy.log)에 "blue up - blue 배포 : port:8081"이라는 내용을 추가 - echo "blue 배포 시작 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log + # 실행중인 blue가 있는지 확인 + # 프로젝트의 실행 중인 컨테이너를 확인하고, 해당 컨테이너가 실행 중인지 여부를 EXIST_BLUE 변수에 저장 + EXIST_REDIS=$(sudo docker ps --filter "name=redis" --filter "status=running") + EXIST_BLUE=$(sudo docker ps --filter "ancestor=${DOCKER_APP_NAME}-blue" --filter "status=running") - # docker-compose.blue.yml 파일을 사용하여 spring-blue 프로젝트의 컨테이너를 빌드하고 실행 - sudo docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml up -d --build + # 배포 시작한 날짜와 시간을 기록 + echo "배포 시작일자 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log - # 30초 동안 대기 - while [ 1 = 1 ]; do - echo ">>> spring blue health check ..." - sleep 3 - REQUEST_SPRING=$(curl 127.0.0.1:8081/actuator/health) - if [ -n "$REQUEST_SPRING" ]; then - echo ">>> spring blue health check success !" - break; - fi - done; + # green이 실행중이면 blue up + # EXIST_BLUE 변수가 비어있는지 확인 + if [ -z "$EXIST_REDIS" ]; then + # 로그 파일(/home/ubuntu/deploy.log)에 "blue up - blue 배포 : port:8081"이라는 내용을 추가 + echo "blue 배포 시작 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log - # /home/ubuntu/deploy.log: 로그 파일에 "green 중단 시작"이라는 내용을 추가 - echo "green 중단 시작 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log + # docker-compose.prod.yml 파일을 사용하여 prod-blue, redis 서비스를 빌드하고 실행 + sudo docker-compose -f docker-compose.prod.yml up redis ${DOCKER_APP_NAME}-blue -d --build - # docker-compose.green.yml 파일을 사용하여 spring-green 프로젝트의 컨테이너를 중지 - sudo docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yml down + while [ 1 = 1 ]; do + echo ">>> spring blue health check ..." + sleep 3 + REQUEST_SPRING=$(curl 127.0.0.1:8081/actuator/health) + if [ -n "$REQUEST_SPRING" ]; then + echo ">>> spring blue health check success !" + break; + fi + done; - # 사용하지 않는 이미지 삭제 - sudo docker image prune -af + elif [ -z "$EXIST_BLUE" ]; then - echo "green 중단 완료 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log + # 로그 파일(/home/ubuntu/deploy.log)에 "blue up - blue 배포 : port:8081"이라는 내용을 추가 + echo "blue 배포 시작 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log -# blue가 실행중이면 green up -else - echo "green 배포 시작 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log - sudo docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yml up -d --build + # docker-compose.prod.yml 파일을 사용하여 prod-blue 서비스를 빌드하고 실행 + sudo docker-compose -f docker-compose.prod.yml up ${DOCKER_APP_NAME}-blue -d --build while [ 1 = 1 ]; do - echo ">>> spring green health check ..." + echo ">>> spring blue health check ..." sleep 3 - REQUEST_SPRING=$(curl 127.0.0.1:8082/actuator/health) + REQUEST_SPRING=$(curl 127.0.0.1:8081/actuator/health) if [ -n "$REQUEST_SPRING" ]; then - echo ">>> spring green health check success !" + echo ">>> spring blue health check success !" break; fi done; - echo "blue 중단 시작 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log - sudo docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml down - sudo docker image prune -af + # /home/ubuntu/deploy.log: 로그 파일에 "green 중단 시작"이라는 내용을 추가 + echo "green 중단 시작 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log - echo "blue 중단 완료 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log + # docker-compose.prod.yml 파일을 사용하여 spring-app-green 서비스 중지 + sudo docker-compose -f docker-compose.prod.yml down ${DOCKER_APP_NAME}-green -fi - echo "배포 종료 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log + # 사용하지 않는 이미지 삭제 + sudo docker image prune -af + + echo "green 중단 완료 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log + + # blue가 실행중이면 green up + else + echo "green 배포 시작 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log + sudo docker-compose -f docker-compose.prod.yml up ${DOCKER_APP_NAME}-green -d --build - echo "===================== 배포 완료 =====================" >> /home/ubuntu/deploy.log - echo >> /home/ubuntu/deploy.log \ No newline at end of file + while [ 1 = 1 ]; do + echo ">>> spring green health check ..." + sleep 3 + REQUEST_SPRING=$(curl 127.0.0.1:8082/actuator/health) + if [ -n "$REQUEST_SPRING" ]; then + echo ">>> spring green health check success !" + break; + fi + done; + + echo "blue 중단 시작 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log + # docker-compose.prod.yml 파일을 사용하여 spring-app-blue 서비스 중지 + sudo docker-compose -f docker-compose.prod.yml down ${DOCKER_APP_NAME}-blue + + sudo docker image prune -af + + echo "blue 중단 완료 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log + + fi + echo "배포 종료 : $(date +%Y)-$(date +%m)-$(date +%d) $(date +%H):$(date +%M):$(date +%S)" >> /home/ubuntu/deploy.log + + echo "===================== 배포 완료 =====================" >> /home/ubuntu/deploy.log + echo >> /home/ubuntu/deploy.log +#만약 배포가 개발이라면 +else + cd /home/ubuntu/app/dev + # 현재 실행 중인 컨테이너를 중지하고 제거합니다 + docker-compose -f docker-compose.dev.yml down + # 새 이미지를 빌드하고 컨테이너를 백그라운드에서 실행합니다 + docker-compose -f docker-compose.dev.yml up -d --build + while [ 1 = 1 ]; do + echo ">>> spring green health check ..." + sleep 3 + REQUEST_SPRING=$(curl 127.0.0.1:1821/actuator/health) + if [ -n "$REQUEST_SPRING" ]; then + echo ">>> spring green health check success !" + break; + fi + done; + sudo docker image prune -af +fi \ No newline at end of file