Files
fn_registry/bash/functions/infra/rsync_deploy.sh
T
egutierrez ae33d02e75 feat: funciones bash de deploy — rsync_deploy y gitea_create_webhook
rsync_deploy sincroniza directorio local a remoto via SSH con
exclusiones estándar (.git, node_modules, *.db, etc.).
gitea_create_webhook crea webhook de push en un repo Gitea para
auto-deploy en cada commit.
2026-04-12 17:29:56 +02:00

78 lines
2.5 KiB
Bash

#!/usr/bin/env bash
# rsync_deploy — Sincroniza un directorio local a un host remoto via rsync+SSH
set -euo pipefail
rsync_deploy() {
local local_dir="$1"
local ssh_alias="$2"
local remote_dir="$3"
if [[ -z "$local_dir" || -z "$ssh_alias" || -z "$remote_dir" ]]; then
echo "rsync_deploy: se requieren local_dir, ssh_alias y remote_dir" >&2
return 1
fi
if [[ ! -d "$local_dir" ]]; then
echo "rsync_deploy: directorio local '$local_dir' no existe" >&2
return 1
fi
# Crear directorio remoto si no existe
echo "rsync_deploy: verificando directorio remoto '$remote_dir' en '$ssh_alias'..." >&2
if ! ssh "$ssh_alias" "mkdir -p '$remote_dir'" 2>&1; then
echo "rsync_deploy: no se pudo crear el directorio remoto '$remote_dir' en '$ssh_alias'" >&2
return 1
fi
# Ejecutar rsync y capturar salida para parsear estadísticas
local rsync_output
rsync_output=$(rsync -avz --delete \
--exclude='.git' \
--exclude='operations.db*' \
--exclude='*.exe' \
--exclude='node_modules' \
--exclude='.venv' \
--exclude='__pycache__' \
--exclude='build/' \
--exclude='*.db-shm' \
--exclude='*.db-wal' \
-e ssh \
"$local_dir" \
"${ssh_alias}:${remote_dir}" 2>&1) || {
echo "rsync_deploy: rsync falló al sincronizar '$local_dir' → '${ssh_alias}:${remote_dir}'" >&2
echo "$rsync_output" >&2
return 1
}
echo "$rsync_output" >&2
# Parsear número de archivos transferidos
local files_transferred
files_transferred=$(echo "$rsync_output" | grep -oP 'Number of regular files transferred: \K[0-9,]+' | tr -d ',' || echo "0")
if [[ -z "$files_transferred" ]]; then
# Intentar formato alternativo de rsync
files_transferred=$(echo "$rsync_output" | grep -oP 'Number of files transferred: \K[0-9,]+' | tr -d ',' || echo "0")
fi
if [[ -z "$files_transferred" ]]; then
files_transferred="0"
fi
# Parsear tamaño total transferido
local total_size
total_size=$(echo "$rsync_output" | grep -oP 'Total transferred file size: \K[0-9,.]+ \w+' || echo "0 bytes")
if [[ -z "$total_size" ]]; then
total_size="0 bytes"
fi
# Emitir JSON a stdout
printf '{"files_transferred": %s, "total_size": "%s", "ssh_alias": "%s", "remote_dir": "%s"}\n' \
"$files_transferred" \
"$total_size" \
"$ssh_alias" \
"$remote_dir"
}
if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
rsync_deploy "$@"
fi