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