Files
IM-web-new/deploy/jc-web-im-update.sh
T

76 lines
2.1 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
set -euo pipefail
CONFIG_FILE=${JC_WEB_IM_UPDATE_CONFIG:-/etc/jc-web-im-update.conf}
STATE_DIR=/var/lib/jc-web-im-update
LOCK_FILE=/run/lock/jc-web-im-update.lock
if [[ ! -r "$CONFIG_FILE" ]]; then
echo "Missing configuration: $CONFIG_FILE" >&2
exit 1
fi
# shellcheck source=/dev/null
source "$CONFIG_FILE"
: "${REPO_DIR:?REPO_DIR is required}"
: "${WEB_ROOT:?WEB_ROOT is required}"
: "${BRANCH:=main}"
case "$REPO_DIR" in
/opt/jc-web-im-release|/opt/jc-web-im-release-*) ;;
*) echo "Unsafe REPO_DIR: $REPO_DIR" >&2; exit 1 ;;
esac
case "$WEB_ROOT" in
/var/www/jc-web-im|/var/www/jc-web-im-*) ;;
*) echo "Unsafe WEB_ROOT: $WEB_ROOT" >&2; exit 1 ;;
esac
mkdir -p "$STATE_DIR"
exec 9>"$LOCK_FILE"
flock -n 9 || {
echo "Another update is already running"
exit 0
}
git -C "$REPO_DIR" fetch --quiet origin "$BRANCH"
TARGET_COMMIT=$(git -C "$REPO_DIR" rev-parse "origin/$BRANCH")
CURRENT_COMMIT=$(cat "$STATE_DIR/last_deployed" 2>/dev/null || true)
if [[ "$TARGET_COMMIT" == "$CURRENT_COMMIT" ]]; then
echo "Already current: $TARGET_COMMIT"
exit 0
fi
git -C "$REPO_DIR" reset --hard --quiet "$TARGET_COMMIT"
DIST_DIR="$REPO_DIR/dist"
[[ -f "$DIST_DIR/index.html" ]] || {
echo "Missing dist/index.html at $TARGET_COMMIT" >&2
exit 1
}
while IFS= read -r asset; do
[[ -f "$DIST_DIR/$asset" ]] || {
echo "Missing referenced asset: $asset" >&2
exit 1
}
2026-07-28 19:44:41 +08:00
done < <(grep -oE '(css|js)/[^"'"'"' ]+' "$DIST_DIR/index.html" | sort -u)
find "$DIST_DIR/api" -type f -name '*.php' -print0 |
xargs -0 -r -n1 php -l >/dev/null
BACKUP_DIR="/var/backups/jc-web-im/$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"
[[ -f "$WEB_ROOT/index.html" ]] && cp -a "$WEB_ROOT/index.html" "$BACKUP_DIR/"
[[ -f "$WEB_ROOT/config/runtime-config.js" ]] && {
mkdir -p "$BACKUP_DIR/config"
cp -a "$WEB_ROOT/config/runtime-config.js" "$BACKUP_DIR/config/"
}
mkdir -p "$WEB_ROOT"
rsync -a --exclude='/config/runtime-config.js' "$DIST_DIR/" "$WEB_ROOT/"
chown -R www-data:www-data "$WEB_ROOT"
printf '%s\n' "$TARGET_COMMIT" >"$STATE_DIR/last_deployed"
echo "Deployed: $TARGET_COMMIT -> $WEB_ROOT"