2020-06-30 16:11:12 +02:00
#!/usr/bin/env bash
parseparams( )
{
COMMANDS = ( )
SCRIPTS = ( )
ENVIRONMENTS = ( )
while getopts "hys:c:e:" opt; do
case " ${ opt } " in
y)
Y = true
; ;
s)
SCRIPTS += ( " $OPTARG " )
; ;
c)
COMMANDS += ( " $OPTARG " )
; ;
e)
ENVIRONMENTS += ( " $OPTARG " )
; ;
*)
usage
; ;
esac
done
shift $(( OPTIND-1))
}
yq( ) {
2021-03-01 10:13:48 +01:00
docker run --rm -i -v " ${ PWD } :/workdir " mikefarah/yq:4 " $@ "
2020-06-30 16:11:12 +02:00
}
2020-10-21 13:13:13 +02:00
jq( ) {
docker run --rm -i -v " ${ PWD } :/data " imega/jq " $@ "
}
2020-06-30 16:11:12 +02:00
config( )
{
echo -ne "Checking user... "
if [ [ " $( whoami) " != "root" ] ] && ! groups | grep docker
then
echo "Please add your current user to the docker group OR run this script as root."
echo "current user is not allowed to use docker, exiting..."
exit 1
fi
2021-03-01 10:13:48 +01:00
SERVICE = " $( yq eval '.services.*.image | select(. == "sleede/fab-manager*") | path | .[-2]' docker-compose.yml) "
2020-06-30 16:11:12 +02:00
YES_ALL = ${ Y :- false }
# COMMANDS, SCRIPTS and ENVIRONMENTS are set by parseparams
}
2020-10-06 14:18:35 +02:00
# compare versions utilities
# https://stackoverflow.com/a/4024263/1039377
verlte( ) {
[ " $1 " = " $( echo -e " $1 \n $2 " | sort -V | head -n1) " ]
}
verlt( ) {
[ " $1 " = " $2 " ] && return 1 || verlte " $1 " " $2 "
}
version_error( )
{
2020-10-06 14:31:36 +02:00
printf "\n\nYou must upgrade Fab-manager to %s first.\nPlease refer to https://github.com/sleede/fab-manager/blob/master/doc/production_readme.md#update-fab-manager for instructions\n" " $1 " 1>& 2
2020-10-06 14:18:35 +02:00
exit 3
}
version_check( )
{
2021-03-09 09:25:27 +01:00
VERSION = $( docker-compose exec -T " $SERVICE " cat .fabmanager-version 2>/dev/null)
2020-10-06 14:18:35 +02:00
if [ [ $? = 1 ] ] ; then
2021-03-01 11:40:29 +01:00
VERSION = $( docker-compose exec -T " $SERVICE " cat package.json | jq -r '.version' )
2020-10-06 14:18:35 +02:00
fi
if verlt " $VERSION " 2.8.3; then
version_error "v2.8.3"
elif verlt " $VERSION " 3.1.2; then
version_error "v3.1.2"
elif verlt " $VERSION " 4.0.4; then
version_error "v4.0.4"
2020-10-23 11:56:21 +02:00
elif verlt " $VERSION " 4.4.6; then
version_error "v4.4.6"
2020-10-06 14:18:35 +02:00
fi
}
2020-06-30 16:11:12 +02:00
add_environments( )
{
for ENV in " ${ ENVIRONMENTS [@] } " ; do
if [ [ " $ENV " = ~ ^[ A-Z0-9_] += .*$ ] ] ; then
2021-03-24 11:04:59 +01:00
printf "\e[91m::\e[0m \e[1mInserting variable %s..\e[0m.\n" " $ENV "
2020-06-30 16:11:12 +02:00
printf "# added on %s\n%s\n" " $( date +%Y-%m-%d\ %R) " " $ENV " >> "config/env"
else
echo " Ignoring invalid option: -e $ENV . Given value is not valid environment variable, please see https://huit.re/environment-doc "
fi
done
}
2021-03-08 17:08:07 +01:00
clean_env_file( )
{
# docker run --env-file does not support whitespaces in the environment variables so we must clean the file
sed -ri 's/^([A-Z0-9_]+)\s*=\s*(.*)$/\1=\2/g' ./config/env
}
2020-10-23 12:15:25 +02:00
compile_assets( )
2020-10-21 10:44:43 +02:00
{
2021-03-01 10:13:48 +01:00
IMAGE = $( yq eval '.services.*.image | select(. == "sleede/fab-manager*")' docker-compose.yml)
mapfile -t COMPOSE_ENVS < <( yq eval " .services. $SERVICE .environment " docker-compose.yml)
2020-10-21 13:13:13 +02:00
ENV_ARGS = $( for i in " ${ COMPOSE_ENVS [@] } " ; do sed 's/: /=/g;s/^/-e /g' <<< " $i " ; done )
PG_ID = $( docker-compose ps -q postgres)
2020-10-23 12:15:25 +02:00
if [ [ " $PG_ID " = "" ] ] ; then
printf "PostgreSQL container is not running, unable to compile the assets\nExiting..."
exit 1
fi
2020-10-21 13:13:13 +02:00
PG_NET_ID = $( docker inspect " $PG_ID " -f "{{json .NetworkSettings.Networks }}" | jq -r '.[] .NetworkID' )
2021-03-08 17:08:07 +01:00
clean_env_file
2020-10-21 13:13:13 +02:00
# shellcheck disable=SC2068
docker run --rm --env-file ./config/env ${ ENV_ARGS [@] } --link " $PG_ID " --net " $PG_NET_ID " -v " ${ PWD } /public/new_packs:/usr/src/app/public/packs " " $IMAGE " bundle exec rake assets:precompile
2020-10-21 10:44:43 +02:00
docker-compose down
rm -rf public/packs
mv public/new_packs public/packs
}
2020-06-30 16:11:12 +02:00
upgrade( )
{
[ [ " $YES_ALL " = "true" ] ] && confirm = "y" || read -rp "Proceed with the upgrade? (Y/n) " confirm </dev/tty
if [ [ " $confirm " = = "n" ] ] ; then exit 2; fi
docker-compose pull " $SERVICE "
if [ [ $? = 1 ] ] ; then
printf "An error occured, detected service name: %s\nExiting..." , " $SERVICE "
exit 1
fi
2020-10-21 15:18:39 +02:00
BRANCH = 'master'
2021-03-01 10:13:48 +01:00
if yq eval '.services.*.image | select(. == "sleede/fab-manager*")' docker-compose.yml | grep -q ':dev' ; then BRANCH = 'dev' ; fi
2020-06-30 16:11:12 +02:00
for SCRIPT in " ${ SCRIPTS [@] } " ; do
2021-03-24 11:04:59 +01:00
printf "\e[91m::\e[0m \e[1mRunning script %s from branch %s...\e[0m\n" " $SCRIPT " " $BRANCH "
2020-07-01 10:52:43 +02:00
if [ [ " $YES_ALL " = "true" ] ] ; then
2020-10-21 15:18:39 +02:00
\c url -sSL " https://raw.githubusercontent.com/sleede/fab-manager/ $BRANCH /scripts/ $SCRIPT .sh " | bash -s -- -y
2020-07-01 10:52:43 +02:00
else
2020-10-21 15:18:39 +02:00
\c url -sSL " https://raw.githubusercontent.com/sleede/fab-manager/ $BRANCH /scripts/ $SCRIPT .sh " | bash
2020-07-01 10:52:43 +02:00
fi
2020-06-30 16:11:12 +02:00
done
2020-10-23 12:15:25 +02:00
compile_assets
docker-compose run --rm " $SERVICE " bundle exec rake db:migrate
2020-06-30 16:11:12 +02:00
for COMMAND in " ${ COMMANDS [@] } " ; do
2021-03-24 11:04:59 +01:00
printf "\e[91m::\e[0m \e[1mRunning command %s...\e[0m\n" " $COMMAND "
2020-06-30 16:11:12 +02:00
docker-compose run --rm " $SERVICE " bundle exec " $COMMAND "
done
docker-compose up -d
docker ps
}
clean( )
{
2021-03-24 11:04:59 +01:00
echo -e "\e[91m::\e[0m \e[1mCurrent disk usage:\e[0m"
2020-06-30 16:11:12 +02:00
df -h /
[ [ " $YES_ALL " = "true" ] ] && confirm = "y" || read -rp "Clean previous docker images? (y/N) " confirm </dev/tty
if [ [ " $confirm " = = "y" ] ] ; then
/usr/bin/docker image prune -f
fi
}
usage( )
{
printf " Usage: %s [OPTIONS]
Options:
-h Print this message and quit
-y Answer yes to all questions
-c <string> Provides additional upgrade command, run in the context of the app ( TODO DEPLOY)
-s <string> Executes a remote script ( TODO DEPOY)
-e <string> Adds the environment variable to config/env\n " " $( basename " $0 " ) " 1>&2
exit 1
}
function trap_ctrlc( )
{
echo "Ctrl^C, exiting..."
exit 2
}
proceed( )
{
trap "trap_ctrlc" 2 # SIGINT
parseparams " $@ "
config
2020-10-06 14:18:35 +02:00
version_check
2020-06-30 16:11:12 +02:00
add_environments
upgrade
clean
}
proceed " $@ "