#!/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"