9.4 KiB
05 - Pipeline Bitbucket
Cómo funciona el pipeline de 7 pasos que despliega
proyectosacc.
1. ¿Qué es un pipeline?
Un pipeline es una serie de pasos automáticos que se ejecutan cada vez que alguien sube código al repositorio.
En Cómputo Contable Soft, todos los pipelines web usan 7 pasos estandarizados. Esto significa que, sin importar el proyecto, siempre hay los mismos pasos con los mismos nombres.
2. Los 7 pasos del pipeline
Paso 1: 01_image-setup
Prepara la computadora virtual donde se va a compilar todo.
Qué hace:
- Actualiza los paquetes del sistema.
- Instala herramientas necesarias:
openssh-client,openjdk-21-jdk,aws-cli. - Configura las llaves SSH y los
known_hosts. - Carga los scripts de utilería (
logger_bash.sh,telegram_alert.sh).
💡 En palabras simples: como cuando llegas a una cocina nueva y primero lavas los trastes, prendes la estufa y sacas los utensilios.
Paso 2: 02_repo-config
Descarga todos los repositorios que necesita la aplicación.
Qué hace:
- Clona el repositorio principal de la aplicación.
- Clona los repositorios de componentes compartidos (por ejemplo,
cmp-commons,cmp-security). - Clona
ci-cd-commons(scripts base de CCsoft).
💡 En palabras simples: bajas todos los ingredientes de la receta antes de empezar a cocinar.
Paso 3: 03_dependencies
Compila o descarga todo lo que la aplicación necesita para funcionar.
Qué hace:
- Compila las librerías compartidas.
- Descarga dependencias de Maven, Gradle, npm, etc.
- Publica las librerías locales si es necesario.
💡 En palabras simples: preparas la masa, cortas las verduras y sacas los condimentos antes de armar el platillo final.
Paso 4: 04_build
Compila el frontend React y la API backend.
Qué hace:
- Frontend: ejecuta
npm run build(onpm ci && npm run build) para generar la carpetabuild/con el React estático. - Backend: ejecuta el comando de build de la API (por ejemplo,
./gradlew clean bootJarpara Java). - Genera los archivos finales: la carpeta
build/para el frontend y el.jarpara la API.
💡 En palabras simples: aquí cocinamos dos platillos: la entrada (frontend) y el plato fuerte (API).
Paso 5: 05_publish
Sube el frontend a S3 y el artefacto de la API a Amazon S3.
Qué hace:
- Frontend: sincroniza la carpeta
build/al bucket S3 designado para el sitio estático (aws s3 sync build/ s3://bucket-name). - Backend: sube el
.jar(o artefacto equivalente) al bucket S3 para que la EC2 lo descargue después. - Esto evita transferir archivos grandes directamente por SSH y permite recuperar versiones anteriores fácilmente.
💡 En palabras simples: pones la entrada en el mostrador (S3) y el plato fuerte en la bandeja de la cocina (S3) para servirlo después.
Paso 6: 06_install
Descarga el artefacto de la API en el servidor EC2.
Qué hace:
- Se conecta por SSH al servidor EC2 como
thoth. - Ejecuta un script de preparación que descarga el
.jardesde S3 y lo coloca en/home/thoth/deploy/artifacts/current/. - También hace una copia de seguridad de la versión anterior.
- Aún no reinicia el servicio: eso ocurre en el paso 7.
💡 En palabras simples: pones el plato fuerte en el plato y lo dejas listo, pero aún no lo sirves.
Paso 7: 07_deploy
Invalida la caché de CloudFront, despliega la API y verifica que todo esté saludable.
Qué hace:
- Invalida la caché de CloudFront (
aws cloudfront create-invalidation) para que los usuarios vean la nueva versión del frontend inmediatamente. - Se conecta por SSH al servidor EC2 como
thothy ejecutabash /home/thoth/deploy/setup/deploy.sh. - El script
deploy.shcrea o actualiza el servicio desystemd, detiene la versión anterior e inicia la nueva con el usuarioosiris. - Ejecuta un health check en la API para verificar que responde correctamente.
- Envía una notificación por Telegram con el resultado.
💡 En palabras simples: actualizas el menú en todos los restaurantes (CloudFront) y sirves el plato fuerte calentito desde la cocina (EC2).
3. Diagrama del pipeline
┌─────────────────────────────────────────────────────────────────────────────┐
│ BITBUCKET PIPELINE │
│ │
│ 1. image-setup ▶ Instala herramientas │
│ │ │
│ ▼ │
│ 2. repo-config ▶ Descarga repositorios │
│ │ │
│ ▼ │
│ 3. dependencies ▶ Compila librerías y dependencias │
│ │ │
│ ▼ │
│ 4. build ▶ Compila React frontend + API backend (.jar) │
│ │ │
│ ▼ │
│ 5. publish ▶ Sube frontend a S3 web + API .jar a S3 artifacts │
│ │ │
│ ▼ │
│ 6. install ▶ Prepara la API en el servidor EC2 │
│ │ │
│ ▼ │
│ 7. deploy ▶ Invalida CloudFront, reinicia API y health check │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
4. ¿Cómo se conecta el pipeline a la EC2?
La conexión se hace por SSH (Secure Shell).
- El pipeline tiene guardada la llave privada de
thothen una variable segura de Bitbucket. - Al llegar al paso
05_publisho06_install, el pipeline decodifica la llave y la guarda en/root/.ssh/sacc4_key. - Ejecuta un comando
sshusando esa llave para ejecutar scripts remotos. - La llave pública correspondiente ya está en el archivo
~/.ssh/authorized_keysdel usuariothothen la EC2. - ¡La puerta se abre y el pipeline puede ejecutar comandos en el servidor!
Ejemplo del comando que usa el pipeline
ssh -p 22 \
-i /root/.ssh/sacc4_key \
-o StrictHostKeyChecking=no \
thoth@<IP_DE_LA_EC2> \
"bash /home/thoth/deploy/setup/deploy.sh"
5. ¿De dónde salen los secrets?
Los secrets (contraseñas, llaves, tokens) viven en las variables de repositorio de Bitbucket.
Cómo se configuran
- Entra al repositorio en Bitbucket.
- Ve a Repository settings > Pipelines > Repository variables.
- Agrega cada variable y márcala como Secured 🔒.
- Las variables marcadas como secured se ofuscan en los logs (aparecen como
***).
Variables principales
| Variable | Descripción |
|---|---|
PROYECTOSACC_SSH_KEY |
Llave privada SSH (en base64) dedicada para conectar al servidor |
PROYECTOSACC_SERVER_IP |
IP pública de la EC2 |
PROYECTOSACC_SSH_PORT |
Puerto SSH (normalmente 22) |
PROYECTOSACC_SERVER_USER |
Usuario SSH para despliegue (thoth) |
PROYECTOSACC_TELEGRAM_BOT_TOKEN |
Token del bot de Telegram para alertas |
PROYECTOSACC_TELEGRAM_CHAT_ID |
ID del chat donde llegan las alertas |
AWS_ACCESS_KEY_ID |
Credencial de AWS para subir a S3 |
AWS_SECRET_ACCESS_KEY |
Credencial secreta de AWS |
CLOUDFRONT_DISTRIBUTION_ID |
ID de la distribución de CloudFront para invalidaciones |
S3_FRONTEND_BUCKET |
Nombre del bucket S3 donde se publica el frontend |
⚠️ Regla de oro
NUNCA escribas secrets directamente en el código del pipeline (bitbucket-pipelines.yml). Siempre usa variables de entorno.
6. Integración con proyectos CI/CD compartidos
proyectosacc no trabaja solo. Se conecta con otros proyectos de CI/CD de la empresa que proveen piezas reutilizables:
ci-cd-commons: scripts base compartidos comotelegram_alert.shylogger_bash.sh.ci-cd-saac4: módulos de Terraform, patrones de infraestructura y scripts de despliegue específicos para la familia SACC.
Esto significa que parte del pipeline y de los scripts de despliegue vienen de esos repositorios, no de este. Es como armar una casa con ladrillos que ya están hechos en otra fábrica.
Anterior: 04-usuarios-y-permisos.md
Siguiente: 06-scripts-de-despliegue.md