estrategias de devops sprint2 - galoryzen/equipo8-pfinal GitHub Wiki
Evidencias de Estrategias de DevOps - Sprint 2
Video Evidencias Sprint 1
Dejamos este video pues no ha cambiado mucho el flujo
1. Parametrización de Integración Continua / Despliegue Continuo
El proyecto cuenta con 4 workflows de GitHub Actions configurados en .github/workflows
1.1 Backend CI/CD (backend.yml)
- Trigger: push y pull request a
main, workflow dispatch manual. - Detección inteligente de cambios: usa
dorny/paths-filterpara identificar cuáles de los 5 microservicios fueron modificados (auth, catalog, booking, payment, notification). También detecta cambios enbackend/libs/(librerías compartidas). - Ejecución selectiva: solo ejecuta
pytestsobre los servicios que realmente cambiaron, optimizando el tiempo de CI. - Coverage gate: cada servicio debe tener minimo 70% de cobertura de lineas (
--cov=app --cov-fail-under=70), alineado con el objetivo OBJ-002. - Pipeline CD (solo en push a main): despliega automaticamente solo los servicios modificados:
- Configura credenciales AWS via OIDC (
role-to-assume) - Pull de imagen
latestdesde ECR como cache de capas Docker (inline cache con BuildKit) - Build de imagen Docker con context en
backend/y Dockerfile del servicio - Push a Amazon ECR (
travelhub/{servicio}) con tagslatesty commit SHA - Actualiza task definition de ECS con la nueva imagen
- Despliega en cluster ECS Fargate (
travelhub) con--force-new-deployment
- Configura credenciales AWS via OIDC (
- Job de resultado:
backend-resultcorre siempre (if: always()) y reporta el estado consolidado para los status checks de la rama.
1.2 Frontend CI/CD (frontend.yml)
- Trigger: push y pull request a
main, workflow dispatch manual. - Detección de cambios: filtra por modificaciones en
frontend/**. - Pipeline CI:
- Instala dependencias con
pnpm install --frozen-lockfile - Formato:
pnpm format:check(Prettier) — falla si hay archivos sin formatear - Lint estricto:
pnpm lint:precommit(ESLint,--max-warnings 5) - i18n parity gate:
__tests__/i18n-keys-parity.test.ts— bloquea literales UI en codigo y verifica que las claves dees/een/esten alineadas (SCRUM-272) - Accesibilidad (axe) + cobertura:
pnpm test:coveragecorre los tests de componentes + auditoria axe en jsdom (SCRUM-273) - Build estatico (
pnpm build) que generaout/ - Sube artefacto del build
- Instala dependencias con
- Pipeline CD (solo en push a main):
- Descarga artefacto del build
- Configura credenciales AWS via OIDC (
role-to-assume) - Sincroniza
out/a S3 (aws s3 sync --delete) - Invalida caché de CloudFront
- Smoke test: verifica HTTP 200 en la URL de producción
- Job de resultado:
frontend-resultreporta estado consolidado.
1.3 Mobile CI (mobile.yml)
- Trigger: push y pull request a
main, workflow dispatch manual. - Detección de cambios: filtra por
mobile/**. - Pipeline:
- Instala dependencias con
npm ci - Verificación de tipos TypeScript (
npx tsc --noEmit) - Tests con cobertura (
npm run test:coverage)
- Instala dependencias con
- Job de resultado:
mobile-resultreporta estado consolidado.
1.4 Deploy Backend Manual (deploy-backend.yml)
- Trigger:
workflow_dispatchmanual con input de servicios a desplegar (separados por coma). - Uso: si se presenta un despliegue fallido o se requiere desplegar un servicio específico fuera del flujo normal, se puede ejecutar este workflow manualmente desde la pestaña de Actions. Solo requiere ingresar los nombres de los servicios a desplegar (ej:
auth,catalog). - Pipeline por cada servicio seleccionado:
- Pull de imagen
latestdesde ECR como cache de capas Docker - Build de imagen Docker con inline cache (BuildKit)
- Push a Amazon ECR (
travelhub/{servicio}) - Actualiza task definition de ECS
- Despliega en cluster ECS Fargate (
travelhub)
- Pull de imagen
1.5 Enforcement pre-commit (Husky)
Desde Sprint 2 (PR #113) el frontend ejecuta un hook pre-commit gestionado por Husky (frontend/travel-hub/.husky/pre-commit) que corre localmente los mismos gates del CI:
pnpm format:check
pnpm lint:precommit
Objetivo: atajar errores de formato, lint, i18n y a11y antes de que el commit llegue a CI. Cubre las historias SCRUM-272 (i18n) y SCRUM-273 (a11y).
1.6 Reglas de rama (Branch Rulesets)
La rama main tiene configuradas las siguientes reglas mediante GitHub Rulesets:
| Regla | Configuración |
|---|---|
| Protección contra eliminación | Activada |
| Non-fast-forward | Bloqueado |
| Pull request requerido | Solo merge por squash |
| Dismiss stale reviews on push | Activado |
| Status checks requeridos | backend-result, frontend-result, mobile-result |
| Strict status checks | Activado (rama debe estar al día con main) |
Esto significa que ningún código llega a main sin pasar los 3 pipelines de CI.
2. Sprint Backlog y Asignación por Integrante
Sprint 2 — Resumen (en curso)
| Metrica | Valor |
|---|---|
| Historias | 19 (incluye 2 tecnicas: SCRUM-272 i18n y SCRUM-273 a11y) |
| Story Points | 34 pts |
| Velocity parcial | S2-W1: 15 pts completados (9 historias) |
| Work in Progress | SCRUM-199 (In Review, 2 pts), SCRUM-200 (In Progress, 2 pts) |
| Business Value | 46% acumulado (+17.5% vs cierre de S1) |
| Foco | Reservas, carrito, pagos, registro hotel/agencia, a11y + i18n, dashboard hoteles |
Objetivo del Sprint: habilitar el flujo completo reserva → pago → confirmacion (web y movil) + iniciar el portal de gestion para hoteles, soportado por una arquitectura de eventos (saga por coreografia: EventBridge+SQS en AWS, RabbitMQ en local).
Asignacion por Integrante — Sprint 2
| Integrante | Historias | Pts | Foco |
|---|---|---|---|
| Isaac Blanco | SCRUM-83, 84, 272, 273 | 10 | Carrito + pago web, i18n, a11y (pre-commit + CI axe) |
| Raul Lopez | SCRUM-122, 123, 124, 125, 127, 128 | 8 | Flujo completo de reserva y pago en movil |
| Jose Manuel Garcia | SCRUM-160, 185, 199, 200 | 8 | Portal de gestion hotel: confirmar/rechazar reserva, promos, email |
| Nicolas Calero | SCRUM-86, 107, 172, 188, 190 | 8 | Pago seguro, refunds, registro hotel/agencia, dashboard, reportes |
3. Commits y Pull Requests
Convenciones de commits
El equipo utiliza commits convencionales con prefijos semanticos:
feat:/feature:para nuevas funcionalidadesfix:para correccionesrefactor:para reestructuracion de codigoci:para cambios en pipelines de CI/CDdocs:para documentaciontests:para pruebas
Ramas
Cada historia de usuario o tarea se desarrolla en una rama dedicada que sigue una convencion de nombres:
feature/{id-o-descripcion}— funcionalidades nuevasfix/descripcion— correcciones de bugsrefactor/descripcion— cambios de refactorizacion- PRs se mergean a
mainvia squash merge, manteniendo un historial limpio
4. Flujo de Trabajo y Estrategia de Versionamiento
Estrategia de branching: GitHub Flow
El equipo sigue GitHub Flow, una estrategia simple y efectiva:
Flujo de trabajo
- Crear rama desde
maincon nombre descriptivo basado en la historia de usuario - Desarrollar la funcionalidad con commits frecuentes y descriptivos
- Abrir Pull Request hacia
main - CI automatico ejecuta los 3 pipelines (backend, frontend, mobile) segun los archivos modificados
- Los 3 status checks deben pasar (
backend-result,frontend-result,mobile-result) — es un requisito obligatorio configurado en las reglas de rama - Squash merge a
main— consolida todos los commits de la rama en uno solo, manteniendo un historial limpio - CD automatico — si hay cambios en frontend, se despliega automaticamente a S3 + CloudFront; si hay cambios en backend, se despliegan solo los microservicios modificados a ECS Fargate
Protecciones
- No se puede hacer push directo a
main— siempre via PR - Status checks estrictos — la rama debe estar actualizada con
mainantes de mergear - Squash-only — unica estrategia de merge permitida
- Dismiss stale reviews — si se pushean cambios nuevos, las revisiones anteriores se invalidan
5. Ejecucion de Pruebas
Estrategia de pruebas
Basada en el documento formal de estrategia (docs/DocumentoEstrategiaPruebas.pdf), con objetivo de minimo 70% de cobertura automatizada (OBJ-002).
Backend — Pytest
- Framework: pytest con soporte asyncio (
asyncio_mode = "auto") - Arquitectura hexagonal: las pruebas usan mocks de puertos (CachePort, database session) permitiendo testing aislado de la logica de negocio
- Ejecucion en CI:
pytest tests/ -v --cov=app --cov-fail-under=70por cada servicio modificado - Ejecucion local:
make test s=catalogomake coverage s=catalog
Frontend — Vitest
- Framework: Vitest v4.1 + React Testing Library v16 + jsdom
- Cobertura: proveedor v8, reportes en texto y lcov
- Alcance: archivos en
app/**/*.{ts,tsx,js,jsx} - Accesibilidad: suite de auditoria con
jest-axesobre componentes clave (SCRUM-273) - i18n parity: test dedicado (
__tests__/i18n-keys-parity.test.ts) que falla si hay literales UI en codigo o si las claves de locales divergen (SCRUM-272) - Ejecucion en CI:
pnpm test:coverage - Ejecucion local:
pnpm testopnpm test:coverage
Mobile — Jest
- Framework: Jest v29 + jest-expo v55 + Testing Library React Native v13
- Soporte ESM:
node --experimental-vm-modules - Ejecucion en CI:
npm run test:coverage - Ademas incluye verificacion de tipos con
npx tsc --noEmit
Ejecucion en CI
Las pruebas se ejecutan automaticamente en cada PR y push a main. Evidencia de ejecuciones recientes:
Las pruebas son un requisito bloqueante para mergear: si alguno de los 3 pipelines falla, el PR no puede ser mergeado.
Coverage gate en los 3 layers
A partir de semana 2, los 3 layers tienen coverage gate >= 70% enforceado en CI:
| Layer | Mecanismo | Cobertura actual |
|---|---|---|
| Backend | pytest --cov-fail-under=70 (por servicio) |
82.8% |
| Frontend | Vitest thresholds: { lines: 70 } |
78.2% |
| Mobile | Jest coverageThreshold: 70% |
91.2% |
Si cualquier layer baja de 70%, el CI falla y el PR no puede ser mergeado.
6. Peer Review (Opcional)
El flujo de trabajo del equipo incluye pull requests como mecanismo de peer review:
- Todos los cambios pasan por PR antes de llegar a
main - Las reglas de rama tienen configurado dismiss stale reviews on push, lo que invalida revisiones previas cuando se agregan nuevos commits
- Se han hecho algunas reviews entre compañeros, aunque no es un requisito formal ni obligatorio. El enfoque principal ha sido asegurar que los pipelines de CI pasen correctamente.
7. Revision Automatica de Codigo (Opcional)
Linting y formateo
El proyecto utiliza herramientas de revision automatica de codigo:
Backend — Ruff
- Linting:
make lint s={servicio}(ruff check) - Formateo:
make format s={servicio}(ruff format)
Frontend — Prettier + ESLint
- Formato:
pnpm format:check/pnpm format(Prettier) — bloqueante en CI y pre-commit - Linting:
pnpm lint:precommit(ESLint con--max-warnings 5) — bloqueante en CI y pre-commit - Configurado con reglas de Next.js + plugin jsx-a11y
- Husky pre-commit corre format + lint antes de permitir el commit local
Frontend — Accesibilidad (a11y)
axe-linteractivo en el IDE (VS Code)- Tests automatizados con
jest-axecorren en CI como parte depnpm test:coverage - GitHub Action bloquea merge de PRs con errores de a11y (SCRUM-273)
Frontend — i18n
- Test
__tests__/i18n-keys-parity.test.tsbloquea merges con literales UI o con claves desbalanceadas entrelocales/es/ylocales/en/(SCRUM-272)
Mobile — TypeScript
- Verificacion de tipos:
npx tsc --noEmit(ejecutado en CI)
Status checks como puerta de calidad
Los 3 status checks requeridos (backend-result, frontend-result, mobile-result) actuan como revision automatica: si las pruebas o el build fallan, el codigo no puede entrar a main. Esto garantiza que todo codigo mergeado:
- Compila correctamente
- Pasa las pruebas automatizadas (incluyendo auditoria axe de a11y)
- Cumple con las verificaciones de tipos (mobile)
- Respeta el formato Prettier y el lint estricto (frontend)
- No introduce literales UI ni rompe la paridad de locales i18n (frontend)