Skript dev_deploy.sh
Automaticky generovaná dokumentace skriptu scripts/dev_deploy.sh.
1#!/bin/bash
2###########
3#### SCRIPT: DEPLOYMENT for LOCAL DEV
4#### PARAMS: See -h
5###########
6
7#USAGE: local deployment for development purposes
8#secrets from files, NOT managed by docker as in swarm mode
9
10# ------ !!!! ----------
11SKIP_ALL_CHECKS=1 #IF CHNAGED TO 1 then all MANUAL CHECKS, ie questions during script runtime are disabled!
12# ------ !!!! ----------
13
14ask_continue () {
15 while true; do
16
17 read -p "$1 ==> (y or n): " input
18 case $input in
19 [yY]*)
20 echo '---Continuing!'
21 break
22 ;;
23 [nN]*)
24 echo '***So do THAT, exiting!'
25 exit 1
26 ;;
27 *)
28 echo '***Invalid input' >&2
29 esac
30 done
31}
32
33create_if_absent() {
34 FILE="$1"
35 if [ ! -f $FILE ]; then
36 mkdir -p $(dirname ${FILE})
37 touch $FILE
38 echo ${default_pass} > $FILE
39 fi
40}
41
42
43# Helper functions
44echo_dec ()
45{
46 echo "---------------------------------------"
47 echo "--> ${1}"
48 echo "---------------------------------------"
49}
50
51er () {
52 echo_dec "${1}"
53 eval "${1}"
54 ret_val=$?
55 echo "....................."
56 echo ">> DONE: ${1} with status: ${ret_val}"
57 return $ret_val
58}
59
60
61check_file_exist ()
62{
63 FILE="$1"
64 if [ -f $FILE ]; then
65 echo_dec "File $FILE exists."
66 else
67 echo_dec "!!! File $FILE does not exist. Exiting!"
68 exit 1
69fi
70}
71
72
73detect_secrets ()
74{
75 if [ -f "${1}" ]; then
76 echo_dec "Secret detected ${1}"
77 else
78 echo_dec "Secret ${1} is missing!"
79 ask_continue "Do you want ${1} to be automatically created with default password content, i.e ${default_pass}, if not => EXIT ? "
80 create_if_absent ${1}
81 fi
82}
83
84run_default ()
85{
86 service_name="${1}"
87 echo_dec "${msg_default_case}"
88 if [ ${SKIP_ALL_CHECKS} -eq 0 ]; then
89 ask_continue "Do you want to continue with DEFAULT CASE? "
90 fi
91
92 echo_dec "Build and run without DB restore, selected or all services."
93 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}"
94}
95
96Help ()
97{
98 cat <<EOF
99 !!!MUST BE RUN from REPOSIOTRY root like =>
100 usage: ./scrips/${script_name} [-r [db_restore_file]|b <service_name | "">|x|d|s <service_name | "">|e <service_name | "">|t <service_name | "">],
101 ---
102 PURPOSE: manage deployment/run of local development docker images build from GIT repository using docker compose.
103 ---
104 DEFAULT CASE:
105 #just call the script without any args => build and run all services without DB restore
106 >> $./scripts/${script_name}
107
108 Examples on options:
109 1) build and run all services with restore db => (db backup files available at 192.168.254.30:/home/amcr/db_backups/*.tar)
110 $./scripts/${script_name} -d -r <path_to_db_file>/<db_backup_file.tar>
111
112 2) build and run selected or all services only =>
113 #build and run all services
114 $./scripts/${script_name} -b ""
115 or
116 #build and run only db service
117 $./scripts/${script_name} -b db
118 ---
119 3) down and prune all services (remove all containers): $./scripts/${script_name} -x
120 4) down all services: $./scripts/${script_name} -d
121 ---
122 5) start all or selected service (previously stopped)=>
123 #start all services
124 $./scripts/${script_name} -s ""
125 or
126 #start only service web
127 $./scripts/${script_name} -s web
128 6) stop all or selected service: $./scripts/${script_name} -e <service_name | "">
129 7) restart all or selected service: $./scripts/${script_name} -t <service_name | "">
130 -----
131 Summnary:
132 -h help
133 -r build and run all service with DB restored from <file_name>
134 -b build and run selected or all services
135 -x compose down + image prune + container prune all services
136 -d down all services
137 -s start all or selected service (previously stopped)
138 -e stop all or selected service
139 -t restart all or selected service
140
141EOF
142}
143
144echo_dec "# DEPLOYMENT in from git repository for LOCAL DEVELOPMENT "
145script_name=$(basename ${0})
146
147# INPUTS
148project_name="local"
149compose_dev="docker-compose-dev-local-db.yml"
150default_pass="123456"
151
152# !!! Need to be CHECKED UPDATED ACCORDINGLY to point to the same secrets as in docker-compose-dev-local-db.yml
153secret_local_db_pass="secrets/local_db_pass"
154secret_pg_admin_pass="secrets/pg_admin_pass"
155secret_db_conf="./secrets.alternative.json"
156secret_mail_conf="./secrets_mail_client.json"
157
158msg_fail_build="!! Command not successfull"
159msg_success="Deployed locally ---> APPLICATION ACCESSIBLE on: port 8000"
160msg_default_case="DISCLAIMER: DEFAULT CASE assumes that db data ALREADYY exists in docker named-volume ${project_name}_db_dev_data (see compose file definition for volumes and db service) if NOT then local DB will be blank!"
161
162# Detect missing secrets
163detect_secrets ${secret_local_db_pass}
164detect_secrets ${secret_pg_admin_pass}
165check_file_exist ${secret_db_conf}
166check_file_exist ${secret_mail_conf}
167
168# GET git revision
169git_changes=$(git diff-index $(git write-tree) | wc -l)
170
171if [ ${git_changes} -gt 0 ]; then
172 version_suffix="_with_uncommitted"
173fi
174
175git_last_tag=$(git describe --tags)
176git_revision="${git_last_tag}_$(git rev-parse --short HEAD | head -c 8)${version_suffix}"
177git_ref=$(git symbolic-ref HEAD)
178echo_dec "REVISION: ${git_revision}"
179export REVISION_REPO=${git_revision}
180
181# BUILD docker commands syntax
182cmd_docker_base="docker-compose -p ${project_name} -f ${compose_dev}"
183cmd_docker_build_args="--pull --build-arg VERSION_APP=${git_revision} --build-arg TAG_APP=${git_ref} --build-arg DB_BACKUP_FILE="
184
185cmd_docker_build="${cmd_docker_base} build ${cmd_docker_build_args}"
186cmd_docker_up="${cmd_docker_base} up -d"
187cmd_docker_start="${cmd_docker_base} start"
188cmd_docker_stop="${cmd_docker_base} stop"
189cmd_docker_restart="${cmd_docker_base} restart"
190cmd_docker_down="${cmd_docker_base} down --remove-orphans"
191
192while getopts "hr:b:xds:e:t:" option; do
193 option_passed="yes"
194 case ${option} in
195 h) # display Help
196 Help
197 exit;;
198 r) # build and run with restore DB locally from file
199 in_file="${OPTARG}"
200 restore_db="yes"
201 er "${cmd_docker_base} rm -f --stop db"
202 er "docker volume rm ${project_name}_db_dev_data"
203 echo_dec "Build and run all services with DB Restore: ${in_file}"
204 er "${cmd_docker_build}${in_file}" && er "${cmd_docker_up}" && echo_dec "${msg_success} project ${project_name}" || echo_dec ${msg_fail_build}
205 ;;
206 b) build_and_run="yes"
207 service_name="${OPTARG}"
208 run_default $service_name
209 ;;
210 x) down_prune="yes"
211 echo_dec "Compose goes down + image prune + container prune (all!!! stopped containers removed)"
212 er "${cmd_docker_down}"
213 er "yes | docker image prune"
214 er "yes | docker container prune"
215 ;;
216 d) down_only="yes"
217 echo_dec "Compose goes only down."
218 er "${cmd_docker_down}" && echo_dec "Compose goes down." || echo_dec "Compose down FAILED!.."
219 ;;
220 s) start_services="yes"
221 service_name="${OPTARG}"
222 er "${cmd_docker_start} ${service_name}" && echo_dec "Compose containers started / project prefix ${project_name} ${service_name}" && echo_dec ${msg_success} || echo_dec "${msg_fail_build}"
223 ;;
224 e) stop_services="yes"
225 service_name="${OPTARG}"
226 er "${cmd_docker_stop} ${service_name}" && echo_dec "Compose containers stopped / project prefix ${project_name} ${service_name}" && echo_dec ${msg_success} || echo_dec ${msg_fail_build}
227 ;;
228 t) restart_services="yes"
229 service_name="${OPTARG}"
230 er "${cmd_docker_restart} ${service_name}" && echo_dec "Compose containers going to be restarted / project prefix ${project_name} ${service_name}" && echo_dec ${msg_success} || echo_dec ${msg_fail_build}
231 ;;
232 \?) # Invalid option
233 echo_dec "Error: Invalid option ${option}"
234 exit;;
235 esac
236done
237
238if [ -z ${option_passed+x} ]; then
239 echo_dec "NO option passed so default case is called."
240 run_default
241fi
242docker ps
243
244unset REVISION_REPO
245exit 0