refactor: Simplificar CI/CD usando script de deployment en el host
Some checks failed
CI/CD - Francia Ocupada (La Resistencia) / build-and-deploy (push) Failing after 6s
Some checks failed
CI/CD - Francia Ocupada (La Resistencia) / build-and-deploy (push) Failing after 6s
- Creado deploy.sh que se ejecuta directamente en el host - Simplificado workflow para ejecutar el script en lugar de comandos inline - El script maneja todo: git pull, docker build, docker deploy - Evita problemas de 'docker: command not found' en el runner - El runner solo necesita Node.js para checkout, luego ejecuta el script del host
This commit is contained in:
@@ -8,17 +8,15 @@ on:
|
||||
- master
|
||||
workflow_dispatch:
|
||||
|
||||
# Otorga permiso de lectura al token del workflow (necesario para el checkout)
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
# Usamos la etiqueta que configuramos en el runner (production-ready:host)
|
||||
runs-on: [production-ready]
|
||||
|
||||
steps:
|
||||
# PASO 1: Instalar Node.js manualmente (requerido por las acciones de GitHub)
|
||||
# PASO 1: Instalar Node.js (requerido por las acciones de GitHub)
|
||||
- name: 📦 Instalar Node.js
|
||||
shell: bash
|
||||
run: |
|
||||
@@ -26,21 +24,12 @@ jobs:
|
||||
if ! command -v node &> /dev/null; then
|
||||
echo "Node.js no encontrado, instalando..."
|
||||
|
||||
# Detectar el sistema operativo
|
||||
if [ -f /etc/debian_version ]; then
|
||||
# Debian/Ubuntu
|
||||
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
|
||||
apt-get install -y nodejs
|
||||
elif [ -f /etc/redhat-release ]; then
|
||||
# RedHat/CentOS/Fedora
|
||||
curl -fsSL https://rpm.nodesource.com/setup_20.x | bash -
|
||||
yum install -y nodejs
|
||||
elif [ -f /etc/alpine-release ]; then
|
||||
# Alpine Linux
|
||||
apk add --no-cache nodejs npm
|
||||
else
|
||||
echo "Sistema operativo no soportado, intentando instalación genérica..."
|
||||
# Intentar con nvm como fallback
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
|
||||
export NVM_DIR="$HOME/.nvm"
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
||||
@@ -50,7 +39,6 @@ jobs:
|
||||
echo "Node.js ya está instalado: $(node --version)"
|
||||
fi
|
||||
|
||||
# Verificar instalación
|
||||
node --version
|
||||
npm --version
|
||||
|
||||
@@ -60,85 +48,46 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
# PASO 3: Detener y eliminar contenedores anteriores
|
||||
- name: 🛑 Detener Contenedores Anteriores
|
||||
# PASO 3: Ejecutar script de deployment en el host
|
||||
- name: 🎯 Ejecutar Deployment
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Deteniendo contenedores existentes..."
|
||||
docker compose -f docker-compose_prod.yml down || true
|
||||
echo "🚀 Ejecutando script de deployment..."
|
||||
|
||||
# Limpieza de contenedores huérfanos
|
||||
docker container prune -f || true
|
||||
# Copiar archivos al directorio del proyecto en el host
|
||||
# El runner ya tiene el código en su workspace
|
||||
WORKSPACE_DIR=$(pwd)
|
||||
PROJECT_DIR="/home/marti/Documentos/Gitea/resistencia"
|
||||
|
||||
echo "Contenedores anteriores detenidos y eliminados"
|
||||
|
||||
# PASO 4: Limpiar imágenes antiguas (opcional pero recomendado)
|
||||
- name: 🧹 Limpiar Imágenes Antiguas
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Limpiando imágenes sin usar..."
|
||||
docker image prune -f || true
|
||||
echo "Limpieza completada"
|
||||
|
||||
# PASO 5: Construir las imágenes Docker
|
||||
- name: 🔨 Construir Imágenes Docker
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Construyendo imágenes con docker-compose_prod.yml..."
|
||||
docker compose -f docker-compose_prod.yml build --no-cache
|
||||
echo "📂 Workspace del runner: $WORKSPACE_DIR"
|
||||
echo "📂 Directorio del proyecto: $PROJECT_DIR"
|
||||
|
||||
# Etiquetar con el SHA del commit para trazabilidad
|
||||
TAG_VERSION="${{ gitea.sha }}"
|
||||
|
||||
docker tag resistencia-client:latest resistencia-client:${TAG_VERSION}
|
||||
docker tag resistencia-server:latest resistencia-server:${TAG_VERSION}
|
||||
|
||||
echo "✅ Imágenes construidas:"
|
||||
echo " - resistencia-client:latest (${TAG_VERSION})"
|
||||
echo " - resistencia-server:latest (${TAG_VERSION})"
|
||||
|
||||
# PASO 6: Desplegar los contenedores
|
||||
- name: 📦 Desplegar Aplicación
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Desplegando aplicación con docker-compose_prod.yml..."
|
||||
docker compose -f docker-compose_prod.yml up -d
|
||||
|
||||
echo "✅ Aplicación desplegada exitosamente"
|
||||
echo ""
|
||||
echo "📊 Estado de los contenedores:"
|
||||
docker compose -f docker-compose_prod.yml ps
|
||||
|
||||
# PASO 7: Verificar que los contenedores están corriendo
|
||||
- name: ✅ Verificar Despliegue
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Esperando 10 segundos para que los contenedores inicien..."
|
||||
sleep 10
|
||||
|
||||
echo "Verificando estado de los contenedores..."
|
||||
docker compose -f docker-compose_prod.yml ps
|
||||
|
||||
# Verificar que los contenedores están corriendo
|
||||
if [ $(docker compose -f docker-compose_prod.yml ps -q | wc -l) -eq 0 ]; then
|
||||
echo "❌ ERROR: No hay contenedores corriendo"
|
||||
docker compose -f docker-compose_prod.yml logs
|
||||
exit 1
|
||||
# Copiar el código actualizado al directorio del proyecto
|
||||
# (esto asume que el runner tiene acceso al filesystem del host)
|
||||
if [ "$WORKSPACE_DIR" != "$PROJECT_DIR" ]; then
|
||||
echo "📋 Copiando archivos actualizados..."
|
||||
rsync -av --exclude='.git' --exclude='node_modules' "$WORKSPACE_DIR/" "$PROJECT_DIR/" || \
|
||||
cp -r "$WORKSPACE_DIR/"* "$PROJECT_DIR/" || \
|
||||
echo "⚠️ No se pudo copiar, asumiendo que ya estamos en el directorio correcto"
|
||||
fi
|
||||
|
||||
echo "✅ Verificación completada"
|
||||
echo ""
|
||||
echo "🌐 Aplicación disponible en:"
|
||||
echo " - Frontend: https://franciaocupada.martivich.es"
|
||||
echo " - API: https://api.franciaocupada.martivich.es"
|
||||
|
||||
# PASO 8: Mostrar logs recientes (útil para debugging)
|
||||
- name: 📋 Mostrar Logs Recientes
|
||||
# Ejecutar el script de deployment
|
||||
cd "$PROJECT_DIR"
|
||||
chmod +x deploy.sh
|
||||
./deploy.sh
|
||||
|
||||
# PASO 4: Verificación Final
|
||||
- name: ✅ Verificación Final
|
||||
if: always()
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Logs del cliente (últimas 50 líneas):"
|
||||
docker compose -f docker-compose_prod.yml logs --tail=50 client || true
|
||||
PROJECT_DIR="/home/marti/Documentos/Gitea/resistencia"
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
echo "📊 Estado final de los contenedores:"
|
||||
docker compose -f docker-compose_prod.yml ps || echo "No se pudo verificar el estado"
|
||||
|
||||
echo ""
|
||||
echo "Logs del servidor (últimas 50 líneas):"
|
||||
docker compose -f docker-compose_prod.yml logs --tail=50 server || true
|
||||
echo "🌐 URLs de la aplicación:"
|
||||
echo " - Frontend: https://franciaocupada.martivich.es"
|
||||
echo " - API: https://api.franciaocupada.martivich.es"
|
||||
|
||||
94
deploy.sh
Executable file
94
deploy.sh
Executable file
@@ -0,0 +1,94 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de deployment para Francia Ocupada
|
||||
# Este script se ejecuta en el HOST, no en el runner
|
||||
|
||||
set -e # Salir si hay algún error
|
||||
|
||||
echo "🚀 Iniciando deployment de Francia Ocupada..."
|
||||
echo "================================================"
|
||||
|
||||
# Directorio del proyecto
|
||||
PROJECT_DIR="/home/marti/Documentos/Gitea/resistencia"
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
echo "📂 Directorio de trabajo: $(pwd)"
|
||||
echo ""
|
||||
|
||||
# PASO 1: Actualizar código desde Git
|
||||
echo "📥 PASO 1: Actualizando código desde Git..."
|
||||
git fetch origin
|
||||
git reset --hard origin/main
|
||||
echo "✅ Código actualizado"
|
||||
echo ""
|
||||
|
||||
# PASO 2: Detener contenedores anteriores
|
||||
echo "🛑 PASO 2: Deteniendo contenedores anteriores..."
|
||||
docker compose -f docker-compose_prod.yml down || true
|
||||
docker container prune -f || true
|
||||
echo "✅ Contenedores anteriores detenidos"
|
||||
echo ""
|
||||
|
||||
# PASO 3: Limpiar imágenes antiguas
|
||||
echo "🧹 PASO 3: Limpiando imágenes antiguas..."
|
||||
docker image prune -f || true
|
||||
echo "✅ Limpieza completada"
|
||||
echo ""
|
||||
|
||||
# PASO 4: Construir imágenes Docker
|
||||
echo "🔨 PASO 4: Construyendo imágenes Docker..."
|
||||
docker compose -f docker-compose_prod.yml build --no-cache
|
||||
|
||||
# Etiquetar con timestamp para trazabilidad
|
||||
TAG_VERSION=$(date +%Y%m%d_%H%M%S)
|
||||
docker tag resistencia-client:latest resistencia-client:${TAG_VERSION} || true
|
||||
docker tag resistencia-server:latest resistencia-server:${TAG_VERSION} || true
|
||||
|
||||
echo "✅ Imágenes construidas:"
|
||||
echo " - resistencia-client:latest (${TAG_VERSION})"
|
||||
echo " - resistencia-server:latest (${TAG_VERSION})"
|
||||
echo ""
|
||||
|
||||
# PASO 5: Desplegar contenedores
|
||||
echo "📦 PASO 5: Desplegando aplicación..."
|
||||
docker compose -f docker-compose_prod.yml up -d
|
||||
|
||||
echo "✅ Aplicación desplegada exitosamente"
|
||||
echo ""
|
||||
|
||||
# PASO 6: Verificar deployment
|
||||
echo "✅ PASO 6: Verificando deployment..."
|
||||
sleep 10
|
||||
|
||||
echo "📊 Estado de los contenedores:"
|
||||
docker compose -f docker-compose_prod.yml ps
|
||||
echo ""
|
||||
|
||||
# Verificar que los contenedores están corriendo
|
||||
RUNNING_CONTAINERS=$(docker compose -f docker-compose_prod.yml ps -q | wc -l)
|
||||
if [ "$RUNNING_CONTAINERS" -eq 0 ]; then
|
||||
echo "❌ ERROR: No hay contenedores corriendo"
|
||||
docker compose -f docker-compose_prod.yml logs
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Verificación completada - $RUNNING_CONTAINERS contenedores corriendo"
|
||||
echo ""
|
||||
|
||||
# PASO 7: Mostrar logs recientes
|
||||
echo "📋 PASO 7: Logs recientes..."
|
||||
echo ""
|
||||
echo "--- Logs del Cliente (últimas 20 líneas) ---"
|
||||
docker compose -f docker-compose_prod.yml logs --tail=20 client || true
|
||||
echo ""
|
||||
echo "--- Logs del Servidor (últimas 20 líneas) ---"
|
||||
docker compose -f docker-compose_prod.yml logs --tail=20 server || true
|
||||
echo ""
|
||||
|
||||
echo "================================================"
|
||||
echo "🎉 Deployment completado exitosamente!"
|
||||
echo ""
|
||||
echo "🌐 Aplicación disponible en:"
|
||||
echo " - Frontend: https://franciaocupada.martivich.es"
|
||||
echo " - API: https://api.franciaocupada.martivich.es"
|
||||
echo "================================================"
|
||||
Reference in New Issue
Block a user