Les cinc lliçons anteriors eren laboratoris: cada pas estava escrit, cada fitxer estava donat i cada fallada estava prevista. Aquesta no. Aquesta és l'encàrrec. Aquí tens un context d'empresa, unes restriccions, un pressupost i una llista de requisits amb els seus criteris d'acceptació, i a partir d'aquí decideixes tu: quina eina, quina estratègia de desplegament, quines proves escriure primer, quins escaneigs executar a cada PR i quins només a main, on posar les portes, què deixar fora i —el més difícil— com justificar cadascuna d'aquestes decisions davant d'algú que no hi era quan les vas prendre.

Ho pots fer sobre un projecte teu (millor, si en tens un) o sobre Mini-Reservalia. El que no pots fer és copiar el pipeline de la 07-05 tal qual: el context de l'encàrrec té restriccions que obliguen a apartar-se'n en almenys tres punts, i trobar-les forma part de l'exercici.

Contingut

  1. L'encàrrec
  2. El context: Citas Norte, S.L.
  3. Requisits obligatoris i criteris d'acceptació
  4. Lliurables
  5. Rúbrica d'autoavaluació
  6. Pla de treball en cinc sessions
  7. Reptes opcionals
  8. Errors típics del projecte final
  9. Errors Comuns i Consells
  10. Exercicis
  11. Conclusió i tancament del curs en la pràctica

  1. L'encàrrec

T'incorpores com a responsable de lliurament a una empresa petita que té un producte en producció i cap pipeline. Despleguen a mà, els divendres no despleguen, i l'última vegada que alguna cosa va sortir malament van trigar dues hores a tornar enrere perquè ningú no recordava quina versió hi havia abans.

El teu encàrrec: portar aquest producte des de l'estat actual fins a un pipeline complet d'extrem a extrem, amb portes de qualitat, artefacte immutable, desplegament automatitzat amb rollback i mètriques que demostrin que la situació ha millorat.

La condició de l'encàrrec: tot el que construeixis ha de poder ser verificat per un revisor extern que no ha parlat amb tu, en menys d'una hora, mirant només el repositori.

Aquesta darrera condició és la que converteix l'exercici en una cosa semblant a la feina real. Un pipeline que només funciona quan tu ets al davant per explicar-lo no és un lliurable: és una dependència.

  1. El context: Citas Norte, S.L.

Les restriccions són les que fan que les decisions s'hagin de justificar. Si tot fos possible, no hi hauria res a decidir.

L'empresa. Citas Norte, S.L. ven un programari de reserves per a petits negocis. Té:

Dada Valor
Clients de pagament 180 negocis
Volum ~4.000 cites al mes
Equip tècnic 3 persones: una tech lead, un backend, una persona a mitges entre frontend i suport
Producte Un monòlit Node.js + PostgreSQL, i una SPA
Entorns actuals Un de sol: producció
Desplegament actual git pull per SSH i pm2 restart, a mà, per la tech lead
Freqüència Un cop cada dues setmanes, dimarts o dimecres al matí
Proves 40 proves unitàries que «gairebé sempre» passen; ningú no les executa abans de desplegar
Última incidència 2 h 20 min de caiguda per un desplegament que va trencar el login

Les restriccions, que són innegociables:

  1. Pressupost d'eines: 0 €/mes. L'empresa no aprova cap despesa nova fins al proper exercici. Tot ha de cabre en plans gratuïts.
  2. Ningú no es pot dedicar a operar el pipeline. L'equip són tres persones i les tres estan al 100 % en producte. Un Jenkins autoallotjat queda descartat per això, no pel que és tècnic.
  3. La finestra de manteniment actual és sagrada per al negoci: els dissabtes al matí, entre les 9:00 i les 13:00, s'hi concentra el 40 % de les reserves del cap de setmana. Una caiguda aquí costa clients.
  4. Hi ha dades personals (nom, telèfon i correu dels clients finals dels 180 negocis). Qualsevol filtració és un incident reportable.
  5. La tech lead se'n va de vacances tres setmanes d'aquí a dos mesos. Durant aquest temps, les altres dues persones han de poder desplegar i revertir sense ella.
  6. L'equip desconfia de l'automatització. El backend, en concret, ha dit literalment: «cada minut que hi dediquem és un minut que no dediquem al que ens paguen». La teva proposta ha de rendir aviat i ho has de poder demostrar amb números.

Tres conseqüències de llegir bé les restriccions (comprova-les contra les teves decisions quan acabis):

  • La restricció 2 i la 6 juntes descarten qualsevol solució que requereixi manteniment continu. Menys peces i més estàndard guanya a més potent.
  • La restricció 5 significa que el rollback ha de ser executable per algú que no el va escriure, amb un botó i sense recordar ordres. Documentar no és opcional aquí: és un requisit funcional.
  • La restricció 3 no vol dir «finestres de desplegament». Vol dir que el temps de restauració importa més que la freqüència. Si pots revertir en 3 minuts, el dissabte deixa de fer por; si trigues 2 hores, cap finestra no et salva.

La línia base que has de mesurar abans de tocar res (és el requisit més incomplert de tot el projecte):

Mètrica DORA Valor actual estimat Com el mesuraries avui
Freqüència de desplegament 0,5 / setmana Comptar els git log de producció
Lead time (commit → producció) ~9 dies Del commit al desplegament en què va entrar
Change failure rate ~20 % (1 de cada 5) Incidències després de desplegar ÷ desplegaments
Time to restore 140 min L'última incidència

  1. Requisits obligatoris i criteris d'acceptació

