Módulo 8: Capstone The Andes Cargo Pipeline

1. Introducción al capstone: el pipeline completo, de punta a punta

Descripción

Siete módulos construyeron, pieza por pieza, un pipeline de CI/CD de infraestructura completo y real: ci.yml calcula un plan en cada Pull Request y lo bloquea si intenta destruir la tabla Shipments; apply.yml aplica exactamente ese plan —nunca uno recalculado— solo cuando ese PR se fusiona a main; drift.yml vigila, con un chequeo programado, que nadie haya tocado la infraestructura por fuera de Terraform. Este último módulo no agrega ni un step nuevo a ninguno de los tres archivos. Lo que hace es lo que ningún módulo anterior tuvo espacio para hacer: correr el pipeline completo, de punta a punta, sobre dos escenarios que juntos prueban la tesis entera de esta guía —un cambio real que el pipeline aprueba y aplica, y un cambio peligroso que el mismo pipeline detiene antes de que llegue a tocar nada—, cerrar con la honestidad final sobre qué parte de todo esto solo se vive con una cuenta de GitHub real, trazar la frontera exacta hacia la seguridad que esta guía nombró pero no construyó, y entregar el repositorio completo como una pieza de portfolio que puedes defender en una entrevista técnica sin dudar.

Conexión con el módulo

Este módulo no introduce ningún mecanismo nuevo — es, a propósito, el único módulo de esta guía que no construye nada. Las lecciones 3 y 4 son el recorrido end-to-end que da título a este capstone: un cambio real cruzando ci.ymlapply.yml, y un intento de destrucción que el guardrail del Módulo 6 detiene antes de que exista la posibilidad de aplicar. Las lecciones 5, 6 y 7 son honestidad de frontera —qué falta, y en qué guía vive—. La lección 8 es el cierre: el mismo repositorio andes-cargo-infra/ que empezaste a preparar en el Módulo 1, ahora completo, documentado, y listo para mostrarse.


Lo que ya tienes, módulo por módulo

Antes de correr nada, vale la pena tener el inventario completo en la cabeza — no como un resumen abstracto, sino como la lista exacta de piezas que vas a ver trabajar juntas en este módulo:

