netgescon-day0/scripts/ops/netgescon-upgrade-apply.sh

101 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# Apply a versioned upgrade on production-like environments.
# Usage:
# scripts/ops/netgescon-upgrade-apply.sh --tag v1.3.0 --app-dir /var/www/netgescon
TAG=""
APP_DIR="/var/www/netgescon"
BACKUP_DIR="/var/backups/netgescon"
RUN_MIGRATIONS="yes"
while [[ $# -gt 0 ]]; do
case "$1" in
--tag)
TAG="$2"
shift 2
;;
--app-dir)
APP_DIR="$2"
shift 2
;;
--backup-dir)
BACKUP_DIR="$2"
shift 2
;;
--skip-migrations)
RUN_MIGRATIONS="no"
shift 1
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done
if [[ -z "$TAG" ]]; then
echo "Usage: $0 --tag <version-tag> [--app-dir /var/www/netgescon] [--backup-dir /var/backups/netgescon] [--skip-migrations]"
exit 1
fi
STAMP="$(date +"%Y%m%d-%H%M%S")"
mkdir -p "$BACKUP_DIR"
pushd "$APP_DIR" >/dev/null
if [[ ! -f artisan ]]; then
echo "Error: '$APP_DIR' is not a Laravel app (artisan not found)."
exit 1
fi
# Load DB settings from .env for local mysqldump backup.
if [[ -f .env ]]; then
# shellcheck disable=SC1091
set -a
source .env
set +a
fi
DB_HOST="${DB_HOST:-127.0.0.1}"
DB_PORT="${DB_PORT:-3306}"
DB_DATABASE="${DB_DATABASE:-}"
DB_USERNAME="${DB_USERNAME:-}"
DB_PASSWORD="${DB_PASSWORD:-}"
if [[ -n "$DB_DATABASE" && -n "$DB_USERNAME" ]]; then
echo "Creating DB backup..."
MYSQL_PWD="$DB_PASSWORD" mysqldump \
--host="$DB_HOST" \
--port="$DB_PORT" \
--user="$DB_USERNAME" \
--single-transaction \
--routines \
--triggers \
"$DB_DATABASE" > "$BACKUP_DIR/db-${STAMP}.sql"
fi
# Backup mutable app data.
echo "Creating storage and env backup..."
tar -czf "$BACKUP_DIR/app-${STAMP}.tar.gz" storage .env
echo "Updating code to tag $TAG..."
git fetch --tags origin
git checkout "$TAG"
composer install --no-dev --optimize-autoloader
if [[ "$RUN_MIGRATIONS" == "yes" ]]; then
php artisan migrate --force
fi
php artisan optimize:clear
php artisan optimize
popd >/dev/null
echo "Upgrade completed successfully on tag $TAG"
echo "Backups saved in $BACKUP_DIR"