Cada requisit porta el seu criteri verificable. La fórmula «un revisor extern ha de poder comprovar que…» és deliberada: si no es pot comprovar mirant el repositori i les seves execucions, no compta.

Grup A — Integració contínua (mòdul 2)

# Requisit Criteri d'acceptació
A1 Build reproduïble Un revisor ha de poder executar la mateixa ordre que executa el CI, a la seva màquina, i obtenir el mateix resultat. Lockfile comès, versió de runtime fixada explícitament, cap dependència d'estat previ del runner
A2 Tres capes de proves Existeixen proves unitàries, d'integració (contra una dependència real: base de dades o API) i almenys una end-to-end contra el sistema arrencat. El revisor pot identificar quin fitxer pertany a quina capa sense preguntar
A3 Quality gate Un PR amb una fallada de lint, un test trencat o cobertura per sota del llindar no es pot fusionar. Verificable obrint un PR de prova: el botó de merge està deshabilitat
A4 Artefacte immutable identificat per digest El pipeline produeix un artefacte (imatge de contenidor o equivalent) publicat en un registre, referenciat per digest a tots els desplegaments. El revisor pot veure el digest al resum de l'execució i comprovar que és el mateix que es va desplegar
A5 Protecció de branca main no admet push directe. Existeix almenys una comprovació obligatòria. Verificable intentant un push directe: és rebutjat
A6 Retroalimentació ràpida El temps des del push fins al primer resultat significatiu està mesurat i documentat, i és inferior a 10 minuts

Grup B — Desplegament continu (mòdul 3)

# Requisit Criteri d'acceptació
B1 Separació CI/CD Són workflows diferents amb permisos diferents. El de CD no s'executa si el de CI va fallar. Verificable al YAML i a l'historial d'execucions
B2 Almenys un entorn amb aprovació Existeix un entorn el desplegament del qual requereix una acció humana explícita. El revisor pot veure a l'historial una execució que va estar en estat Waiting
B3 Desplegament idempotent Executar el desplegament dues vegades amb el mateix artefacte no canvia res la segona vegada. Verificable rellançant el workflow i llegint el log
B4 Smoke test posterior al desplegament Existeix una verificació automàtica que falla si el desplegament va ser dolent. Ha d'estar demostrat: una execució històrica on el smoke test va bloquejar un desplegament
B5 Promoció sense reconstruir L'artefacte que arriba a l'últim entorn és byte a byte el mateix que es va validar al primer. Hi ha una comprovació explícita del digest al log
B6 Rollback cronometrat < 10 min Existeix un procediment de rollback executable amb una acció, i una execució històrica amb el temps mesurat al resum
B7 Rollback executable per una altra persona La restricció 5 del context. Documentat en un runbook amb l'ordre exacta i sense coneixement tàcit

Grup C — Pràctiques avançades (mòdul 4)

