Reuse SSH session in deploy script

This commit is contained in:
2026-04-26 19:51:31 +02:00
parent 40925868bc
commit 0608cd3d10

View File

@@ -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" <<EOF
set -euo pipefail
release_id="$1"
@@ -106,7 +133,7 @@ host_bind_address="$6"
host_port="$7"
container_port="$8"
remote_use_sudo="$9"
remote_env_file="${10}"
remote_env_file=$remote_env_file_escaped
release_dir="$remote_app_dir/releases/$release_id"
tarball_path="$release_dir/release.tar.gz"