-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy.sh
More file actions
189 lines (164 loc) · 4.7 KB
/
deploy.sh
File metadata and controls
189 lines (164 loc) · 4.7 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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#!/bin/bash
set -e
# =============================================
# IPAM 통합 배포 스크립트
# 사용법: ./deploy.sh [up|down|restart|rebuild|logs|status|test]
# 옵션:
# --secondary 이중화 서버(Server B) 모드
# --skip-test rebuild 시 테스트 건너뛰기
# =============================================
SKIP_TEST=false
SECONDARY=false
cd "$(dirname "$0")"
# 색상
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 옵션 파싱
for arg in "$@"; do
case $arg in
--skip-test) SKIP_TEST=true ;;
--secondary) SECONDARY=true ;;
esac
done
# 모드에 따른 파일 설정
if [ "$SECONDARY" = true ]; then
COMPOSE_FILE="docker-compose.secondary.yml"
ENV_FILE=".env.secondary"
MODE="Secondary (Server B)"
else
COMPOSE_FILE="docker-compose.yml"
ENV_FILE=".env.prod"
MODE="Primary (Server A)"
fi
COMPOSE_CMD="docker compose -f $COMPOSE_FILE --env-file $ENV_FILE"
# .env 파일 확인
check_env() {
if [ ! -f "$ENV_FILE" ]; then
log_error "$ENV_FILE 파일이 없습니다."
exit 1
fi
log_info "모드: $MODE"
}
# 서비스 시작 (빌드 없이)
cmd_up() {
check_env
log_info "서비스 시작..."
$COMPOSE_CMD up -d
cmd_status
}
# 테스트 실행
cmd_test() {
log_info "테스트 실행..."
if ./gradlew test --no-daemon; then
log_info "모든 테스트 통과"
return 0
else
log_error "테스트 실패"
return 1
fi
}
# 서비스 시작 (재빌드)
cmd_rebuild() {
check_env
log_info "Git pull (backend)..."
git pull origin main || log_warn "backend git pull 실패 (계속 진행)"
log_info "Git pull (frontend)..."
(cd ../ipam-frontend && git pull origin main) || log_warn "frontend git pull 실패 (계속 진행)"
# 테스트 실행 (--skip-test 옵션이 없으면)
if [ "$SKIP_TEST" = false ]; then
cmd_test || { log_error "테스트 실패로 배포 중단"; exit 1; }
else
log_warn "테스트 건너뛰기 (--skip-test)"
fi
log_info "이미지 빌드 및 서비스 시작..."
$COMPOSE_CMD up -d --build
cmd_status
}
# 서비스 중지
cmd_down() {
check_env
log_info "서비스 중지..."
$COMPOSE_CMD down
}
# 서비스 재시작
cmd_restart() {
check_env
log_info "서비스 재시작..."
$COMPOSE_CMD restart
cmd_status
}
# 로그 확인
cmd_logs() {
check_env
$COMPOSE_CMD logs -f
}
# 상태 확인
cmd_status() {
echo ""
$COMPOSE_CMD ps
echo ""
log_info "=== 헬스체크 ==="
# Frontend 체크
if curl -sf http://localhost:80/ > /dev/null 2>&1; then
echo -e "Frontend: ${GREEN}Healthy${NC}"
else
echo -e "Frontend: ${RED}Unhealthy${NC} (시작 중일 수 있음)"
fi
# Backend 체크 (Frontend 프록시 경유)
if curl -sf http://localhost:80/api/actuator/health > /dev/null 2>&1; then
echo -e "Backend: ${GREEN}Healthy${NC}"
else
echo -e "Backend: ${RED}Unhealthy${NC} (시작 중일 수 있음)"
fi
# Redis 체크
REDIS_CONTAINER="ipam-redis"
[ "$SECONDARY" = true ] && REDIS_CONTAINER="ipam-redis-replica"
if docker exec $REDIS_CONTAINER redis-cli ping > /dev/null 2>&1; then
echo -e "Redis: ${GREEN}Healthy${NC}"
else
echo -e "Redis: ${RED}Unhealthy${NC}"
fi
# Sentinel 체크
SENTINEL_CONTAINER="ipam-sentinel"
[ "$SECONDARY" = true ] && SENTINEL_CONTAINER="ipam-sentinel-1"
if docker exec $SENTINEL_CONTAINER redis-cli -p 26379 ping > /dev/null 2>&1; then
echo -e "Sentinel: ${GREEN}Healthy${NC}"
else
echo -e "Sentinel: ${RED}Unhealthy${NC}"
fi
echo ""
}
# 사용법
usage() {
echo "Usage: $0 [command] [options]"
echo ""
echo "Commands:"
echo " up 서비스 시작 (기존 이미지 사용)"
echo " rebuild git pull + 테스트 + 이미지 재빌드 + 시작"
echo " down 서비스 중지"
echo " restart 서비스 재시작"
echo " logs 로그 확인 (Ctrl+C로 종료)"
echo " status 서비스 상태 확인"
echo " test 테스트 실행"
echo ""
echo "Options:"
echo " --secondary 이중화 서버(Server B) 모드"
echo " --skip-test rebuild 시 테스트 건너뛰기"
exit 1
}
# 메인
case ${1:-help} in
up) cmd_up ;;
rebuild) cmd_rebuild ;;
down) cmd_down ;;
restart) cmd_restart ;;
logs) cmd_logs ;;
status) cmd_status ;;
test) cmd_test ;;
*) usage ;;
esac