Merge pull request #553 from code-zero-to-one/refactor/folder-structure #490
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
| # 도커 허브에 이미지 push 후 서버에 배포하는 방식 (25.10.30 이후) | |
| name: Front Test Server (Develop) | |
| on: | |
| push: | |
| branches: | |
| - develop # develop 브랜치에 push가 발생하면 실행 | |
| jobs: | |
| build-and-push-image: # 도커 이미지 빌드 및 도커 허브 push | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: ENV 파일 생성 | |
| run: | | |
| echo "NEXT_PUBLIC_API_BASE_URL=${{ secrets.NEXT_PUBLIC_API_BASE_URL }}" > .env | |
| echo "NEXT_PUBLIC_KAKAO_CLIENT_ID=${{ secrets.NEXT_PUBLIC_KAKAO_CLIENT_ID }}" >> .env | |
| echo "NEXT_PUBLIC_GOOGLE_CLIENT_ID=${{ secrets.NEXT_PUBLIC_GOOGLE_CLIENT_ID }}" >> .env | |
| echo "NEXT_PUBLIC_CLARITY_PROJECT_ID=${{ secrets.NEXT_PUBLIC_CLARITY_PROJECT_ID }}" >> .env | |
| echo "NEXT_PUBLIC_GOOGLE_SHEETS_ID=${{ secrets.NEXT_PUBLIC_GOOGLE_SHEETS_ID }}" >> .env | |
| echo "GOOGLE_SERVICE_ACCOUNT_EMAIL=${{ secrets.GOOGLE_SERVICE_ACCOUNT_EMAIL }}" >> .env | |
| echo "GOOGLE_PRIVATE_KEY=${{ secrets.GOOGLE_PRIVATE_KEY }}" >> .env | |
| echo "NEXT_PUBLIC_STRAPI_URL=${{ secrets.NEXT_PUBLIC_STRAPI_URL }}" >> .env | |
| echo "NEXT_PUBLIC_TOSS_CLIENT_KEY=${{ secrets.NEXT_PUBLIC_TOSS_CLIENT_KEY }}" >> .env | |
| - name: DockerHub 로그인 | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_PASSWORD }} | |
| - name: Docker 이미지 빌드 및 push | |
| run: | | |
| docker build -f Dockerfile.dev -t zerooneitkr/frontend:develop . | |
| docker push zerooneitkr/frontend:develop | |
| deploy-image-to-server: # 도커 허브 pull 후 서버에 배포 | |
| runs-on: ubuntu-latest | |
| needs: build-and-push-image | |
| steps: | |
| - name: Install cloudflared | |
| run: | | |
| echo "Downloading cloudflared..." | |
| curl -L --output /tmp/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 | |
| chmod +x /tmp/cloudflared | |
| sudo mv /tmp/cloudflared /usr/local/bin/cloudflared | |
| cloudflared --version || echo "cloudflared 설치 확인 실패" | |
| - name: Install sshpass | |
| run: | | |
| echo "Installing sshpass..." | |
| sudo apt-get update -qq | |
| sudo apt-get install -y -qq sshpass | |
| sshpass -V || echo "sshpass 설치 확인 실패" | |
| - name: Setup SSH config | |
| run: | | |
| echo "Setting up SSH config..." | |
| mkdir -p ~/.ssh | |
| chmod 700 ~/.ssh | |
| # known_hosts 설정 (실패해도 계속 진행) | |
| ssh-keyscan -p 24 -H ssh.zeroone.it.kr >> ~/.ssh/known_hosts 2>&1 || echo "ssh-keyscan 실패 (계속 진행)" | |
| # SSH config 생성 | |
| cat > ~/.ssh/config << 'SSHCONFIG' | |
| Host ssh.zeroone.it.kr | |
| HostName ssh.zeroone.it.kr | |
| User zero_one | |
| Port 24 | |
| ProxyCommand cloudflared access ssh --hostname %h | |
| StrictHostKeyChecking no | |
| SSHCONFIG | |
| chmod 600 ~/.ssh/config | |
| echo "SSH config 생성 완료" | |
| cat ~/.ssh/config | |
| - name: 서버 배포 | |
| run: | | |
| SUDO_PASSWORD='${{ secrets.SSH_PASSWORD }}' | |
| sshpass -p '${{ secrets.SSH_PASSWORD }}' ssh ssh.zeroone.it.kr bash << EOF | |
| set -e | |
| echo "사용하지 않는 컨테이너, 이미지, 네트워크 정리 중 (볼륨제외)..." | |
| echo "$SUDO_PASSWORD" | sudo -S docker stop frontend-dev || true | |
| echo "$SUDO_PASSWORD" | sudo -S docker rm frontend-dev || true | |
| echo "$SUDO_PASSWORD" | sudo -S docker system prune -a -f | |
| # 여기다 도커 컴포즈 파일 갖다놓았기 때문임 | |
| cd ~/front/study-platform-client-dev || { | |
| echo "디렉토리가 없습니다. 생성합니다..." | |
| mkdir -p ~/front/study-platform-client-dev | |
| cd ~/front/study-platform-client-dev | |
| } | |
| echo ".env 파일 생성 (런타임에 필요한 모든 환경변수 포함)" | |
| echo "NEXT_PUBLIC_API_BASE_URL=${{ secrets.NEXT_PUBLIC_API_BASE_URL }}" > .env | |
| echo "NEXT_PUBLIC_KAKAO_CLIENT_ID=${{ secrets.NEXT_PUBLIC_KAKAO_CLIENT_ID }}" >> .env | |
| echo "NEXT_PUBLIC_GOOGLE_CLIENT_ID=${{ secrets.NEXT_PUBLIC_GOOGLE_CLIENT_ID }}" >> .env | |
| echo "NEXT_PUBLIC_CLARITY_PROJECT_ID=${{ secrets.NEXT_PUBLIC_CLARITY_PROJECT_ID }}" >> .env | |
| echo "NEXT_PUBLIC_GOOGLE_SHEETS_ID=${{ secrets.NEXT_PUBLIC_GOOGLE_SHEETS_ID }}" >> .env | |
| echo "NEXT_PUBLIC_STRAPI_URL=${{ secrets.NEXT_PUBLIC_STRAPI_URL }}" >> .env | |
| echo "NEXT_PUBLIC_TOSS_CLIENT_KEY=${{ secrets.NEXT_PUBLIC_TOSS_CLIENT_KEY }}" >> .env | |
| echo "GOOGLE_SERVICE_ACCOUNT_EMAIL=${{ secrets.GOOGLE_SERVICE_ACCOUNT_EMAIL }}" >> .env | |
| echo "GOOGLE_PRIVATE_KEY=${{ secrets.GOOGLE_PRIVATE_KEY }}" >> .env | |
| echo "docker-compose.dev.yml 파일 생성" | |
| echo "services:" > docker-compose.dev.yml | |
| echo " frontend:" >> docker-compose.dev.yml | |
| echo " container_name: frontend-dev" >> docker-compose.dev.yml | |
| echo " image: zerooneitkr/frontend:develop" >> docker-compose.dev.yml | |
| echo " ports:" >> docker-compose.dev.yml | |
| echo " - '14855:14855'" >> docker-compose.dev.yml | |
| echo " env_file:" >> docker-compose.dev.yml | |
| echo " - .env" >> docker-compose.dev.yml | |
| echo " restart: unless-stopped" >> docker-compose.dev.yml | |
| echo "기존 컨테이너 완전 제거" | |
| echo "$SUDO_PASSWORD" | sudo -S docker compose -f docker-compose.dev.yml down || true | |
| echo "$SUDO_PASSWORD" | sudo -S docker stop frontend-dev || true | |
| echo "$SUDO_PASSWORD" | sudo -S docker rm frontend-dev || true | |
| echo "도커 이미지 pull" | |
| echo "$SUDO_PASSWORD" | sudo -S docker pull zerooneitkr/frontend:develop | |
| echo "도커 컴포즈 재시작" | |
| echo "$SUDO_PASSWORD" | sudo -S docker compose -f docker-compose.dev.yml up -d | |
| echo "테스트 서버 배포 완료" | |
| EOF |