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.
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user