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