MóduloQué construyóVive en
1act instalado (0.2.89), .actrc pineado, andes-cargo-infra/ inicializado como repositorio Git, LocalStack arrancado en el host.actrc, .git/
2La anatomía completa de un workflow; pr-event.json (PR #42, feature/add-shipment-tagsmain) para simular eventos sin una cuenta de GitHub real; .secrets gitignorado.github/act-events/pr-event.json, .secrets
3ci.yml: fmtinitvalidate → conexión a LocalStack → plan → resumen publicado en $GITHUB_STEP_SUMMARY.github/workflows/ci.yml
4Credenciales migradas a secrets.AWS_ACCESS_KEY_ID/secrets.AWS_SECRET_ACCESS_KEY; OIDC mostrado en YAML real, sin ejecutar; Environments dev/production explicados, con act confirmado ignorándolos.github/workflows/ci.yml (migrado), SECRETS-AND-ENVIRONMENTS.md
5apply.yml: needs: + upload-artifact/download-artifact para aplicar el plan exacto, concurrency: contra el doble apply, drift.yml con terraform_wrapper: false.github/workflows/apply.yml, .github/workflows/drift.yml
6git revert como rollback de infraestructura; branch protection explicada (representativa); el guardrail: un grep sobre terraform show -json que bloquea cualquier plan que destruya Shipments, probado con un fixture de state sembrado.github/workflows/ci.yml (con guardrail), .github/workflows/guardrail-demo.yml, .github/guardrail-fixtures/
7El panorama de mercado (GitLab CI, CircleCI, Jenkins), GitOps pull-based (ArgoCD/Flux, nombrado), la frontera con CI/CD de aplicación, un ADR documentando por qué Andes Cargo eligió GitHub Actionsdoc/adr/0001-choosing-cicd-tooling.md

Nada de esta tabla es teórico — cada fila es un archivo real que corriste con act, contra el mismo LocalStack, con la misma cuenta 000000000000 y la misma región us-east-1 que terraform-and-iac-guide dejó configuradas desde el principio. Lo único que faltaba era verlas todas trabajar juntas, bajo presión, sobre un cambio que sí importa y uno que no debería pasar.


El mapa de este módulo: las 8 lecciones

   MÓDULO 8 — CAPSTONE: EL PIPELINE DE ANDES CARGO

   L1  Introducción (esta)                 el inventario completo, qué se entrega
   L2  Repaso de arquitectura               diagrama completo: ci.yml + apply.yml +
                                             drift.yml + guardrail + red act↔LocalStack
   L3  Cambio real, de punta a punta        EJECUTADO — un tag nuevo cruza todo el pipeline
   L4  Cambio rechazado, de punta a punta   EJECUTADO — el guardrail detiene una destrucción
   L5  Lo que solo GitHub real muestra      REPRESENTATIVO — comentarios de PR, aprobación,
                                             branch protection reales
   L6  La seguridad que no se construyó     frontera → cloud-security-and-guardrails-guide
   L7  Lo que Andes Cargo todavía necesita  mapa del ecosistema: EKS, SRE, FinOps
   L8  Proyecto: el capstone completo       EJECUTADO — el repositorio como portfolio
#LecciónQué se ejecuta/practica
1Introducción (esta)El inventario completo de los Módulos 1-7; qué se entrega al cerrar esta guía
2Repaso de arquitectura: el pipeline completoDiagrama ASCII completo: ci.yml + apply.yml + drift.yml, el guardrail, y la red act job ↔ host.docker.internal ↔ LocalStack
3Recorrido end-to-end: un cambio realEJECUTADO: un tag nuevo en el bucket, rama → PR simulado → ci.yml → fusión simulada → apply.yml, verificado con awslocal
4Recorrido end-to-end: un cambio rechazadoEJECUTADO: un intento de destruir Shipments que el guardrail detiene antes de aplicar
5Lo que solo se vive con una cuenta de GitHub realREPRESENTATIVO: comentarios de PR reales, aprobación de environment real, branch protection real
6La seguridad que esta guía no construyóFrontera explícita: OIDC de punta a punta, SAST/DAST, SBOM/cosign/Trivy, políticas como sistema → cloud-security-and-guardrails-guide
7Lo que Andes Cargo todavía necesitaMapa del ecosistema: EKS + ArgoCD, SRE del despliegue, FinOps de infraestructura
8Proyecto final: el pipeline como entregableEJECUTADO: el repositorio completo como pieza de portfolio defendible en una entrevista

Fíjate en la forma del módulo: las lecciones 3 y 4 son la prueba técnica —la misma disciplina de "nada se simula en prosa" que sostuvo toda esta guía, aplicada por última vez, con la presión añadida de que ahora todo tiene que funcionar junto, no aislado—. Las lecciones 5, 6 y 7 son honestidad de frontera, la misma que ya viste puntualmente en el Módulo 4 (OIDC) y el Módulo 6 (conftest), ahora consolidada en un solo lugar antes de cerrar la guía. La lección 8 convierte las siete anteriores en un entregable único.


Qué se ejecuta y qué queda representativo en este módulo, sin ambigüedad

   Lección  ¿Se ejecuta?           Por qué

   L2       No (es diagrama)       Repaso de lo ya construido, sin código nuevo que correr
   L3       Sí                     act pull_request + act push, sobre un cambio real de HCL
   L4       Sí                     act workflow_dispatch, sobre el guardrail del Módulo 6
   L5       No                     Comentarios de PR/aprobación/branch protection son de
                                    GitHub.com real — ya viste por qué act no los alcanza
   L6       No                     Nombra, no construye — la misma frontera del Módulo 4
   L7       No                     Mapa del ecosistema, sin tocar ningún recurso nuevo
   L8       Sí                     La auditoría del repositorio completo, comandos reales

Cuatro de las ocho lecciones —la mitad— son honestidad de frontera sin ejecución, y eso es intencional, no un relleno de cierre: cerrar una guía completa exige, con el mismo rigor que abrirla, decir con precisión qué queda fuera. Las otras cuatro —2, 3, 4 y 8— son donde este módulo gana su lugar: la lección 2 te da el mapa completo antes de correr nada; las lecciones 3 y 4 son la prueba final, bajo presión, de que cada pieza construida en los siete módulos anteriores sigue funcionando cuando se juntan todas; la lección 8 convierte todo eso en algo que puedes enseñarle a otra persona.


Errores comunes

Esperar que este módulo agregue un noveno step, un cuarto workflow, o una pieza técnica nueva (de expectativa). Qué pasa: alguien, acostumbrado a que cada módulo anterior terminara con al menos un archivo .yml nuevo o extendido, busca ese mismo patrón aquí y no lo encuentra. Cómo detectarlo: si tu pregunta al abrir la lección 2 es "¿qué construyo hoy?" en vez de "¿qué ya construí, y cómo se ve completo?". Cómo corregirlo: este módulo integra y prueba, no construye — la única excepción real es el README.md de portfolio de la lección 8, que documenta, no automatiza nada nuevo.

Saltarse las lecciones 5-7 por parecer "solo teoría" (de alcance, el error más costoso de cerrar mal una guía). Qué pasa: alguien, motivado por la ejecución tangible de las lecciones 3 y 4, avanza directo a la lección 8 sin leer la honestidad de frontera de las lecciones 5, 6 y 7. Por qué pasa: después de ver act correr de verdad, una lección sin comandos se siente menos importante. Cómo corregirlo: en una entrevista técnica real, la pregunta "¿qué le falta a este pipeline?" es tan común como "¿cómo funciona?" — las lecciones 5-7 son, literalmente, el guion completo de esa respuesta, con la frontera exacta hacia cada guía hermana de este ecosistema.

Pensar que "capstone" significa "repetir lo ya hecho, sin nada nuevo que aprender" (conceptual). Qué pasa: alguien asume que las lecciones 3 y 4 son solo una repetición de los proyectos del Módulo 3, el Módulo 5 y el Módulo 6, y las lee en diagonal. Cómo corregirlo: cada proyecto anterior probó una mitad del pipeline por separado (CI solo, CD solo, el guardrail aislado). Las lecciones 3 y 4 de este módulo son la primera vez que ves las tres capas —revisión, aplicación, red de seguridad— actuar en la misma corrida, sobre el mismo cambio, sin ningún atajo — la prueba de integración final, no una repetición.


Ejercicios

Ejercicio 1 — Reconstruye el inventario de los siete módulos, de memoria. Sin mirar la tabla de esta lección, escribe qué construyó cada uno de los Módulos 1 a 7, en una frase por módulo.

Ver solución

M1: act instalado y verificado, andes-cargo-infra/ inicializado como repositorio Git, LocalStack arrancado. M2: la anatomía completa de un workflow, simulación de eventos con act -e (pr-event.json), secretos con .secrets. M3: ci.yml completo — fmt/validate/plan/resumen. M4: secretos migrados a secrets.<NOMBRE>, OIDC mostrado sin ejecutar, Environments explicados. M5: apply.yml con needs:/artefactos/concurrencia, drift.yml programado. M6: rollback con git revert, branch protection explicada, el guardrail real contra la destrucción de Shipments. M7: el panorama de mercado y el ADR de decisión de herramienta. Si reconstruiste los siete sin mirar, tienes el inventario completo internalizado, no solo copiado de una tabla.

Ejercicio 2 — Predice qué pasaría si el Módulo 6 no existiera. Sin el guardrail del Módulo 6, ¿qué detendría, hoy, un Pull Request que intenta destruir la tabla Shipments? Responde con precisión, usando lo que ya sabes de los Módulos 3 y 4.

Ver solución

Nada lo detendría automáticamente. ci.yml, sin el guardrail, calcularía el plan con la destrucción incluida y lo publicaría en el resumen del job —exactamente como calcula cualquier otro plan—, pero el job terminaría en verde de todas formas, porque un plan que destruye algo no es, por sí solo, un error de Terraform. La única defensa, sin el guardrail, sería que una persona revisara el contenido del plan a tiempo y decidiera no aprobar la fusión — es decir, dependería completamente del juicio humano en el momento exacto de la revisión, sin ningún control automatizado de respaldo. Esta es exactamente la razón por la que el Módulo 6 existe: convertir "alguien debería darse cuenta" en "el pipeline no deja que pase, incluso si nadie se da cuenta".

Ejercicio 3 — Anticipa la estructura de las lecciones 3 y 4. Basándote en el patrón de "Qué esperar (literal)" que sostuvo toda esta guía, ¿qué tipo de evidencia esperarías ver en la lección 4 que confirme que el guardrail bloqueó el cambio, más allá de leer la palabra "failed" en algún lado?

Ver solución

Siguiendo el mismo patrón que el Módulo 6, lección 7, la evidencia completa debería incluir: (1) el número exacto del plan (algo como X to add, 1 to destroy, con el 1 to destroy como la señal concreta), (2) el mensaje de error exacto del guardrail, citando el recurso específico (aws_dynamodb_table.shipments), y (3), la pieza más importante para la tesis de este módulo, la confirmación de que ningún step posterior corrió — específicamente, que nunca se subió ningún artefacto llamado terraform-plan, lo que significa que apply.yml, aunque alguien lo disparara a mano, no tendría nada que aplicar. Ver solo "Job failed" sin estas tres piezas no sería suficiente evidencia de que la red de seguridad funcionó por la razón correcta.


Resumen y siguiente paso

En esta lección repasaste el inventario completo de los siete módulos anteriores —cada pieza real, cada archivo que sigue viviendo en andes-cargo-infra/— y viste el mapa de las ocho lecciones que cierran esta guía: dos lecciones de prueba técnica final (3 y 4), tres de honestidad de frontera (5, 6 y 7), y un proyecto que convierte todo en un entregable de portfolio (8), precedidas por esta introducción y un repaso de arquitectura (2).

Antes de avanzar deberías poder: nombrar, sin mirar, qué construyó cada uno de los Módulos 1 a 7; explicar por qué este módulo no agrega ninguna pieza técnica nueva al pipeline; y anticipar, con precisión, qué tipo de evidencia esperarías ver en un recorrido end-to-end exitoso y en uno rechazado.

La lección 2 arma el diagrama completo del pipeline —los tres workflows, el guardrail, y la red que conecta el contenedor de act con el LocalStack del host— antes de correr nada, para que las lecciones 3 y 4 tengan, desde el primer comando, el mapa completo en la cabeza.

Recursos

  1. nektosact.com — User Guide — referencia completa de act, la herramienta que este módulo vuelve a usar de punta a punta.
  2. GitHub Docs — GitHub Actions — documentación oficial del motor completo detrás de los tres workflows de Andes Cargo.
  3. HashiCorp Developer — Automate Terraform with GitHub Actions — el patrón plan/apply que sostiene el pipeline entero, citado desde el Módulo 3.
  4. src/paths/aws-cloud-ecosystem/VALIDACION.md (NIEVA) — la brecha de mercado que esta guía completa cierra, citada desde el Módulo 1.