Files
proyectosacc-mirror/docs/06-scripts-de-despliegue.md
2026-04-14 14:53:05 -06:00

198 lines
7.3 KiB
Markdown

# 06 - Scripts de Despliegue
> Qué hace cada script y cuándo se ejecuta.
---
## 1. ¿Qué son los scripts de despliegue?
Los **scripts** son archivos de texto con instrucciones que la computadora puede ejecutar automáticamente.
En `proyectosacc` usamos scripts escritos en **Bash** (el lenguaje de comandos de Linux). Todos comienzan con esta línea mágica:
```bash
set -euo pipefail
```
Esto significa tres cosas:
1. **`set -e`**: Si un comando falla, el script se detiene inmediatamente.
2. **`set -u`**: Si usas una variable que no existe, el script se detiene.
3. **`set -o pipefail`**: Si un comando dentro de una "tubería" (`|`) falla, el script también se detiene.
> 💡 **En palabras simples**: es como poner el cinturón de seguridad antes de manejar.
---
### 1.1. Scripts provenientes de otros proyectos CI/CD
`proyectosacc` reutiliza scripts y utilerías que viven en repositorios compartidos:
- **`ci-cd-commons`**: contiene `telegram_alert.sh`, `logger_bash.sh` y otras utilerías base que usan todos los pipelines de la empresa.
- **`ci-cd-saac4`**: provee módulos de Terraform y scripts de despliegue adaptados para la familia SACC.
Estos repositorios se clonan dentro de la carpeta `/home/thoth/deploy/` (por ejemplo, `/home/thoth/deploy/ci-cd-commons/`) para que los scripts locales puedan usarlos.
### 1.2. Nuevo script: `deploy-frontend-s3.sh`
Este script se ejecuta **desde el pipeline de Bitbucket** (no dentro de la EC2). Su trabajo es subir el frontend React a S3.
Qué hace:
1. Sincroniza la carpeta `build/` con el bucket S3 (`aws s3 sync build/ s3://bucket-name --delete`).
2. Espera a que la sincronización termine.
> 💡 **Nota**: la invalidación de la caché de CloudFront se hace en el **paso 7** del pipeline (`07_deploy`), después de confirmar que la API está saludable. Así evitamos refrescar el frontend antes de que el backend esté listo.
Ejemplo de comando:
```bash
bash /home/thoth/deploy/scripts/deploy-frontend-s3.sh
```
---
## 2. `deploy.sh`
### ¿Qué hace?
Este es el script principal de despliegue de la **API backend**. Se ejecuta **dentro del servidor EC2** y se encarga de instalar la nueva versión del servicio.
### Pasos que sigue
1. **Crear directorios**: verifica que existan las carpetas necesarias (`backup`, `current`, `pids`, `logs`).
2. **Detener servicio anterior**: si la aplicación ya está corriendo, la detiene con `systemctl`.
3. **Configurar systemd**: crea o actualiza el archivo de servicio para que la app inicie automáticamente.
4. **Recargar systemd**: ejecuta `sudo systemctl daemon-reload`.
5. **Iniciar servicio**: ejecuta `sudo systemctl start <nombre-del-servicio>`.
6. **Health check**: hace peticiones a `http://localhost:8080/actuator/health` para verificar que la app responde.
7. **Guardar PID**: anota el ID del proceso para poder monitorearlo después.
### ¿Cuándo se llama?
- En el **paso 7** del pipeline (`07_deploy`).
- También puede ejecutarse manualmente si necesitas hacer un despliegue fuera del pipeline.
### Ejemplo de comando
```bash
bash /home/thoth/deploy/setup/deploy.sh
```
---
## 3. `health-check.sh`
### ¿Qué hace?
Verifica que la aplicación esté viva y respondiendo correctamente.
### Cómo funciona
1. Intenta conectarse a la URL de salud de la aplicación:
```
http://localhost:8080/actuator/health
```
2. Si la respuesta contiene `"status":"UP"`, todo está bien.
3. Si no responde después de varios intentos, reporta un error.
### ¿Cuándo se llama?
- **Dentro de `deploy.sh`**, inmediatamente después de iniciar el servicio.
- También puede usarse manualmente para revisar si la app sigue funcionando horas después del despliegue.
### Ejemplo de comando manual
```bash
bash /home/thoth/deploy/scripts/health-check.sh
```
---
## 4. `rollback.sh`
### ¿Qué hace?
Regresa la API backend a la versión anterior si el nuevo despliegue falló. También puede restaurar el frontend en S3 si se habilitó **versionamiento de objetos** en el bucket.
### Pasos que sigue (API en EC2)
1. Busca el último backup en la carpeta `/home/thoth/deploy/artifacts/backup/`.
2. Detiene el servicio actual.
3. Copia el backup a la carpeta `current`.
4. Reinicia el servicio con la versión anterior.
5. Ejecuta un health check para confirmar que la versión anterior todavía funciona.
### Pasos que sigue (frontend en S3)
Si el frontend también necesita rollback:
1. Identifica la versión anterior del archivo en S3 usando el versionamiento del bucket.
2. Restaura la versión anterior de `index.html` y los assets estáticos.
3. Invalida la caché de CloudFront para que los usuarios vean la versión anterior.
### ¿Cuándo se llama?
- Cuando el `deploy.sh` o el `health-check.sh` reportan un fallo en la API.
- Manualmente, si descubres que la nueva versión del frontend o la API tiene un bug grave.
### Ejemplo de comando
```bash
bash /home/thoth/deploy/scripts/rollback.sh
```
---
## 5. `notify-telegram.sh`
### ¿Qué hace?
Envía mensajes a un grupo o chat de Telegram para informar sobre el estado del pipeline.
### Qué tipo de mensajes envía
- 🟢 **Éxito**: "El despliegue de proyectosacc terminó correctamente."
- 🔴 **Error**: "El pipeline de proyectosacc falló en el paso 4. Revisar logs."
- 🟡 **Advertencia**: "Health check falló. Iniciando rollback automático."
### ¿Cuándo se llama?
- Al **inicio** del pipeline.
- Al **final** del pipeline (éxito o fracaso).
- Cuando ocurre un error en cualquier paso.
### Variables necesarias
```bash
TELEGRAM_BOT_TOKEN=<token-del-bot>
TELEGRAM_CHAT_ID=<id-del-chat>
```
### Ejemplo de comando
```bash
bash /home/thoth/deploy/ci-cd-commons/telegram_alert.sh "Despliegue exitoso"
```
---
## 6. Resumen de cuándo usar cada script
| Script | ¿Cuándo se ejecuta? | ¿Dónde corre? |
|--------|---------------------|---------------|
| `deploy-frontend-s3.sh` | Paso 5 del pipeline (subir React a S3) | Pipeline (Bitbucket) |
| `deploy.sh` | Paso 7 del pipeline (desplegar API en la EC2), o manualmente | Dentro de la EC2 |
| `health-check.sh` | Después de `deploy.sh`, o manualmente | Dentro de la EC2 |
| `rollback.sh` | Cuando `deploy.sh` o `health-check.sh` fallan, o manualmente | Pipeline o EC2 |
| `notify-telegram.sh` | Inicio, fin o error del pipeline | Pipeline (Bitbucket) o EC2 |
---
## 7. Dato extra: ¿dónde viven los scripts?
En el servidor EC2, los scripts se organizan así:
```
/home/thoth/deploy/
├── artifacts/
│ ├── backup/ ← versiones anteriores de la API
│ ├── current/ ← versión activa de la API
│ ├── logs/ ← logs del pipeline
│ └── pids/ ← archivos con el ID de proceso
├── ci-cd-commons/
│ ├── telegram_alert.sh
│ └── logger_bash.sh
├── scripts/
│ ├── deploy-frontend-s3.sh ← sube React a S3
│ ├── health-check.sh
│ └── rollback.sh
└── setup/
└── deploy.sh ← script principal del pipeline para la API (llamado vía SSH)
```
> 💡 **Nota**: el artefacto de la API que termina en `artifacts/current/` se descarga desde **Amazon S3** durante el paso de instalación del pipeline. No se transfiere directamente por SSH. El frontend React se sube directamente a S3 desde el pipeline.
---
*Anterior: [`05-pipeline-bitbucket.md`](05-pipeline-bitbucket.md)*
*Siguiente: [`07-terraform-iac.md`](07-terraform-iac.md)*