diff --git a/.claude/hooks/monitor-gitea-action.sh b/.claude/hooks/monitor-gitea-action.sh new file mode 100755 index 0000000..ba6cc79 --- /dev/null +++ b/.claude/hooks/monitor-gitea-action.sh @@ -0,0 +1,197 @@ +#!/bin/bash + +# Monitor Gitea Action after git push +# Este script se ejecuta despues de un git push y espera a que termine la Gitea Action + +set -euo pipefail + +# Configuracion +GITEA_URL="https://gitea.nucleoriofrio.com" +OWNER="nucleo000" +REPO="printerCentral" + +# Intentar cargar el token desde el entorno o desde ~/.bashrc +GITEA_TOKEN="${GITEA_TOKEN:-}" +if [ -z "$GITEA_TOKEN" ] && [ -f "$HOME/.bashrc" ]; then + # Intentar extraer el token de .bashrc + GITEA_TOKEN=$(grep -oP "export GITEA_TOKEN=['\"]?\K[^'\"]*" "$HOME/.bashrc" 2>/dev/null || echo "") +fi + +MAX_WAIT_SECONDS=600 # 10 minutos +POLL_INTERVAL=10 # Consultar cada 10 segundos + +# Leer el input JSON del hook +INPUT=$(cat) + +# Verificar si el comando fue un git push +COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // ""') +if [[ ! "$COMMAND" =~ git[[:space:]]+push ]]; then + # No fue un git push, salir sin hacer nada + exit 0 +fi + +# Verificar que existe el token +if [ -z "$GITEA_TOKEN" ]; then + cat < /dev/null 2>&1; then + echo "ERROR: $(echo "$response" | jq -r '.message')" >&2 + echo "" + return 1 + fi + + echo "$response" | jq -r '.workflow_runs[0] // .data[0] // empty' +} + +# Funcion para formatear el resultado +format_result() { + local status="$1" + local task_data="$2" + + local id=$(echo "$task_data" | jq -r '.id // "N/A"') + local workflow_name=$(echo "$task_data" | jq -r '.name // "N/A"') + local workflow_file=$(echo "$task_data" | jq -r '.workflow_id // "N/A"') + local run_number=$(echo "$task_data" | jq -r '.run_number // "N/A"') + local event=$(echo "$task_data" | jq -r '.event // "N/A"') + local branch=$(echo "$task_data" | jq -r '.head_branch // "N/A"') + local title=$(echo "$task_data" | jq -r '.display_title // "N/A"') + local created=$(echo "$task_data" | jq -r '.created_at // "N/A"') + local started=$(echo "$task_data" | jq -r '.run_started_at // .started_at // "N/A"') + local updated=$(echo "$task_data" | jq -r '.updated_at // .stopped_at // "N/A"') + local commit=$(echo "$task_data" | jq -r '.head_sha[0:8] // "N/A"') + local run_url=$(echo "$task_data" | jq -r '.url // ""') + + # Calcular duracion si es posible + local duration="N/A" + if [[ "$started" != "N/A" && "$updated" != "N/A" ]]; then + local start_ts=$(date -d "$started" +%s 2>/dev/null || echo "0") + local end_ts=$(date -d "$updated" +%s 2>/dev/null || echo "0") + if [[ $start_ts -gt 0 && $end_ts -gt 0 ]]; then + local diff=$((end_ts - start_ts)) + if [[ $diff -lt 60 ]]; then + duration="${diff}s" + else + local mins=$((diff / 60)) + local secs=$((diff % 60)) + duration="${mins}m ${secs}s" + fi + fi + fi + + case "$status" in + success) + local emoji="[OK]" + local msg="EXITOSO" + ;; + failure) + local emoji="[ERROR]" + local msg="FALLO" + ;; + cancelled) + local emoji="[CANCELADO]" + local msg="CANCELADO" + ;; + *) + local emoji="[?]" + local msg="DESCONOCIDO ($status)" + ;; + esac + + # Construir URL de logs si no esta disponible + if [[ -z "$run_url" || "$run_url" == "null" ]]; then + run_url="$GITEA_URL/$OWNER/$REPO/actions/runs/$id" + fi + + cat <&2 +ACTIONS_ENABLED=$(check_actions_enabled) + +if [[ "$ACTIONS_ENABLED" != "true" ]]; then + cat <&2 + +# Esperar un poco antes de la primera consulta (dar tiempo a que Gitea cree la action) +sleep 5 + +# Polling loop +elapsed=0 +while [ $elapsed -lt $MAX_WAIT_SECONDS ]; do + # Consultar el estado + TASK_DATA=$(get_latest_action_status) + + if [ -z "$TASK_DATA" ]; then + echo "Esperando que Gitea cree la action... (${elapsed}s)" >&2 + sleep $POLL_INTERVAL + elapsed=$((elapsed + POLL_INTERVAL)) + continue + fi + + STATUS=$(echo "$TASK_DATA" | jq -r '.status // "unknown"') + + echo "Estado actual: $STATUS (${elapsed}s)" >&2 + + # Verificar si termino + case "$STATUS" in + success|failure|cancelled) + # Action termino! + format_result "$STATUS" "$TASK_DATA" + exit 0 + ;; + running|pending|waiting) + # Todavia corriendo + sleep $POLL_INTERVAL + elapsed=$((elapsed + POLL_INTERVAL)) + ;; + *) + # Estado desconocido + echo "Estado desconocido: $STATUS" >&2 + sleep $POLL_INTERVAL + elapsed=$((elapsed + POLL_INTERVAL)) + ;; + esac +done + +# Timeout alcanzado +cat <