Skip to content

Instantly share code, notes, and snippets.

@matteocaberlotto
Last active April 20, 2022 14:51
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save matteocaberlotto/7174875 to your computer and use it in GitHub Desktop.
Save matteocaberlotto/7174875 to your computer and use it in GitHub Desktop.
Deploy symfony 2+ applications (multiple environment)
#!/bin/bash
# include config
# config example below:
#
#
# Example deploy_config.sh
#
# dev_env() {
# PHPBIN="/usr/local/bin/php"
# SERVER_IP="192.168.1.1"
# SERVER_PORT="22"
# SERVER_USER="apache"
# HTTPDOCS_PATH="/var/www/vhosts/domain.com/httpdocs"
# ASSETIC_ENV="--env=prod"
# CERTIFICATE="certificate.pem"
# SKIP_SCHEMA_UPDATE="true"
# SKIP_ASSETIC_DUMP="true"
# SKIP_ASSETS_INSTALL="true"
# SKIP_FILE_TOUCH="true"
# }
#
# Usage: ./deploy-symfony.sh dev
#
execute_rsync() {
if [ "$DRY_RUN" == "N" ]; then
RSYNC_DRYRUN=
else
RSYNC_DRYRUN=--dry-run
fi
echo rsync -vaz --delete "$RSYNC_DRYRUN" -e "$BASE_SSH" --stats --progress --exclude-from 'rsync.exclude' . "$SERVER_USER"@"$SERVER_IP":"$HTTPDOCS_PATH"
rsync -vaz --delete "$RSYNC_DRYRUN" -e "$BASE_SSH" --stats --progress --exclude-from 'rsync.exclude' . "$SERVER_USER"@"$SERVER_IP":"$HTTPDOCS_PATH"
}
execute_schema_update() {
if [ "$SKIP_SCHEMA_UPDATE" == "true" ]; then
echo "SKIPPED."
return
fi
if [ "$DRY_RUN" == "N" ]; then
SCHEMA_UPDATE=--force
else
SCHEMA_UPDATE=--dump-sql
fi
echo "$BASE_SSH" "$SERVER_USER@$SERVER_IP $PHPBIN $CONSOLE_PATH doctrine:schema:update --env=prod $SCHEMA_UPDATE"
$BASE_SSH "$SERVER_USER"@"$SERVER_IP" "$PHPBIN $CONSOLE_PATH doctrine:schema:update --env=prod $SCHEMA_UPDATE"
}
execute_clear_cache() {
if [ "$DRY_RUN" == "N" ]; then
echo "$BASE_SSH" "$SERVER_USER"@"$SERVER_IP" rm -rf "$CACHE_PATH/cache/*"
$BASE_SSH "$SERVER_USER"@"$SERVER_IP" rm -rf "$CACHE_PATH/cache/*"
else
skip_task "execute_clear_cache"
fi
}
execute_assets_install() {
if [ "$SKIP_ASSETS_INSTALL" == "true" ]; then
echo "SKIPPED."
return
fi
if [ "$DRY_RUN" == "N" ]; then
echo "$BASE_SSH" "$SERVER_USER"@"$SERVER_IP" "$PHPBIN" $CONSOLE_PATH assets:install "$HTTPDOCS_PATH"/web --env=prod --symlink
$BASE_SSH "$SERVER_USER"@"$SERVER_IP" "$PHPBIN" $CONSOLE_PATH assets:install "$HTTPDOCS_PATH"/web --env=prod --symlink
else
skip_task "execute_assets_install"
fi
}
execute_assetic_dump() {
if [ "$SKIP_ASSETIC_DUMP" == "true" ]; then
echo "SKIPPED."
return
fi
if [ "$DRY_RUN" == "N" ]; then
echo "$BASE_SSH" "$SERVER_USER"@"$SERVER_IP" "$PHPBIN" $CONSOLE_PATH assetic:dump "$ASSETIC_ENV"
$BASE_SSH "$SERVER_USER"@"$SERVER_IP" "$PHPBIN" $CONSOLE_PATH assetic:dump "$ASSETIC_ENV"
else
skip_task "execute_assetic_dump"
fi
}
execute_file_touch() {
if [ "$SKIP_FILE_TOUCH" == "true" ]; then
echo "SKIPPED."
return
fi
if [ "$DRY_RUN" == "N" ]; then
echo "$BASE_SSH" "$SERVER_USER"@"$SERVER_IP" touch "$HTTPDOCS_PATH"/app/config/parameters.yml
$BASE_SSH "$SERVER_USER"@"$SERVER_IP" touch "$HTTPDOCS_PATH"/app/config/parameters.yml
else
skip_task "execute_file_touch"
fi
}
color_output() {
echo -e "\033[$2m$1\033[0m"
}
execute_task() {
echo ""
color_output "-> started '$1'" "$START_TASK_COLOR"
"$1"
color_output "<- finished '$1'" "$END_TASK_COLOR"
}
skip_task() {
echo "[SKIPPED] $1"
}
title_label() {
color_output "$1" "$START_END_SCRIPT_COLOR"
}
fn_exists()
{
[ `type -t $1`"" == 'function' ]
}
START_END_SCRIPT_COLOR=37
START_TASK_COLOR=33
END_TASK_COLOR=36
################################
# script execution starts here #
################################
# check if config file exists
if [ ! -e 'deploy_config.sh' ]; then
echo "Error: Config file not found (deploy_config.sh)"
exit 1
fi
if [ ! -e 'rsync.exclude' ]; then
echo "Error: rsync config file not found (rsync.exclude)"
exit 1
fi
source deploy_config.sh
# check environment config
if [ "$1" == "" ]; then
echo "Error: Environment required: use deploy_sf2 <env>"
exit 1
fi
if ! fn_exists "$1_env"; then
echo "Error: environment config function $1_env not found"
exit 1
fi
echo "Running deploy for $1 environment"
"$1_env"
# read dry-run option
echo "Execute dry run? (*/N)"
read DRY_RUN
title_label "-> Deploy started at: $(date)"
if [ "$DRY_RUN" == "N" ]; then
echo "" >> deploy-"$1".log
echo "$(date)" >> deploy-"$1".log
echo "$(git --no-pager show -s --oneline)" >> deploy-"$1".log
echo "Revision: $(git rev-parse HEAD)" >> deploy-"$1".log
fi
if [ "$DRY_RUN" == "N" ]; then
color_output "-> MODE: EXECUTE" 33
else
color_output "-> MODE: DRY RUN" 33
fi
BASE_SSH='ssh'
# if a different port is required
if [ ! "$SERVER_PORT" == "" ]; then
BASE_SSH="$BASE_SSH -p $SERVER_PORT"
fi
# when a certificate is requied
if [ ! "$CERTIFICATE" == "" ]; then
BASE_SSH="$BASE_SSH -i $CERTIFICATE"
fi
# find out what symfony version we are dealing with
if [ -e 'bin/console' ]; then
CONSOLE_PATH="$HTTPDOCS_PATH/bin/console"
CACHE_PATH="$HTTPDOCS_PATH/var"
else
if [ -e 'app/console' ]; then
CONSOLE_PATH="$HTTPDOCS_PATH/app/console"
CACHE_PATH="$HTTPDOCS_PATH/app"
else
echo "Symfony version not found"
exit 1
fi
fi
execute_task "execute_rsync"
execute_task "execute_clear_cache"
execute_task "execute_schema_update"
execute_task "execute_assets_install"
execute_task "execute_assetic_dump"
execute_task "execute_file_touch"
echo ""
title_label "Deploy finished at: $(date)"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment