#!/usr/bin/env bash
set -euo pipefail
# Build a deploy package containing only code changes/new files
# from source compared to destination.
#
# Usage:
# scripts/ops/netgescon-build-update-package.sh \
# --src /home/michele/netgescon/netgescon-laravel \
# --compare-dir /var/www/netgescon \
# --out-dir /var/www/netgescon/storage/app/public/ops-packages
SRC_DIR="/home/michele/netgescon/netgescon-laravel"
COMPARE_DIR="/var/www/netgescon"
OUT_DIR="/var/www/netgescon/storage/app/public/ops-packages"
while [[ $# -gt 0 ]]; do
case "$1" in
--src)
SRC_DIR="$2"
shift 2
;;
--compare-dir)
COMPARE_DIR="$2"
shift 2
;;
--out-dir)
OUT_DIR="$2"
shift 2
;;
*)
echo "Unknown option: $1"
echo "Usage: $0 [--src
] [--compare-dir ] [--out-dir ]"
exit 1
;;
esac
done
if [[ ! -d "$SRC_DIR" || ! -f "$SRC_DIR/artisan" ]]; then
echo "Error: invalid source app dir: $SRC_DIR"
exit 1
fi
if [[ ! -d "$COMPARE_DIR" || ! -f "$COMPARE_DIR/artisan" ]]; then
echo "Error: invalid compare app dir: $COMPARE_DIR"
exit 1
fi
mkdir -p "$OUT_DIR"
STAMP="$(date +"%Y%m%d-%H%M%S")"
WORK_DIR="/tmp/netgescon-update-package-$STAMP"
mkdir -p "$WORK_DIR"
cleanup() {
rm -rf "$WORK_DIR"
}
trap cleanup EXIT
RSYNC_ARGS=(
-avh
--checksum
--update
--compare-dest="$COMPARE_DIR"
--exclude=.git/
--exclude=.env
--exclude=storage/
--exclude=node_modules/
--exclude=vendor/
)
# Copy only files that differ from compare destination.
rsync "${RSYNC_ARGS[@]}" "$SRC_DIR/" "$WORK_DIR/"
FILE_COUNT="$(find "$WORK_DIR" -type f | wc -l | tr -d ' ')"
if [[ "$FILE_COUNT" == "0" ]]; then
echo "No code differences found between source and destination."
exit 0
fi
PACKAGE_PATH="$OUT_DIR/netgescon-update-$STAMP.tar.gz"
tar -czf "$PACKAGE_PATH" -C "$WORK_DIR" .
# Keep a stable pointer to the latest package.
ln -sfn "$PACKAGE_PATH" "$OUT_DIR/latest-update.tar.gz"
echo "Update package created."
echo "FILES_INCLUDED=$FILE_COUNT"
echo "PACKAGE_PATH=$PACKAGE_PATH"