Reuse SSH session in deploy script
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user