CI/CD - Prod #32
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: CI/CD - Prod | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| branch: | |
| description: 'Branch to deploy' | |
| required: true | |
| default: 'main' | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v3 | |
| with: | |
| ref: ${{ github.event.inputs.branch }} | |
| - name: Setup Java | |
| uses: actions/setup-java@v3 | |
| with: | |
| distribution: 'temurin' | |
| java-version: '21' | |
| - name: Grant execute permission for gradlew | |
| run: chmod +x ./gradlew | |
| - name: Generate application.yml | |
| run: | | |
| mkdir -p ./src/main/resources | |
| echo "${{ secrets.CD_APPLICATION_PROD }}" > ./src/main/resources/application.yml | |
| cat ./src/main/resources/application.yml | |
| - name: Generate environment-specific yml files | |
| run: | | |
| echo "${{ secrets.CD_APPLICATION_AWS }}" > ./src/main/resources/application-aws.yml | |
| echo "${{ secrets.CD_APPLICATION_NAVER }}" > ./src/main/resources/application-naver.yml | |
| echo "${{ secrets.CD_APPLICATION_OATH }}" > ./src/main/resources/application-oath.yml | |
| - name: Build Project | |
| run: ./gradlew clean build -x test | |
| - name: Logout (cleanup) | |
| run: docker logout || true | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: docker.io | |
| username: ${{ secrets.DOCKER_USERNAME }} | |
| password: ${{ secrets.DOCKER_PASSWORD }} | |
| logout: true | |
| - name: Build Docker Image | |
| run: docker build -t sumin317/spoony-prod:latest . | |
| - name: Publish Image to Docker Hub | |
| run: docker push sumin317/spoony-prod:latest | |
| deploy: | |
| needs: build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Install SSH Client | |
| run: sudo apt-get update && sudo apt-get install -y openssh-client | |
| - name: Create SSH Key File | |
| run: | | |
| echo "${{ secrets.PROD_EC2_SSH_KEY }}" > ssh_key.pem | |
| echo "${{ secrets.PROD_EC2_PUBLIC_IP }}" > ec2_public_ip.txt | |
| chmod 600 ssh_key.pem | |
| - name: SSH into EC2 and Deploy | |
| run: | | |
| EC2_PUBLIC_IP=$(cat ec2_public_ip.txt) | |
| ssh -o StrictHostKeyChecking=no -i ssh_key.pem ubuntu@$EC2_PUBLIC_IP << 'EOF' | |
| echo "🔍 현재 실행 중인 포트 확인" | |
| ACTIVE_PORT=$(sudo docker ps --format "{{.Ports}}" | grep -oE '0.0.0.0:808[12]' | cut -d':' -f2 | cut -d'-' -f1) | |
| echo "🌐 Docker 네트워크 확인" | |
| if ! sudo docker network inspect spoony-network > /dev/null 2>&1; then | |
| echo "➕ 네트워크 spoony-network 생성" | |
| sudo docker network create spoony-network | |
| fi | |
| echo "🧰 Redis 실행 확인" | |
| REDIS_EXISTS=$(sudo docker ps -a -q -f name=^redis$) | |
| REDIS_RUNNING=$(sudo docker ps -q -f name=^redis$) | |
| if [ -n "$REDIS_EXISTS" ]; then | |
| echo "🧰 Redis 인스턴스 존재" | |
| if [ -n "$REDIS_RUNNING" ]; then | |
| echo "🧰 Redis 실행 중" | |
| sudo docker network connect spoony-network redis || true | |
| else | |
| echo "🧰 Redis 실행 필요, 실행 시작" | |
| sudo docker start redis | |
| sudo docker network connect spoony-network redis || true | |
| fi | |
| else | |
| echo "🧰 Redis 인스턴스 없음" | |
| sudo docker rm -f redis || true | |
| sudo docker run -d --name redis --network spoony-network redis | |
| fi | |
| echo "📂 로그 디렉터리 준비" | |
| sudo mkdir -p /var/log/spoony/archive | |
| sudo chmod 775 /var/log/spoony /var/log/spoony/archive | |
| echo "📥 최신 이미지 가져오기" | |
| sudo docker pull sumin317/spoony-prod:latest | |
| echo "🗑️ 이전 컨테이너 제거" | |
| sudo docker rm -f spoony-prod-container || true | |
| echo "🔧 새로운 컨테이너 실행" | |
| sudo docker run -d \ | |
| -p 8080:8080 \ | |
| -p 9292:9292 \ | |
| --name spoony-prod-container \ | |
| --network spoony-network \ | |
| -v /var/log/spoony:/app/app/logs \ | |
| sumin317/spoony-prod | |
| echo "🛠 Nginx 설정 포트 고정" | |
| sudo sed -i "s/127.0.0.1:808[12]/127.0.0.1:8080/" /etc/nginx/sites-available/default | |
| sudo nginx -t && sudo nginx -s reload | |
| echo "✅ prod 서버 배포 완료" | |
| echo "🧹 Docker 정리" | |
| sudo docker image prune -f | |
| sudo docker container prune -f | |
| sudo docker volume prune -f | |
| EOF |