-
Notifications
You must be signed in to change notification settings - Fork 0
153 lines (132 loc) · 5 KB
/
deploy.yml
File metadata and controls
153 lines (132 loc) · 5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# =============================================================================
# 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