Skip to content

Instantly share code, notes, and snippets.

@yaredc
Last active October 14, 2019 19:28
Show Gist options
  • Save yaredc/fed40c0e9ea2c2c360354427a63d5bb7 to your computer and use it in GitHub Desktop.
Save yaredc/fed40c0e9ea2c2c360354427a63d5bb7 to your computer and use it in GitHub Desktop.
#!/bin/sh
set -e
###########################################################
#DEFINE ALL GLOBAL INDEPENDENT HELPER FUNCTIONS
###########################################################
l() {
LEVEL="INFO"
if [ -n "$2" ]; then
LEVEL="$2"
fi
LEVEL="$(echo "$LEVEL" | tr [a-z] [A-Z])"
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [$LEVEL] $1"
}
task_dispatch_with_arguments() {
if [ "$#" = 1 ] && [ "$1" != "dispatch_with_arguments" ]; then
l "Trying to run task \"task_$1\"..."
"task_$1"
return
fi
REQUESTED_TASK="$1"
shift
if [ -n "$1" ] && [ "$1" != "dispatch_with_arguments" ]; then
l "Trying to run task \"task_$REQUESTED_TASK\"..."
"task_$REQUESTED_TASK" "$@"
fi
}
###########################################################
#DEFINE ALL NEEDED VARS, SHOW SOME INFO
###########################################################
ENVIRONMENT="development"
DIR_ROOT="$(pwd)"
DIR_CONFIG="$DIR_ROOT"/.config/"$ENVIRONMENT"
TIMESTAMP="$(date +%s)"
TIMESTAMP_NICE=$(date +"%Y-%m-%d %H:%M:%S")
DIR_DIST="$DIR_ROOT/dist"
TAR_DIST="$DIR_ROOT/dist.$ENVIRONMENT.$TIMESTAMP.tar.gz"
DIR_DOCROOT="/var/www/docroot"
DIR_DEPLOY_ROOT="/var/deploy"
DIR_DEPLOY="$DIR_DEPLOY_ROOT/$TIMESTAMP"
GITHUB_TOKEN="TOKEN"
DOCROOT="/var/www/html"
l "Environment is set to \"$ENVIRONMENT\""
l "Root directory is set to \"$DIR_ROOT\""
if [ ! -d "$DIR_CONFIG" ]; then
l "$DIR_CONFIG does not exist." "ERROR"
return
fi
###########################################################
#DEFINE ALL TASKS
###########################################################
task_build() {
BUILD_NECESSARY=0
FILE_LIMIT="$DIR_ROOT/.build"
touch -d "-5 minutes" "$FILE_LIMIT"
for FILE in "$DIR_ROOT"/.docker/*; do
if [ "$FILE" -nt "$FILE_LIMIT" ]; then
BUILD_NECESSARY=1
fi
done
rm -f "$FILE_LIMIT"
if [ -z "$(docker image ls -q app/nginx:production)" ]; then
BUILD_NECESSARY=1
fi
if [ -z "$(docker image ls -q app/php:production)" ]; then
BUILD_NECESSARY=1
fi
if [ -z "$(docker image ls -q app/node:production)" ]; then
BUILD_NECESSARY=1
fi
if [ -z "$(docker image ls -q app/php:development)" ]; then
BUILD_NECESSARY=1
fi
if [ "$BUILD_NECESSARY" = 1 ]; then
docker build -t "app/nginx:production" -f ".docker/nginx.production.dockerfile" .
docker build -t "app/php:production" -f ".docker/php.production.dockerfile" .
docker build -t "app/node:production" -f ".docker/node.production.dockerfile" .
docker build -t "app/php:development" -f ".docker/php.development.dockerfile" .
else
l "Build is not necessary."
fi
}
task_up() {
if [ -z "$(docker-compose ps -q)" ]; then
docker-compose up -d
docker-compose exec php composer config --global github-oauth.github.com "$GITHUB_TOKEN"
else
l "docker-compose daemon is already running."
fi
}
task_restart() {
if [ -n "$(docker-compose ps -q)" ]; then
docker-compose restart
else
l "docker-compose daemon is down."
fi
}
task_down() {
if [ -n "$(docker-compose ps -q)" ]; then
docker-compose down
else
l "docker-compose daemon is down."
fi
}
task_install() {
task_up
docker-compose exec php composer --no-interaction validate
docker-compose run node npm install
if [ "$ENVIRONMENT" = "development" ]; then
docker-compose exec php composer --no-interaction install
docker-compose run node npm run build:dev
else
docker-compose exec php composer --no-suggest --no-dev --classmap-authoritative --optimize-autoloader --no-interaction install
docker-compose run node npm run build:prod
fi
cp -rf "$DIR_CONFIG"/* "$DIR_ROOT"
}
task_update() {
task_up
docker-compose run node npm update
if [ "$ENVIRONMENT" = "development" ]; then
docker-compose exec php composer --no-interaction update
docker-compose run node npm run build:dev
else
docker-compose exec php composer --no-suggest --no-dev --classmap-authoritative --optimize-autoloader --no-interaction update
docker-compose run node npm run build:prod
fi
cp -rf "$DIR_CONFIG"/* "$DIR_ROOT"
}
task_uninstall() {
task_up
docker-compose exec php rm -rf ./vendor
docker-compose run node rm -rf ./node_modules
}
task_clean() {
task_up
docker-compose exec php rm -rf ./data
docker-compose exec php mkdir -p ./data/cache
find "$DIR_ROOT" -maxdepth 1 -name "dist*tar.gz" -type f -delete
rm -rf "$DIR_DIST"
}
task_tar() {
task_install
task_clean
rm -rf "$DIR_DIST"
mkdir -p "$DIR_DIST"
rsync -az --exclude-from ".buildignore" -- "$DIR_ROOT/" "$DIR_DIST"
tar -C "$DIR_DIST" -zcf "$TAR_DIST" .
rm -rf "$DIR_DIST"
}
task_deploy() {
task_install
task_clean
mkdir -p "$DIR_DEPLOY"
rsync -az --exclude-from ".buildignore" -- "$DIR_ROOT/" "$DIR_DEPLOY"
if [ -e "$DIR_DOCROOT" ]; then
rm -f "$DIR_DOCROOT"
fi
ln -sf "$DIR_DEPLOY" "$DIR_DOCROOT"
l "\"$DIR_DOCROOT\" now symlinks to \"$DIR_DEPLOY\""
}
task_slim() {
FOUND_PATHS=$(ls -1drtA "$DIR_DEPLOY_ROOT"/*)
COUNT=$(echo "$FOUND_PATHS" | wc -l)
l "Total $COUNT paths found."
LIMIT=$((COUNT - 3))
if [ "$LIMIT" -lt 1 ]; then
l "Nothing to remove."
return
fi
INDEX=0
for FOUND_PATH in $FOUND_PATHS; do
if [ "$INDEX" = "$LIMIT" ]; then
break
fi
l "Removing \"$FOUND_PATH\"..."
if [ -d "$FOUND_PATH" ]; then
rm -rf "$FOUND_PATH"
else
rm -f "$FOUND_PATH"
fi
INDEX=$((INDEX + 1))
done
}
###########################################################
#DISPATCH REQUESTED TASK
###########################################################
if [ $# -eq 0 ] || [ "$1" = "help" ]; then
l "No task requested. Available tasks are: build up down install update uninstall clean tar deploy slim"
l "Usage example: sh run.sh build"
exit 0
fi
task_dispatch_with_arguments "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment