Skript git_prod_deploy.sh
Automaticky generovaná dokumentace skriptu scripts/git_prod_deploy.sh.
1#!/bin/bash
2###########
3#### SCRIPT: DEPLOYMENT and BUILD from GIT REPO with existing DB, production setup (i.e. proxy)
4#### PARAMS: See -h
5###########
6
7#USAGE: ad-hoc deployment from source code on current branch,
8# secrets from file, not managed by docker as in swarm mode
9# deploy git compose for production (compose mode only!)
10
11# Helper functions
12ask_continue () {
13 while true; do
14
15 read -p "$1 ==> (y or n): " input
16 case $input in
17 [yY]*)
18 echo '---Continuing!'
19 break
20 ;;
21 [nN]*)
22 echo '***So do THAT, exiting!'
23 exit 1
24 ;;
25 *)
26 echo '***Invalid input' >&2
27 esac
28 done
29}
30
31Help ()
32{
33 cat <<EOF
34 !!!MUST BE RUN from REPOSIOTRY root like =>
35 usage: ./scrips/${script_name} [-b <service_name | "">|s <service_name | "">|e <service_name | "">|t <service_name | "">|d],
36 ---
37 PURPOSE: manage deployment/run of production docker images build from GIT repository for AIS CR project using docker compose.
38 ----
39 DEFAULT CASE:
40 #just call the script without any args => build and run all services.
41 $./scripts/${script_name}
42
43 Examples on options:
44 1) build and run selected or all services only =>
45 #build and run all services
46 $./scripts/${script_name} -b ""
47 or
48 #build and run only web service
49 $./scripts/${script_name} -b web
50
51 ---
52 2) start all or selected service (previously stopped)=>
53 #start all services
54 $./scripts/${script_name} -s ""
55 or
56 #start only service web
57 $./scripts/${script_name} -s web
58 3) stop all or selected service: $./scripts/${script_name} -e <service_name | "">
59 4) restart all or selected service: $./scripts/${script_name} -t <service_name | "">
60 -----
61 5) down all services: $./scripts/${script_name} -d
62 -----
63 Summnary:
64 -h help
65 -b build and run selected or all services
66 -s start all or selected service (previously stopped)
67 -e stop all or selected service
68 -t restart all or selected service
69 -d down all service
70
71EOF
72}
73
74echo_dec ()
75{
76 echo "---------------------------------------"
77 echo "--> $1"
78 echo "---------------------------------------"
79}
80
81er () {
82 echo_dec "${1}"
83 eval "${1}"
84 ret_val=$?
85 echo "....................."
86 echo ">> DONE: ${1} with status: ${ret_val}"
87 return $ret_val
88}
89
90check_file_exist ()
91{
92 FILE="$1"
93 if [ -f $FILE ]; then
94 echo_dec "File $FILE exists."
95 else
96 echo_dec "!!! File $FILE does not exist. Exiting!"
97 exit 1
98fi
99}
100
101run_default ()
102{
103 service_name="${1}"
104 echo_dec "${msg_default_case}"
105 ask_continue "Do you want to continue with DEFAULT CASE? "
106 echo_dec "Build and run without DB restore, selected or all services."
107 er "${cmd_docker_build} ${service_name}" && er "${cmd_docker_up} ${service_name}" && echo_dec "${msg_success} project ${project_name} ${service_name}" || echo_dec "${msg_fail_build} ${service_name}"
108}
109
110
111#LOGGING
112log_dir="logs/git_prod_deploy"
113start_time=$(date +%Y%m%dT%H%M%S)
114log_file="${start_time}_git_prod-deployment.log"
115mkdir -p ${log_dir}
116
117#REDIRECT to log
118exec > >(tee "${log_dir}/${log_file}" )
119exec 2>&1
120
121echo_dec "# DEPLOYMENT in from GIT Repository, i.e. building docker images from source code"
122script_name=$(basename ${0})
123
124# INPUTS
125project_name="git_aiscr"
126compose_prod="git_docker-compose.yml"
127compose_proxy="git_docker-compose-proxy.yml"
128compose_override="git_docker-compose.override.yml"
129
130# !!! Need to be CHECKED UPDATED ACCORDINGLY to point to the same secrets as in docker-compose-dev-local-db.yml
131secret_db_conf_1="./secrets.json"
132secret_db_conf_2="./secrets.alternative.json"
133secret_mail_conf="./secrets_mail_client.json"
134
135check_file_exist ${secret_mail_conf}
136
137msg_fail_build="!! Build not successfull"
138msg_success="DEPLOYED from GIT REPO ---> APPLICATION ACCESSIBLE on: port 8081"
139msg_default_case="DISCLAIMER: DEFAULT CASE will ONLY build and RUN ALL services again."
140
141
142# DO SOME MANUAL CHECKS of deployment steps by ASKING questions (can be skipped by providing arbitrary command-line argument to the script)
143if [ -z "$1" ]; then
144
145 ask_continue "1.Did you APPLY MANUAL migrations to target DB (if relevant)?"
146 ask_continue "2.Did you CONFIGURE secrets to point to desired DB location (using ${secret_db_conf_1} or ${secret_db_conf_2} file in repo root) ?"
147
148 # SELECT OPTION for deployment
149 while true; do
150
151 read -p "DB secrets PROD (using ${secret_db_conf_1}) / ALTERNATIVE (using overriding compose with ${secret_db_conf_2}) ==> (p/a): " db_secret
152 case $db_secret in
153 [pP]*)
154 echo "--Using PRODUCTION ${secret_db_conf_1}"
155 check_file_exist ${secret_db_conf_1}
156 break
157 ;;
158 [aA]*)
159 echo "--Using ALTERNATIVE ${secret_db_conf_2}"
160 do_override="yes"
161 check_file_exist ${secret_db_conf_2}
162 break
163 ;;
164 *)
165 echo '***Invalid input' >&2
166 esac
167 done
168
169fi
170
171# GET git revision
172git_changes=$(git diff-index $(git write-tree) | wc -l)
173
174if [ ${git_changes} -gt 0 ]; then
175 version_suffix="_with_uncommitted"
176fi
177
178git_last_tag=$(git describe --tags)
179git_revision="${git_last_tag}_$(git rev-parse --short HEAD | head -c 8)${version_suffix}"
180
181echo_dec "REVISION: ${git_revision}"
182export REVISION_REPO=${git_revision}
183
184# BUILD docker commands syntax
185cmd_docker_base="docker-compose -p ${project_name} -f ${compose_prod} -f ${compose_proxy}"
186cmd_docker_base_alt="${cmd_docker_base} -f ${compose_override}"
187cmd_docker_build_args="--pull --build-arg VERSION_APP=${git_revision} --build-arg TAG_APP=$(git symbolic-ref HEAD)"
188
189
190 if [ -z "${do_override}" ]; then
191 cmd_docker_base_used=${cmd_docker_base}
192 else
193 cmd_docker_base_used=${cmd_docker_base_alt}
194fi
195
196# BUILD docker commands syntax
197 cmd_docker_build="${cmd_docker_base_used} build ${cmd_docker_build_args}"
198 cmd_docker_up="${cmd_docker_base_used} up -d"
199 cmd_docker_down="${cmd_docker_base_used} down --remove-orphans"
200
201while getopts "hb:s:e:t:d" option; do
202 option_passed="yes"
203 case ${option} in
204 h) # display Help
205 Help
206 exit;;
207 b) #build and run
208 service_name="${OPTARG}"
209 run_default ${service_name}
210 ;;
211 s) # start
212 service_name="${OPTARG}"
213 er "${cmd_docker_base_used} start ${service_name}"
214 ;;
215 e) # stop
216 service_name="${OPTARG}"
217 er "${cmd_docker_base_used} stop ${service_name}"
218 ;;
219 t) # restart
220 service_name="${OPTARG}"
221 er "${cmd_docker_base_used} restart ${service_name}"
222 ;;
223 d) #compose down
224 er "${cmd_docker_down}"
225 er "docker image prune && docker container prune"
226 ;;
227 \?) # Invalid option
228 echo "Error: Invalid option ${option}"
229 exit;;
230 esac
231done
232
233# RUN docker compose [default option]
234if [ -z ${option_passed+x} ]; then
235 echo_dec "NO option passed so default case is called,"
236 run_default
237fi
238
239
240docker ps
241unset REVISION_REPO
242exit 0