forked from Clokey-dev/clokey-server-legacy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy.sh
More file actions
119 lines (92 loc) · 2.82 KB
/
deploy.sh
File metadata and controls
119 lines (92 loc) · 2.82 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
#!/bin/bash
cd /home/ubuntu/cicd
APP_NAME="clokey"
# NGINX 설정 관련
NGINX_CONF_PATH="/etc/nginx"
BLUE_CONF="blue.conf"
GREEN_CONF="green.conf"
DEFAULT_CONF="nginx.conf"
MAX_RETRIES=3
# 활성화된 서비스 확인 및 스위칭 대상 결정
determine_target() {
if docker-compose -f docker-compose.yml ps | grep -q "app_blue.*Up"; then
TARGET="green"
OLD="blue"
elif docker-compose -f docker-compose.yml ps | grep -q "app_green.*Up"; then
TARGET="blue"
OLD="green"
else
TARGET="blue" # 첫 실행 시 기본값
OLD="none"
fi
echo "TARGET: $TARGET"
echo "OLD: $OLD"
}
# 헬스체크 실패 시 롤백 처리
health_check() {
local URL=$1
local RETRIES=0
local ORIGINAL_TARGET=$TARGET # 원래 TARGET 값을 저장
while [ $RETRIES -lt $MAX_RETRIES ]; do
echo "Checking service at $URL... (attempt: $((RETRIES + 1)))"
sleep 3
# 현재 실행 중인 컨테이너 확인
CONTAINER_RUNNING=$(docker ps --filter "name=app_$TARGET" --format '{{.Names}}')
if [ "$CONTAINER_RUNNING" = "app_$TARGET" ]; then
echo "$TARGET container is running."
return 0 # 컨테이너가 실행 중이라면 헬스체크 성공
else
echo "$TARGET container is not running."
fi
RETRIES=$((RETRIES + 1))
done
# 헬스체크 실패 시 롤백 처리
echo "Health check failed after $MAX_RETRIES attempts."
echo "Rolling back to the original target: $ORIGINAL_TARGET"
# TARGET을 원래 값으로 롤백
TARGET=$ORIGINAL_TARGET
echo "Rolled back TARGET: $TARGET"
# 로그 파일에 실패 기록
echo "Failed health check for $TARGET container" > /home/ubuntu/cicd/health_check_failure.log
# docker-compose down 대신 실패 기록 후 종료
exit 1
}
# NGINX 설정 스위칭 함수
switch_nginx_conf() {
if [ "$TARGET" = "blue" ]; then
sudo cp "${NGINX_CONF_PATH}/${BLUE_CONF}" "${NGINX_CONF_PATH}/${DEFAULT_CONF}"
else
sudo cp "${NGINX_CONF_PATH}/${GREEN_CONF}" "${NGINX_CONF_PATH}/${DEFAULT_CONF}"
fi
echo "Reloading NGINX configuration..."
nginx -s reload
}
# 이전 컨테이너 종료 함수
down_old_container() {
if [ "$OLD" != "none" ]; then
echo "Stopping old container: $OLD"
sudo docker stop "app_$OLD"
fi
}
# 메인 실행 로직
main() {
determine_target
# 대상 컨테이너 실행
echo "Starting $TARGET container..."
docker-compose -f docker-compose.yml up -d "app_$TARGET"
# 헬스체크
if [ "$TARGET" = "blue" ]; then
health_check "http://127.0.0.1:8080/actuator/health"
else
health_check "http://127.0.0.1:8081/actuator/health"
fi
# NGINX 설정 스위칭
switch_nginx_conf
# 이전 컨테이너 종료
down_old_container
echo "Deployment to $TARGET completed successfully!"
echo "Cleaning up dangling Docker images..."
docker image prune -f
}
# 스크립트 실행
main