-
Notifications
You must be signed in to change notification settings - Fork 0
/
deploy.sh
81 lines (67 loc) · 2.36 KB
/
deploy.sh
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
#!/bin/bash
DOCKER_IMAGE=$1
APPLICATION=habitpay
LOG_FILE="/var/log/habitpay/deploy.log"
HEALTHCHECK_RESULT=
log() {
local msg="$1"
printf '[INFO] %s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$msg"
}
log_error() {
local msg="$1"
printf '[ERROR] %s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$msg" >&2
}
healthcheck() {
local container=$1
local max_retries=12
local sleep_time=5
local retries=0
while [ $retries -lt $max_retries ]; do
local is_container_running=$(docker container inspect $container --format='{{json .State.Status}}' | sed 's/"//g')
if [ "$is_container_running" = "running" ]; then
log "$container is running."
HEALTHCHECK_RESULT=0
return 0
else
log "$container is not running. Retrying..."
sleep $sleep_time
retries=$((retries+1))
fi
done
HEALTHCHECK_RESULT=1
return 1
}
switch() {
local current=$1
local target=$2
log "$current is running. Turning on $target container..."
yq -i ".services.$target.image = \"$DOCKER_IMAGE\"" docker-compose.yaml
sudo docker compose -p $APPLICATION up "$target" -d
healthcheck "$target"
log "HEALTHCHECK_RESULT: $HEALTHCHECK_RESULT"
if [ $HEALTHCHECK_RESULT -eq 0 ]; then
log "$target is running."
else
log_error "Failed to run $target. Exiting..."
exit 1
fi
}
main() {
log "Docker image: $DOCKER_IMAGE"
local is_application_running=$(sudo docker compose -p $APPLICATION ls | grep running | sed 's/.*/true/')
local is_blue_running=$(docker container inspect blue --format='{{json .State.Status}}' | sed 's/"//g')
local is_green_running=$(docker container inspect green --format='{{json .State.Status}}' | sed 's/"//g')
if [ "$is_application_running" = "true" ] && [ "$is_blue_running" = "running" ]; then
log "Blue container is running."
switch blue green
elif [ "$is_application_running" = "true" ] && [ "$is_green_running" = "running" ]; then
log "Green container is running."
switch green blue
else
log "Application is not running. Starting the application...(with blue container)"
yq -i ".services.blue.image = \"$DOCKER_IMAGE\"" docker-compose.yaml
sudo docker compose -p $APPLICATION up blue -d
healthcheck blue
fi
}
main >> "$LOG_FILE" 2>&1