diff --git a/scripts/deploy-vserver.sh b/scripts/deploy-vserver.sh index dc8f4be..624c177 100755 --- a/scripts/deploy-vserver.sh +++ b/scripts/deploy-vserver.sh @@ -5,6 +5,18 @@ set -euo pipefail script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" repo_root="$(cd "$script_dir/.." && pwd)" +ssh_control_path="" +cleanup() { + local exit_code=$? + + if [[ -n "$ssh_control_path" ]] && ssh -o ControlPath="$ssh_control_path" -O exit "$REMOTE_HOST" >/dev/null 2>&1; then + : + fi + + exit "$exit_code" +} +trap cleanup EXIT + if [[ $# -gt 1 ]]; then echo "Usage: $0 [deploy-config-file]" >&2 exit 1 @@ -43,6 +55,7 @@ dockerfile_path="$repo_root/deploy/vserver.Dockerfile" project_path="$repo_root/src/RolemasterDb.App/RolemasterDb.App.csproj" remote_release_dir="$REMOTE_APP_DIR/releases/$release_id" remote_tarball_path="$remote_release_dir/release.tar.gz" +ssh_control_path="/tmp/rolemasterdb-deploy-${USER:-$(id -un)}-$(date -u +%Y%m%d%H%M%S)-$$.sock" if [[ ! -f "$seed_db_path" ]]; then echo "Seed database not found: $seed_db_path" >&2 @@ -56,6 +69,14 @@ fi mkdir -p "$artifact_root" +echo "Opening shared SSH connection to $REMOTE_HOST..." +ssh \ + -o ControlMaster=yes \ + -o ControlPersist=10m \ + -o ControlPath="$ssh_control_path" \ + -Nf \ + "$REMOTE_HOST" + echo "Publishing RolemasterDb.App..." rm -rf "$publish_dir" mkdir -p \ @@ -73,7 +94,9 @@ cp "$dockerfile_path" "$stage_dir/Dockerfile" tar -C "$stage_dir" -czf "$tarball_path" . echo "Creating remote release directory..." -ssh "$REMOTE_HOST" bash -s -- "$remote_release_dir" "$REMOTE_DATA_DIR" <<'EOF' +ssh \ + -o ControlPath="$ssh_control_path" \ + "$REMOTE_HOST" bash -s -- "$remote_release_dir" "$REMOTE_DATA_DIR" <<'EOF' set -euo pipefail release_dir="$1" data_dir="$2" @@ -81,10 +104,15 @@ mkdir -p "$release_dir" "$data_dir" EOF echo "Uploading bundle to $REMOTE_HOST..." -scp "$tarball_path" "$REMOTE_HOST:$remote_tarball_path" +scp \ + -o ControlPath="$ssh_control_path" \ + "$tarball_path" "$REMOTE_HOST:$remote_tarball_path" echo "Building image and restarting container on $REMOTE_HOST..." -ssh "$REMOTE_HOST" bash -s -- \ +remote_env_file_escaped="$(printf '%q' "$REMOTE_ENV_FILE")" +ssh \ + -o ControlPath="$ssh_control_path" \ + "$REMOTE_HOST" bash -s -- \ "$release_id" \ "$REMOTE_APP_DIR" \ "$REMOTE_DATA_DIR" \ @@ -93,8 +121,7 @@ ssh "$REMOTE_HOST" bash -s -- \ "$HOST_BIND_ADDRESS" \ "$HOST_PORT" \ "$CONTAINER_PORT" \ - "$REMOTE_USE_SUDO" \ - "$REMOTE_ENV_FILE" <<'EOF' + "$REMOTE_USE_SUDO" <