feature: 다국어 URL 기반 SEO와 메타데이터 동기화 적용 #8
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
| # ============================================================================= | |
| # Frontend Deploy Pipeline | |
| # ============================================================================= | |
| # | |
| # 브랜치 전략: main (운영) ← develop (개발) ← feature/* (기능) | |
| # | |
| # 실행 시점: | |
| # - main 브랜치 push 시: 운영 서버 배포 | |
| # - v* 태그 push 시: 버전 태그된 이미지 생성 + 운영 서버 배포 | |
| # - 수동 실행 (workflow_dispatch) | |
| # | |
| # 파이프라인 흐름: | |
| # Docker Build → Docker Hub Push → SSH 배포 → Health Check | |
| # | |
| # 이미지 태그 전략: | |
| # - latest: 항상 최신 main 브랜치 (운영 서버에서 사용) | |
| # - {commit-sha}: 각 커밋별 이미지 (롤백용) | |
| # - v1.0.0: 릴리즈 버전 (태그 push 시) | |
| # | |
| # ============================================================================= | |
| name: Frontend Deploy | |
| on: | |
| push: | |
| branches: | |
| - main # main push 시 운영 배포 | |
| tags: | |
| - 'v*' # v1.0.0 같은 태그 push 시 버전 이미지 생성 | |
| # Actions 탭에서 수동 실행 가능 | |
| workflow_dispatch: | |
| env: | |
| IMAGE_NAME: git-ranker-client | |
| jobs: | |
| # ========================================= | |
| # Job 1: Docker 이미지 빌드 및 Push | |
| # ========================================= | |
| docker: | |
| name: Build & Push Docker Image | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| # Docker Buildx 설정 | |
| # - 멀티플랫폼 빌드 지원 (linux/amd64, linux/arm64) | |
| # - 캐시 레이어 최적화 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| # Docker Hub 인증 | |
| # - secrets.DOCKERHUB_USERNAME: Docker Hub 사용자명 | |
| # - secrets.DOCKERHUB_TOKEN: Docker Hub Access Token | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| # 이미지 태그 자동 생성 | |
| # - main push: latest + commit SHA | |
| # - tag push: 버전 태그 (v1.0.0) | |
| - name: Extract metadata for Docker | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }} | |
| tags: | | |
| type=raw,value=latest,enable={{is_default_branch}} | |
| type=sha,prefix= | |
| type=semver,pattern={{version}} | |
| # Docker 이미지 빌드 및 Push | |
| - name: Build and Push Docker image | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| push: true | |
| tags: ${{ steps.meta.outputs.tags }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| build-args: | | |
| NEXT_PUBLIC_API_URL=${{ secrets.NEXT_PUBLIC_API_URL }} | |
| NEXT_PUBLIC_BASE_URL=${{ secrets.NEXT_PUBLIC_BASE_URL }} | |
| # GitHub Actions 캐시로 빌드 속도 향상 | |
| cache-from: type=gha | |
| cache-to: type=gha,mode=max | |
| # ========================================= | |
| # Job 2: 운영 서버 배포 | |
| # ========================================= | |
| deploy: | |
| name: Deploy to Production | |
| runs-on: ubuntu-latest | |
| needs: docker | |
| # main 브랜치 push 또는 수동 실행 시에만 배포 | |
| # (태그 push는 이미지만 생성하고 배포는 선택) | |
| if: github.ref == 'refs/heads/main' || github.event_name == 'workflow_dispatch' | |
| steps: | |
| # SSH로 서버 접속하여 배포 스크립트 실행 | |
| - name: Deploy via SSH | |
| uses: appleboy/ssh-action@v1.0.3 | |
| with: | |
| host: ${{ secrets.SERVER_HOST }} | |
| username: ${{ secrets.SERVER_USER }} | |
| key: ${{ secrets.SERVER_SSH_KEY }} | |
| script: | | |
| echo "==========================================" | |
| echo "Frontend Deployment Started" | |
| echo "Time: $(date)" | |
| echo "==========================================" | |
| # 작업 디렉토리 이동 | |
| cd ${{ secrets.DEPLOY_PATH }} | |
| # 최신 이미지 Pull | |
| echo "[1/3] Pulling latest image..." | |
| docker compose pull git-ranker-client | |
| # 컨테이너 재시작 | |
| echo "[2/3] Restarting container..." | |
| docker compose up -d --no-deps --force-recreate git-ranker-client | |
| # 사용하지 않는 이미지 정리 | |
| echo "[3/3] Cleaning up old images..." | |
| docker image prune -f | |
| echo "==========================================" | |
| echo "Frontend Deployment Completed!" | |
| echo "==========================================" | |
| # 배포 후 헬스 체크 | |
| - name: Health Check | |
| run: | | |
| echo "Waiting for application to start..." | |
| sleep 30 | |
| for i in {1..5}; do | |
| if curl -sf "${{ secrets.FRONTEND_URL }}" > /dev/null 2>&1; then | |
| echo "Health check passed!" | |
| exit 0 | |
| fi | |
| echo "Attempt $i/5 failed, retrying in 10s..." | |
| sleep 10 | |
| done | |
| echo "Health check failed!" | |
| exit 1 |