10 - 12차배포 (#387) #27
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 워크 플로우 이름 | |
| name: CD - Docker Build & Deploy to EC2 | |
| # main 브랜치에 push 발생 시 자동 실행 | |
| on: | |
| push: | |
| branches: [ main ] | |
| # GitHub Actions 에서 제공하는 최신 Ubuntu 이미지 실행 | |
| jobs: | |
| deploy: | |
| runs-on: ubuntu-latest | |
| steps: | |
| # 현재 브랜치의 코드를 GitHub Actions 실행 환경에 clone | |
| - name: Checkout source | |
| uses: actions/checkout@v4 | |
| # cs25-service/Dockerfile 기준으로 Docker 이미지 빌드 | |
| # baekjonghyun/cs25-service:latest 라는 이름으로 태깅 | |
| - name: Build Docker image (cs25-service) | |
| run: docker build -t baekjonghyun/cs25-service:latest -f cs25-service/Dockerfile . | |
| # DockerHub 로그인 | |
| - name: Login to DockerHub | |
| uses: docker/login-action@v3 | |
| with: | |
| # 로그인 인증 정보 | |
| username: baekjonghyun | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| # 빌드한 이미지를 DockerHub로 업로드하여 EC2에서 Pull 가능하게 함 | |
| - name: Push Docker image to DockerHub | |
| run: docker push baekjonghyun/cs25-service:latest | |
| # GitHub Secrets 로부터 환경 변수를 읽어 .env 파일 생성 | |
| - name: Create .env from secrets | |
| run: | | |
| echo "MYSQL_USERNAME=${{ secrets.MYSQL_USERNAME }}" >> .env | |
| echo "MYSQL_PASSWORD=${{ secrets.MYSQL_PASSWORD }}" >> .env | |
| echo "REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}" >> .env | |
| echo "JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }}" >> .env | |
| echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }}" >> .env | |
| echo "KAKAO_ID=${{ secrets.KAKAO_ID }}" >> .env | |
| echo "KAKAO_SECRET=${{ secrets.KAKAO_SECRET }}" >> .env | |
| echo "GH_ID=${{ secrets.GH_ID }}" >> .env | |
| echo "GH_SECRET=${{ secrets.GH_SECRET }}" >> .env | |
| echo "NAVER_ID=${{ secrets.NAVER_ID }}" >> .env | |
| echo "NAVER_SECRET=${{ secrets.NAVER_SECRET }}" >> .env | |
| echo "GMAIL_PASSWORD=${{ secrets.GMAIL_PASSWORD }}" >> .env | |
| echo "MYSQL_HOST=${{ secrets.MYSQL_HOST }}" >> .env | |
| echo "REDIS_HOST=${{ secrets.REDIS_HOST }}" >> .env | |
| echo "CHROMA_HOST=${{ secrets.CHROMA_HOST }}" >> .env | |
| echo "FRONT_END_URI=${{ secrets.FRONT_END_URI }}" >> .env | |
| echo "CLAUDE_API_KEY=${{ secrets.CLAUDE_API_KEY }}" >> .env | |
| echo "AWS_SES_ACCESS_KEY=${{ secrets.AWS_SES_ACCESS_KEY }}" >> .env | |
| echo "AWS_SES_SECRET_KEY=${{ secrets.AWS_SES_SECRET_KEY }}" >> .env | |
| echo "BRAVE_API_KEY=${{ secrets.BRAVE_API_KEY }}" >> .env | |
| # EC2 접속 후 .env 파일 업로드 | |
| - name: Upload .env to EC2 | |
| uses: appleboy/scp-action@v0.1.4 | |
| with: | |
| host: ${{ secrets.SSH_HOST }} | |
| username: ec2-user | |
| key: ${{ secrets.SSH_KEY }} | |
| source: ".env" | |
| target: "/home/ec2-user/app" | |
| # EC2 서버에 SSH 접속 후 Docker 배포 자동화 스크립트 실행 | |
| - name: Deploy on EC2 (Blue-Green 무중단 배포) | |
| uses: appleboy/ssh-action@v1.2.0 | |
| with: | |
| host: ${{ secrets.SSH_HOST }} | |
| username: ec2-user | |
| key: ${{ secrets.SSH_KEY }} | |
| script: | | |
| cd /home/ec2-user/app | |
| echo "[1] 현재 nginx가 사용하는 포트 확인" | |
| CURRENT_PORT=$(grep -o 'proxy_pass http://localhost:[0-9]*;' /etc/nginx/conf.d/api.conf | grep -o '[0-9]*') | |
| if [ "$CURRENT_PORT" = "8080" ]; then | |
| NEW_PORT=8081 | |
| OLD_CONTAINER=cs25-8080 | |
| else | |
| NEW_PORT=8080 | |
| OLD_CONTAINER=cs25-8081 | |
| fi | |
| echo "[2] 새로운 포트($NEW_PORT)로 컨테이너 실행" | |
| docker pull baekjonghyun/cs25-service:latest | |
| docker run -d \ | |
| --name cs25-$NEW_PORT \ | |
| --env-file .env \ | |
| -p $NEW_PORT:8080 \ | |
| baekjonghyun/cs25-service:latest | |
| echo "[3] nginx 설정 포트 교체 및 reload" | |
| sudo sed -i "s/$CURRENT_PORT/$NEW_PORT/" /etc/nginx/conf.d/api.conf | |
| sudo nginx -t && sudo nginx -s reload | |
| echo "[4] 이전 컨테이너 종료 및 삭제" | |
| docker stop $OLD_CONTAINER || echo "No previous container" | |
| docker rm $OLD_CONTAINER || echo "No previous container" | |
| echo "[✔] 무중단 배포 완료! 현재 포트: $NEW_PORT" | |
| # echo "[1] Pull latest Docker image" | |
| # # 사용하지 않는 이미지 정리 | |
| # docker image prune | |
| # # DockerHub 에서 최신 이미지 pull | |
| # docker pull baekjonghyun/cs25-service:latest | |
| # | |
| # echo "[2] Stop and remove old container" | |
| # # 기존 컨테이너 중지 | |
| # docker stop cs25 || echo "No running container to stop" | |
| # # 기존 컨테이너 삭제 | |
| # docker rm cs25 || echo "No container to remove" | |
| # | |
| # echo "[3] Run new container" | |
| # # 새 이미지를 기반으로 cs25 컨테이너 실행 | |
| # # 백그라운드 모드 | |
| # docker run -d \ | |
| # --name cs25 \ | |
| # # 환경 변수 .env 파일 사용 | |
| # --env-file .env \ | |
| # # 포트 매핑 | |
| # -p 8080:8080 \ | |
| # baekjonghyun/cs25-service:latest | |
| # | |
| # echo "[✔] Deployment completed successfully" |