2026-07-28 19:43:14 +08:00
|
|
|
#!/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)
|
2026-07-28 19:43:14 +08:00
|
|
|
|
|
|
|
|
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"
|