#!/usr/bin/env bash set -euo pipefail REMOTE_DIR="${REMOTE_DIR:-/opt/chatapp-test}" MONITOR_CHECKOUT_DIR="${MONITOR_CHECKOUT_DIR:-$REMOTE_DIR/git/hy-app-monitor}" export GIT_SSH_COMMAND="${GIT_SSH_COMMAND:-ssh -o StrictHostKeyChecking=accept-new}" env_file_value() { local key="$1" local file="${2:-$REMOTE_DIR/.env}" [ -f "$file" ] || return 0 awk -v key="$key" ' BEGIN { FS = "=" } $1 == key { sub(/^[^=]*=/, "") gsub(/^[ \t"'"'"']+|[ \t"'"'"']+$/, "") print exit } ' "$file" } MONITOR_REPO_URL="${MONITOR_REPO_URL:-$(env_file_value TESTBOX_MONITOR_REPO_URL)}" MONITOR_REPO_URL="${MONITOR_REPO_URL:-git@gitea.haiyihy.com:hy/hy-app-monitor.git}" MONITOR_BRANCH="${MONITOR_BRANCH:-$(env_file_value TESTBOX_MONITOR_BRANCH)}" MONITOR_BRANCH="${MONITOR_BRANCH:-main}" sync_repo() { local dir="$1" local url="$2" local branch="$3" local stamp mkdir -p "$(dirname "$dir")" if [ -e "$dir" ] && [ ! -d "$dir/.git" ]; then stamp="$(date +%Y%m%d%H%M%S)" mv "$dir" "$dir.pre-git-$stamp" echo "moved non-git directory to $dir.pre-git-$stamp" fi if [ ! -d "$dir/.git" ]; then git clone --branch "$branch" "$url" "$dir" fi git -C "$dir" remote set-url origin "$url" git -C "$dir" fetch --prune origin "$branch" git -C "$dir" checkout -B "$branch" "origin/$branch" git -C "$dir" reset --hard "origin/$branch" } sync_repo "$MONITOR_CHECKOUT_DIR" "$MONITOR_REPO_URL" "$MONITOR_BRANCH" latest_script="$MONITOR_CHECKOUT_DIR/testbox/scripts/deploy-from-git-remote.sh" current_script="${BASH_SOURCE[0]}" if [ "${TESTBOX_REMOTE_DEPLOY_BOOTSTRAPPED:-0}" != "1" ] && [ "$current_script" != "$latest_script" ]; then export TESTBOX_REMOTE_DEPLOY_BOOTSTRAPPED=1 exec bash "$latest_script" fi mkdir -p "$REMOTE_DIR"/{git,sources,run,logs} rsync --archive --delete \ --exclude ".env" \ --exclude "git" \ --exclude "sources" \ --exclude "run" \ --exclude "logs" \ --exclude "mysql/baseline/*.sql" \ "$MONITOR_CHECKOUT_DIR/testbox/" "$REMOTE_DIR/" bash "$REMOTE_DIR/scripts/bootstrap-server.sh" bash "$REMOTE_DIR/scripts/merge-env-defaults.sh" "$REMOTE_DIR/.env" "$REMOTE_DIR/.env.example" env_value() { python3 "$REMOTE_DIR/scripts/env-value.py" "$REMOTE_DIR/.env" "$1" "${2:-}" } JAVA_REPO_URL="$(env_value JAVA_REPO_URL git@gitea.haiyihy.com:hy/chatapp3-java.git)" JAVA_BRANCH="$(env_value JAVA_BRANCH main)" GOLANG_REPO_URL="$(env_value GOLANG_REPO_URL git@gitea.haiyihy.com:hy/chatapp3-golang.git)" GOLANG_BRANCH="$(env_value GOLANG_BRANCH main)" CRON_REPO_URL="$(env_value CRON_REPO_URL git@gitea.haiyihy.com:hy/chatapp-cron.git)" CRON_BRANCH="$(env_value CRON_BRANCH main)" ADMIN_REPO_URL="$(env_value ADMIN_REPO_URL git@gitea.haiyihy.com:hy/chatapp3-admin.git)" ADMIN_BRANCH="$(env_value ADMIN_BRANCH main)" JAVA_SOURCE_DIR="$(env_value JAVA_SOURCE_DIR "$REMOTE_DIR/sources/chatapp3-java")" GOLANG_SOURCE_DIR="$(env_value GOLANG_SOURCE_DIR "$REMOTE_DIR/sources/chatapp3-golang")" CRON_SOURCE_DIR="$(env_value CRON_SOURCE_DIR "$REMOTE_DIR/sources/chatapp-cron")" ADMIN_SOURCE_DIR="$(env_value ADMIN_SOURCE_DIR "$REMOTE_DIR/sources/chatapp3-admin")" echo "updating source repos from git..." sync_repo "$JAVA_SOURCE_DIR" "$JAVA_REPO_URL" "$JAVA_BRANCH" sync_repo "$GOLANG_SOURCE_DIR" "$GOLANG_REPO_URL" "$GOLANG_BRANCH" sync_repo "$CRON_SOURCE_DIR" "$CRON_REPO_URL" "$CRON_BRANCH" sync_repo "$ADMIN_SOURCE_DIR" "$ADMIN_REPO_URL" "$ADMIN_BRANCH" cd "$REMOTE_DIR" flock "$REMOTE_DIR/run/deploy.lock" bash scripts/deploy-all.sh bash scripts/install-auto-deploy-service.sh