# Requisit Criteri d'acceptació
C1 Memòria cau i paral·lelització amb temps mesurats El PIPELINE.md documenta el temps abans i després d'aplicar memòria cau i paral·lelització, amb captures o enllaços a les execucions concretes
C2 Lògica en scripts, YAML prim Els passos amb lògica són a scripts/, són executables en local i el YAML els invoca. Verificable: el revisor pot executar ./scripts/desplegar.sh a la seva màquina
C3 Almenys una peça reutilitzable Una composite action, un reusable workflow o un script compartit entre almenys dos workflows, amb la seva documentació
C4 Gestió de dependencies automatitzada Dependabot o equivalent configurat, amb agrupació i política de què s'automerge i què no
C5 Sense «verd fals» Cap `

Grup D — Seguretat (mòdul 4 i lliçó 07-05)

# Requisit Criteri d'acceptació
D1 Mínim privilegi permissions: explícit a tots els workflows. Cap write-all. El permís per defecte del repositori és de lectura
D2 Accions fixades per SHA Totes les accions de tercers per SHA de 40 caràcters amb comentari de versió. Verificable amb un grep
D3 Els cinc escaneigs Secrets, SCA, SAST, imatge i configuració. Tots cinc reporten a un lloc consultable
D4 Política de severitats Existeix un document que diu què trenca el build i què no, i el pipeline la implementa. Les excepcions tenen justificació i data de caducitat
D5 Sense secrets de llarga vida al camí crític Es fa servir OIDC o tokens efímers. Si hi ha algun secret persistent, és en un entorn protegit i justificat
D6 Dades personals protegides La restricció 4 del context: cap prova fa servir dades reals, cap log no imprimeix dades personals, cap bolcat de base de dades no surt de l'entorn de producció

Grup E — Observabilitat (mòdul 3 i lliçó 07-04)

# Requisit Criteri d'acceptació
E1 Mètriques exposades L'aplicació exposa mètriques consultables que cobreixen almenys tres de les quatre senyals d'or
E2 Un SLO amb pressupost d'error Documentat amb els seus quatre elements (indicador, llindar, objectiu, finestra) i l'aritmètica del pressupost escrita
E3 Una alerta per símptoma Definida amb un for:, amb runbook enllaçat, i demostrada: hi ha evidència d'haver-la vist passar a firing
E4 Les quatre DORA calculades automàticament Un job programat les calcula i les publica. El revisor pot veure almenys dues execucions per comparar
E5 La millora demostrada El PIPELINE.md compara la línia base de l'apartat 2 amb les mètriques actuals

Total: 29 requisits. No s'espera que tots quedin impecables; s'espera que tots estiguin considerats i que les absències siguin decisions documentades, no oblits.

  1. Lliurables

4.1 El repositori

Públic (o privat amb accés al revisor), amb historial real: branques, PR, comprovacions, execucions amb èxit i execucions amb fallada. Un repositori amb un sol commit gegant no demostra un pipeline; demostra un fitxer.

Estructura suggerida:

projecte/
├── .github/
│   ├── workflows/          ci.yml, cd.yml, rollback.yml, seguretat.yml, dora.yml
│   ├── actions/            composite actions propies
│   └── dependabot.yml
├── scripts/                tota la logica: desplegar, smoke, vigilar, dora...
├── src/  test/
├── seguretat/              POLITICA.md, excepcions.json, .trivyignore
├── observabilitat/         compose, prometheus.yml, alertes.yml, SLO.md, RUNBOOK.md
├── Dockerfile  .dockerignore
├── PIPELINE.md             ← lliurable 4.2
├── POSTMORTEM.md           ← lliurable 4.3
└── README.md               que es, com s executa, badges

4.2 PIPELINE.md — decisions i contrapartides

Aquest és el lliurable que més es nota i el que pitjor es fa. No és documentació de què fa el pipeline —això es llegeix al YAML—: és el registre de per què és així i què es va sacrificar.

Plantilla mínima:

# Decisions del pipeline

## Context i restriccions
Resum de les restriccions de l'encàrrec i com condicionen el que segueix.

## Línia base (abans)
| Mètrica | Valor | Com es va mesurar |

## Decisions

### D1 — Eina de CI/CD: GitHub Actions
**Alternatives considerades:** GitLab CI, CircleCI, Jenkins autoallotjat.
**Decisió:** GitHub Actions.
**Motiu:** el codi ja és a GitHub (restricció d'identitat, 06-07);
pla gratuït suficient per al volum (restricció 1); zero operació
(restricció 2).
**Contrapartida acceptada:** acoblament al proveïdor. Es mitiga posant
tota la lògica a `scripts/` (C2): una migració costaria ~5 dies, no 4 setmanes.
**Quan revisar aquesta decisió:** si el volum de minuts supera el pla
gratuït, o si l'empresa canvia de proveïdor de repositoris.

### D2 — Estratègia de desplegament: rolling, no canary
...

### D3 — Què NO hem fet i per què
- **No hi ha entorns efímers per PR.** Cost de manteniment alt per a un
  equip de tres persones (restricció 2). Es revisarà quan l'equip creixi.
- **No hi ha proves de càrrega al pipeline.** El volum actual (4.000
  cites/mes) no les justifica.
...

## Mesuraments
| Canvi | Abans | Després | Execució de referència |
| Memòria cau de dependencies | 3 min 40 s | 1 min 15 s | #128 vs #131 |

## Després
| Mètrica DORA | Abans | Ara | Font |

La secció «Què NO hem fet i per què» és la que distingeix una feina professional d'un exercici. Un pipeline sense límits explícits és un pipeline que creixerà sense control fins que algú l'abandoni.

4.3 POSTMORTEM.md — una fallada provocada expressament

Provoca una fallada real, deixa-la arribar fins on el teu pipeline la aturi, i escriu el post-mortem. Suggeriments de fallada, en ordre de dificultat:

Fallada On s'hauria d'aturar Què demostra
Un test trencat A CI, al primer job El bàsic
Una regressió que les proves no cobreixen Al smoke test de staging Que les capes es complementen
Una migració de BD incompatible cap enrere Al desplegament, o al rollback El que s'ha après a la 04-06
Una versió que arrenca bé i es degrada als 5 minuts A la vigilància posterior, amb rollback automàtic El bucle complet tancat

Estructura del post-mortem, sense culpables:

# Post-mortem: <títol descriptiu de l'impacte, no de la causa>

**Data:** · **Durada de l'impacte:** · **Severitat:** · **Autor:**

## Impacte
Què va deixar de funcionar, per a qui i durant quant. En termes d'usuari,
no d'infraestructura: «els negocis no podien veure els forats del dia»,
no «el contenidor estava unhealthy».

## Cronologia
| Hora | Esdeveniment | Qui / què ho va detectar |
|---|---|---|
| 10:32 | Merge del PR #47 | — |
| 10:38 | Desplegament a staging | pipeline |
| 10:39 | El smoke test falla | pipeline (automàtic) |
| 10:39 | Desplegament a producció bloquejat | pipeline |

## Causa arrel
La tècnica dels cinc perquès, fins a arribar a alguna cosa sistèmica.
Si la resposta final és «un desenvolupador es va equivocar», no has arribat al final:
la pregunta següent és «per què el sistema va permetre que aquell error hi arribés?».

## Què va funcionar
Igual d'important que el que va fallar. Aquí es justifica la inversió en el pipeline.

## Què no va funcionar

## Accions correctives
| # | Acció | Responsable | Data | Estat |
Amb responsable i data, o no és una acció: és un desig.

## Lliçons

4.4 Panell o resum de mètriques

Un panell de Grafana versionat, o —si no muntes Prometheus— un $GITHUB_STEP_SUMMARY d'un job programat amb les quatre DORA, l'estat de l'SLO i el consum del pressupost d'error. El que s'avalua és que existeixi una superfície on algú que no ets tu pugui veure com va la cosa sense demanar-te res.

  1. Rúbrica d'autoavaluació

Aplica-te-la amb honestedat. La columna «Insuficient» descriu el que la majoria lliura al primer intent.

Criteri Insuficient Correcte Excel·lent
Build reproduïble El pipeline «funciona» però no es pot reproduir en local Lockfile, runtime fixat, mateixa ordre en local i a CI A més, verificat periòdicament per un job que executa el build en una màquina neta
Proves Només unitàries, o cobertura sense asserts Tres capes identificables, llindar de cobertura que trenca A més, test de contracte entre implementacions, casos límit documentats i detecció de flaky
Quality gate Les comprovacions existeixen però no bloquegen main protegida amb comprovació obligatòria, comprovada pel costat negatiu Job agregador que desacobla la protecció de la forma del pipeline
Artefacte Es reconstrueix a cada entorn Imatge publicada, desplegada per digest Signada, amb SBOM, i la signatura es verifica abans de desplegar
Separació CI/CD Un sol workflow ho fa tot Workflows separats amb permisos diferents A més, el CD es pot llançar a mà amb un digest arbitrari per a reintents
Porta d'aprovació No n'hi ha Entorn amb revisor requerit Aprovació condicional: automàtica si les mètriques van bé, humana si no
Idempotència Redesplegar reinicia el servei sense necessitat El script detecta que ja està desplegat i no fa res A més, el script rebutja referències mutables i valida abans de tocar res
Smoke test Només comprova que respon 200 Comprova salut, funcionalitat i versió desplegada A més, comprova que els errors continuen donant error, i hi ha una execució on va bloquejar
Rollback Existeix com a document Workflow executable, cronometrat, < 10 min < 3 min, automàtic per mètriques, i executat amb èxit per una altra persona
Rendiment Sense mesurar Memòria cau i paral·lelització aplicades, temps documentats Execució selectiva per canvis, i el cost en minuts també mesurat
Reutilització Tot copiat i enganxat entre workflows Una peça compartida i documentada Reusable workflow versionat, amb inputs, outputs i la seva pròpia prova
Mínim privilegi Sense permissions Explícit al workflow i ampliat per job Verificat provocant la fallada, i documentat què necessita cada job
Escaneigs Cap, o amb ` true`
Secrets Al repositori o en variables globals Secrets d'entorn, abast mínim OIDC / tokens efímers; cap secret de llarga vida al camí crític
Observabilitat Només logs Mètriques exposades i un panell SLO amb pressupost, alerta demostrada i desplegaments anotats al panell
DORA No es calculen Calculades a mà un cop Job programat, històric i tendència comparada amb la línia base
PIPELINE.md Descriu què fa el YAML Explica per què, amb alternatives Inclou contrapartides, límits explícits i quan revisar cada decisió
POSTMORTEM.md Narra la fallada Cronologia, causa arrel, accions Sense culpables, amb «què va funcionar», i les accions tenen responsable i data
Reproduïbilitat per un tercer Només tu saps executar-ho README amb els passos Un revisor extern ho verifica sencer en una hora sense preguntar-te res

Com puntuar-te: compta quantes files cauen a cada columna.

  • Majoria a Insuficient: tens un pipeline que funciona però no és defensable. Prioritza el grup A i el B4/B6.
  • Majoria a Correcte: és un pipeline professional, lliurable. És l'objectiu realista del curs.
  • Diverses a Excel·lent: estàs per damunt del que tenen molts equips en producció. Tria'n dues o tres per portar a excel·lent en comptes de pujar-les totes alhora.

  1. Pla de treball en cinc sessions

Cinc sessions de 2-4 hores. L'ordre no és arbitrari: cada sessió deixa alguna cosa funcionant i mesurable, i cap no depèn d'acabar la següent per aportar valor. És el mateix principi dels set increments de la 05-04.

Sessió 1 — Mesurar i fer verificable el projecte (sense tocar el pipeline)

  1. Mesura la línia base. Les quatre DORA amb les dades que tinguis, encara que siguin aproximades. Anota-les al PIPELINE.md avui, perquè d'aquí a tres setmanes no les podràs reconstruir.
  2. Aconsegueix que el projecte es verifiqui amb una sola ordre: npm ci && npm run lint && npm test && npm run build. Si això no funciona en una màquina neta, arregla-ho abans d'escriure una línia de YAML.
  3. Escriu la prova que falta per al bug més recent que hàgiu tingut.
  4. Comet el lockfile si no hi és.

Lliurable de la sessió: una ordre que verifica el projecte i la línia base escrita.

Sessió 2 — CI i la primera porta

  1. ci.yml incremental, com a la 07-01: primer que s'executi, després que instal·li i provi, després jobs en paral·lel, després memòria cau. Mesura els temps a cada pas i anota'ls.
  2. Les tres capes de proves (07-02). Comença per la que més por et fa trencar.
  3. Cobertura amb llindar 2-3 punts per sota del valor actual.
  4. Protecció de main amb un job agregador com a única comprovació requerida.
  5. Trenca alguna cosa expressament i comprova que bloqueja.

Lliurable: A1-A6 complerts, amb els temps abans/després de la memòria cau.

Sessió 3 — Artefacte i desplegament

  1. Dockerfile multietapa, no-root, HEALTHCHECK (07-03).
  2. Publicació al registre per digest, amb el digest visible al resum.
  3. scripts/desplegar.sh idempotent i executable en local. Escriu-lo abans que el YAML: si comences pel YAML, acabaràs amb lògica dins del YAML.
  4. scripts/smoke.sh que verifiqui salut, funcionalitat i versió.
  5. cd.yml amb dos entorns i aprovació al segon.
  6. rollback.yml cronometrat. Executa'l i anota el temps.
  7. Provoca un desplegament dolent i comprova que el smoke test l'atura.

Lliurable: B1-B7 complerts, amb l'execució del rollback cronometrada i la del desplegament bloquejat.

Sessió 4 — Seguretat

  1. Auditoria del que portes construït, amb la llista de la 07-05.
  2. permissions de mínim privilegi, provocant una fallada per entendre-ho.
  3. Accions per SHA + Dependabot.
  4. Els cinc escaneigs, un cada vegada, comprovant que cadascun detecta alguna cosa real abans de passar al següent.
  5. Política de severitats escrita i el job de caducitat d'excepcions.
  6. SBOM, signatura i verificació abans de desplegar.

Lliurable: D1-D6, amb evidència que cada escaneig ha detectat alguna cosa.

Sessió 5 — Observabilitat, tancament i documentació

  1. /metriques amb les senyals d'or (07-04).
  2. SLO amb l'aritmètica del pressupost escrita.
  3. Una alerta per símptoma, disparada expressament i amb captura.
  4. Job programat de DORA. Executa'l dues vegades amb dies de diferència per tenir tendència.
  5. Provoca la fallada del post-mortem i escriu-lo.
  6. PIPELINE.md complet, inclosa la secció de què no has fet.
  7. Passa't la rúbrica.

Lliurable: E1-E5, PIPELINE.md, POSTMORTEM.md i l'autoavaluació.

Consell sobre el ritme. Si vas curt de temps, sacrifica el grup E abans que el B. Un pipeline que desplega i reverteix però no es mesura és incomplet; un que es mesura però no pot revertir és perillós. I si has de triar un sol requisit dels 29, que sigui B6: rollback cronometrat. És el que converteix la por en un número.

  1. Reptes opcionals

Per quan el bàsic estigui tancat. Cadascun val per si sol.

Repte Què afegeix Dificultat Referència
Canary real amb decisió automàtica Desplegament per pes + mesurament + promoció o retirada automàtica Alta 03-04, 07-03 ex. 2
Entorns efímers per PR Un entorn per pull request, destruït en tancar-lo Alta 02-07, 06-02
Matriu de dues eines El mateix pipeline a GitHub Actions i a GitLab CI, comparant l'esforç real Mitjana Mòdul 6 sencer
IaC de l'entorn de destinació Terraform que crea l'amfitrió, el registre i la xarxa, amb plan al PR i apply després d'aprovació Alta 03-03
Migracions de BD al pipeline Expand and contract, migració versionada, i un rollback que no perd dades Molt alta 04-06
Política d'admissió externa Un script que valida signatura, SBOM, escaneigs i procedència, consultat pel CD Mitjana 07-05 repte
Repartiment de shards per temps Balanceig real de la suite amb històric Mitjana 07-02 repte

El més instructiu de tots, si vols tancar el curs amb alguna cosa que et canviï la perspectiva, és la matriu de dues eines: reimplementar el pipeline a GitLab CI t'obliga a separar el que és el teu procés del que és sintaxi de GitHub, i aquesta separació és exactament la que defensava la 06-07. Es triga menys del que sembla —la feina real ja és als scripts— i el resultat és una taula d'equivalències que has escrit tu.

  1. Errors típics del projecte final

Aquests tres són, de bon tros, els que més es repeteixen. Tots tres tenen la mateixa forma: fer la part visible abans que la part que la sosté.

Error 1: començar pel YAML en comptes de pels scripts

Com es manifesta. S'obre ci.yml i es comença a escriure. Al cap de tres dies hi ha 200 línies de YAML amb run: | de vint línies cadascun, i l'única manera de provar un canvi és fer push i esperar quatre minuts.

Per què és greu. El cicle de depuració passa de segons a minuts, i multiplicat per cada intent. Un problema que en local es resol en cinc iteracions de deu segons es converteix en cinc iteracions de quatre minuts, amb commits d'«arreglar CI», «arreglar CI 2», «ara sí». A més, aquesta lògica no és testejable, no és revisable i no es pot executar en una emergència si el CI està caigut.

L'ordre correcte:

1. L ordre funciona al teu terminal
2. L ordre es en un script amb arguments i valors per defecte
3. El script es al repositori i te la seva documentacio
4. El YAML CRIDA el script

Prova de foc: pots desplegar sense GitHub Actions? Si la resposta és no, la lògica és al lloc equivocat.

Error 2: automatitzar abans de tenir una prova que valgui

Com es manifesta. Un pipeline preciós que desplega en noranta segons... el codi trencat. Les proves existeixen, passen sempre, i no cobreixen res del que es trenca de debò.

Per què és greu. Automatitzar el desplegament multiplica la velocitat a la qual arriben els canvis a producció. Si la verificació és feble, el que has multiplicat és la velocitat a la qual arriben els bugs. Un pipeline ràpid sobre proves dolentes és objectivament pitjor que el desplegament manual del principi, perquè el manual almenys incloïa una persona mirant.

L'ordre correcte: una prova que detecti l'últim bug real que vau tenir, abans d'automatitzar el desplegament. Si no la pots escriure, no automatitzis encara: automatitza només fins a staging i deixa producció manual fins que la xarxa de seguretat existeixi.

El senyal d'alarma: si la teva suite no ha estat mai en vermell per un bug real —només per errors de sintaxi—, no està provant res.

Error 3: no mesurar la línia base i quedar-se sense poder demostrar la millora

Com es manifesta. Tres setmanes de feina, un pipeline excel·lent, i a la reunió amb la direcció: «i això què ha millorat?»«Doncs... va tot molt millor».

Per què és greu. És l'error que fa que la següent inversió no s'aprovi. Recorda la restricció 6 del context: el backend ja pensa que això és temps robat al producte. Sense números, té raó ell, perquè el seu escepticisme sí que està basat en alguna cosa concreta (les hores invertides) i la teva defensa no.

I hi ha un agreujant tècnic: la línia base no es pot reconstruir a posteriori. Un cop el pipeline està muntat, l'«abans» ja no existeix. És informació que es destrueix en fer la feina.

L'ordre correcte: mesurar a la sessió 1, abans de tocar res, encara que sigui amb estimacions grolleres. Quatre números i la data. Deu minuts de feina que valen per les tres setmanes següents.

Com es presenta després:

Mètrica Abans (12/03) Ara (28/04) Canvi
Freqüència de desplegament 0,5 / setmana 6 / setmana ×12
Lead time 9 dies 4 h −98 %
Change failure rate 20 % 6 % −70 %
Time to restore 140 min 3 min −98 %
Temps de la tech lead a desplegar 45 min/desplegament 0 −6 h/mes

Aquesta darrera fila és la que tanca la discussió, i per això convé tenir-la: tradueix la feina a hores de persones, que és la unitat en què pensa qui aprova pressupostos. És exactament l'argument del TCO de la 06-07, aplicat al teu propi projecte.

  1. Errors Comuns i Consells

Símptoma: el projecte s'encalla a la sessió 3 i no arriba a producció. Causa: intentar muntar l'entorn de destinació «de debò» (un VPS, Kubernetes, AWS) abans de tenir el pipeline. Arranjament: fes servir una destinació simulada com la de la 07-03 i acaba el circuit complet. Un pipeline que desplega a un contenidor local però cobreix les set peces de B1-B7 val infinitament més que mig pipeline apuntant a infraestructura real. Canvia la destinació al final; és la part més fàcil de canviar.

Símptoma: 29 requisits semblen inabastables i no es comença. Causa: intentar fer-los en paral·lel. Arranjament: el pla de cinc sessions està ordenat per dependència. Fes A sencer abans de tocar B. Un grup acabat val més que cinc a mitges, perquè els grups incomplets no es poden verificar.

Símptoma: el PIPELINE.md acaba sent una descripció del YAML. Causa: documentar mentre s'escriu el codi, quan encara no hi ha perspectiva. Arranjament: escriu cada decisió en el moment en què descartes una alternativa, amb una línia: «descartat X perquè Y». Al final, aquestes línies són el document. Si no vas descartar mai res, no vas prendre decisions: vas copiar.

Símptoma: la rúbrica surt majoritàriament en «Correcte» i no saps què millorar. Consell: no ho pugis tot a «Excel·lent». Tria'n dues o tres amb criteri: les que més redueixin el risc en el teu context concret. Amb les restriccions de Citas Norte, les tres candidates òbvies són el rollback (restricció 5), la verificació de signatura (restricció 4, dades personals) i les DORA amb tendència (restricció 6, cal convèncer algú).

Consell — no ho facis tot tu. Si tens amb qui, demana a algú que verifiqui el teu repositori seguint els criteris d'acceptació, sense que li expliquis res. Els punts on t'hagi de preguntar alguna cosa són exactament els que et falten per documentar. És la prova més barata i la més reveladora del projecte.

Consell — el pipeline no està mai acabat. Quan tanquis els 29 requisits, el pipeline serà bo per al context d'avui. Amb el doble d'equip i deu vegades el trànsit, tres de les teves decisions seran incorrectes. Per això cada decisió del PIPELINE.md porta «quan revisar aquesta decisió»: no és burocràcia, és reconèixer que un pipeline és un organisme viu i que l'alternativa a revisar-lo és reescriure'l sencer d'aquí a dos anys.

  1. Exercicis

Aquests tres no són variacions del laboratori: són extensions del mateix projecte final, pensades per fer-les després de lliurar-lo.

Exercici 1: la revisió creuada

Intercanvia repositoris amb una altra persona que hagi fet el projecte (o audita un repositori públic real que faci servir GitHub Actions). Aplica els 29 criteris d'acceptació sense parlar amb ningú i escriu un informe d'auditoria amb les troballes prioritzades.

Exercici 2: la prova de les vacances

La restricció 5 del context: la tech lead se'n va tres setmanes. Demostra que el sistema hi sobreviu.

Exercici 3: el mateix pipeline amb la meitat del temps

Redueix a la meitat el temps del teu pipeline sense treure cap verificació. Documenta cada canvi amb el seu mesurament.

Solucions

Solució 1. Plantilla d'informe d'auditoria:

# Auditoria del pipeline de <repositori>
**Auditor:** · **Data:** · **Temps emprat:** · **Commit auditat:**

## Resum executiu
Tres frases: estat general, el risc més greu, la millora de més
relació valor/esforç.

## Verificació de criteris
| # | Requisit | Compleix | Evidència | Notes |
|---|---|---|---|---|
| A1 | Build reproduïble | ✅ | Vaig executar `npm ci && npm test` en net: OK | — |
| A4 | Artefacte per digest | ⚠️ | Execució #88: publica per digest però el CD fa servir `:main` | **La promoció no garanteix el mateix artefacte** |
| B4 | Smoke test | ❌ | No vaig trobar cap execució on bloquegés | Pot ser que no s'hagi provat mai |

## Troballes prioritzades
### H1 (Alt) — El CD desplega per tag, no per digest
**Evidència:** `cd.yml:47` fa servir `ghcr.io/...:main`.
**Risc:** entre la validació a staging i el desplegament a producció, un altre
merge pot moure el tag. Producció executaria codi no validat.
**Arranjament:** resoldre el digest un cop en un job `preparar` i propagar-lo per
`outputs`. Cost: ~30 min.

## El que està ben fet
(Obligatori. Una auditoria que només llista problemes no es llegeix sencera i
no s'aplica.)

## Preguntes que vaig haver de fer a l'autor
Cadascuna d'aquestes és documentació que falta.

El que ensenya aquest exercici: auditar la feina d'un altre és la manera més ràpida de veure els forats de la teva. Gairebé tothom troba al repositori aliè dues o tres coses que també li falten al propi i que no havia vist en setmanes.

Solució 2. El protocol de la prova:

# Prova de continuïtat («les vacances»)

## Regla
Durant l'exercici, qui va escriure el pipeline **no parla, no toca el teclat
i no respon preguntes**. Només observa i pren notes.

## Escenari 1 — Desplegament rutinari (objectiu: < 15 min)
L'altra persona ha de, fent servir només el repositori:
1. Localitzar com es desplega.
2. Llançar-ho.
3. Aprovar la porta de producció.
4. Verificar que la versió nova està servint trànsit.

## Escenari 2 — Rollback sota pressió (objectiu: < 10 min)
Es desplega una versió dolenta (trenca `/salut`). L'altra persona ha de:
1. Adonar-se que alguna cosa va malament (l'alerta va arribar? a qui?).
2. Trobar a quina versió tornar.
3. Executar el rollback.
4. Confirmar la recuperació.

## Escenari 3 — Fallada del pipeline (objectiu: desplegar sense CI)
GitHub Actions està caigut (simula-ho deshabilitant el workflow) i cal
desplegar un pedaç urgent. Existeix un camí manual documentat?

## Registre
| Escenari | Temps | Ho va aconseguir? | On es va encallar | Documentació que faltava |

## Accions correctives
Cada encallament és una fallada del SISTEMA, no de la persona. Es converteix en:
- Una línia al runbook, o
- Un valor per defecte millor, o
- Un missatge d'error més clar.

Les tres fallades que apareixen gairebé sempre en aquest exercici, per si vols avançar-t'hi:

  1. Trobar el digest anterior. Ningú no sap on mirar. Arranjament: imprimir-lo al resum de cada desplegament i acceptar l'input buit al rollback (07-03 exercici 1).
  2. L'alerta no va arribar a ningú. Estava configurada a Prometheus però sense destinatari. Arranjament: Alertmanager amb un canal real, i una prova que hi arriba.
  3. El camí manual no existeix. Tot el coneixement és dins del YAML. Arranjament: scripts/desplegar.sh executable en local (requisit C2), documentat al runbook amb l'ordre literal.

Si el teu projecte passa l'escenari 3, has complert el criteri més exigent de tot el curs: el pipeline és una comoditat, no una dependència.

Solució 3. L'estratègia, en ordre de rendibilitat:

# Reducció del temps de pipeline

## Mesurament inicial (execució #142)
| Job | Durada | És camí crític? |
|---|---|---|
| qualitat | 1m 10s | No |
| test (×4) | 3m 40s | **Sí** |
| cobertura | 2m 50s | No |
| build | 2m 20s | Sí |
| publicar | 4m 10s | **Sí** |
| **Total (paret)** | **10m 30s** | |

Regla prèvia: **només compta el camí crític**. Optimitzar un job que corre en
paral·lel amb un altre de més lent no estalvia ni un segon de temps de paret.

## Canvis aplicats

### C1 — Memòria cau de dependencies (−1m 50s)
`cache: 'npm'` als 5 jobs. De la segona execució endavant.
Abans: `npm ci` 22s/job · Després: 4s/job.

### C2 — Memòria cau de capes de Docker (−2m 30s)
`cache-from: type=gha` / `cache-to: type=gha,mode=max`.
El major estalvi individual: el mòdul natiu va deixar de recompilar-se.

### C3 — Reordenar el Dockerfile (−40s)
`COPY package*.json` i `npm ci` ABANS de `COPY . .`.
Sense això, qualsevol canvi de codi invalida la capa de dependencies
i la memòria cau de C2 no serveix de res. **C3 és el que fa que C2 funcioni.**

### C4 — Fusionar `cobertura` al job de test (−0s de paret, −2m de màquina)
No era al camí crític: no estalvia temps de paret, però sí cost.
Es documenta perquè el cost també és una mètrica.

### C5 — Execució selectiva (−variable)
Els jobs pesants només si canvien els fitxers rellevants, amb job agregador
que sempre reporta (07-01 exercici 2). En PR de només documentació:
10m 30s → 45s.

### C6 — Descartat: runners més grans
Reduiria ~30 % però costa diners. Restricció 1 de l'encàrrec.
**Es documenta el descart perquè no s'hagi de tornar a avaluar.**

## Resultat (execució #171)
| Job | Abans | Després |
|---|---|---|
| test (×4) | 3m 40s | 1m 30s |
| publicar | 4m 10s | 1m 20s |
| **Total (paret)** | **10m 30s** | **4m 15s** (−60 %) |
| Minuts de màquina | 14m 10s | 7m 30s (−47 %) |

## Verificacions NO eliminades
Cap. Els mateixos 5 escaneigs, la mateixa cobertura, la mateixa matriu.
`git diff` dels workflows: només memòria cau, ordre i condicions.

La lliçó d'aquest exercici és C3: la memòria cau de Docker no funciona si el Dockerfile està mal ordenat, i molta gent afegeix C2, no veu millora i conclou que «la memòria cau no serveix». L'ordre de les capes és el 80 % del resultat, i és gratis.

  1. Conclusió i tancament del curs en la pràctica

Si has arribat fins aquí amb el projecte lliurat, tens al teu repositori una cosa que molts equips en producció no tenen: un pipeline que integra, verifica en tres capes, construeix un artefacte immutable identificat pel seu contingut, l'escaneja de cinc maneres diferents, el signa, el desplega després d'una porta explícita, comprova que el desplegament va funcionar, promociona el mateix artefacte sense reconstruir-lo, reverteix en minuts —sol, si les mètriques empitjoren—, i es mesura a si mateix per poder demostrar que tot això serveix d'alguna cosa.

Però el lliurable que més durarà no és el YAML. Són els dos documents.

El PIPELINE.md, perquè conté l'única cosa que no es pot deduir llegint el codi: per què és així i què es va sacrificar a canvi. D'aquí a un any, quan algú —potser tu— es pregunti per què no hi ha canary o per què les accions estan fixades per aquells SHA estranys, la resposta hi serà escrita, amb la seva data i amb la condició que obligaria a revisar-la. Un pipeline sense aquest document es reescriu sencer cada dos anys perquè ningú no gosa tocar el que no entén.

I el POSTMORTEM.md, perquè documenta l'única prova que de debò importa: que el sistema va fallar i ho va aguantar. Qualsevol pot ensenyar un pipeline en verd. Ensenyar-ne un que es va posar en vermell pel motiu correcte, al lloc correcte, i que es va recuperar en tres minuts, és ensenyar que funciona.

Hi ha una última cosa que aquest mòdul t'ha fet fer sense dir-t'ho explícitament, i convé anomenar-la ara. A cada laboratori has trencat alguna cosa expressament: un test, un desplegament, un secret, una consulta SQL, un endpoint lent. Això no era decoració pedagògica. És la pràctica professional que separa qui té un pipeline de qui confia en el seu pipeline: verificar pel costat negatiu. Qualsevol pot comprovar que un control deixa passar el que és bo; comprovar que atura el que és dolent requereix fabricar el que és dolent, i gairebé ningú no ho fa. Si t'emportes un sol costum del curs, que sigui aquest: cada vegada que afegeixis una porta, provoca la fallada que hauria d'aturar, i no donis la porta per bona fins que ho hagis vist.

Amb això es tanca la part pràctica i, amb ella, la matèria del curs. Has recorregut els principis (mòduls 1 a 4), quatre contextos reals (mòdul 5), la maquinària (mòdul 6) i la construcció d'extrem a extrem amb les teves mans (mòdul 7). El que queda ja no és matèria: és on anar després.

El mòdul 8 és el mapa d'aquesta continuació. Les lectures recomanadesContinuous Delivery, Accelerate, The DevOps Handbook, l'SRE Workbook— que donen el fonament i les dades darrere de gairebé tot el que has aplicat aquí. Les comunitats i fòrums on es discuteixen aquests problemes quan se surten del que cap en un curs. Les eines i plugins addicionals que van quedar fora per espai i que resolen problemes concrets que ja sabràs reconèixer: gestió de secrets amb Vault, lliurament progressiu amb Flagger o Argo Rollouts, plataformes internes de desenvolupament, polítiques com a codi. I la ruta d'aprenentatge i certificacions, amb l'ordre raonable per aprofundir segons cap on et vulguis moure —plataforma, SRE, seguretat de la cadena de subministrament— i quines certificacions valen realment la pena en cada cas.

Comença per 08-01: Lectures Recomanades. I, quan ho facis, llegeix-ho amb el pipeline al davant: ara tens un sistema real sobre el qual provar cada idea, que és exactament el que faltava la primera vegada que vas obrir aquest curs.

Curs de CI/CD: Integració i Desplegament Continu

Mòdul 1: Introducció al CI/CD

Mòdul 2: Integració Contínua (CI)

Mòdul 3: Desplegament Continu (CD)

Mòdul 4: Pràctiques Avançades de CI/CD

Mòdul 5: Implementació de CI/CD en Projectes Reals

Mòdul 6: Eines i Tecnologies

Mòdul 7: Exercicis Pràctics

Mòdul 8: Recursos Addicionals

© Copyright 2026. Tots els drets reservats