Reservalia ja té un artefacte immutable, un cd.yml que desplega tot sol i tres entorns que surten del mateix mòdul de Terraform. Queda la pregunta que hem anat esquivant: en l'instant exacte en què la versió nova substitueix la vella, com es fa aquell relleu? Avui Reservalia deixa que ECS reemplaci tasques sense criteri i creua els dits. Hi ha almenys sis maneres de fer-ho, i triar malament és la diferència entre un desplegament invisible i un tall de servei a les onze del matí. En aquesta lliçó veiem les sis amb el seu cost, el seu risc, el seu temps i la seva facilitat de tornada enrere; muntem un rolling update fi i un canary per pes d'ALB a Reservalia; entenem per què els health checks sostenen tot això; i acceptem el requisit que totes comparteixen: dues versions del programari conviuran, i s'han d'entendre.
Contingut
- Els quatre eixos amb què es compara una estratègia
- Recreate: apagar i encendre
- Rolling update: substituir per tandes
- Blue-green: dos entorns complets i un interruptor
- Canary: exposar una fracció del trànsit
- Proves A/B: la que no és una estratègia tècnica
- Shadow: trànsit duplicat sense conseqüències
- Taula comparativa de les sis
- Rolling update a ECS amb números reals
- Un canary per pes d'ALB al 10 %
- Health checks: liveness, readiness i el paper de
/salut - Compatibilitat cap enrere: dues versions convivint
- Què tria Reservalia per a
prod - Errors Comuns i Consells
- Exercicis
- Conclusió
- Els quatre eixos amb què es compara una estratègia
Cap estratègia no és "la bona". Cadascuna intercanvia quatre magnituds, i convé tenir-les anomenades abans de mirar la primera:
- Cost d'infraestructura: quanta capacitat extra cal durant el relleu. Duplicar un entorn de producció durant vint minuts costa diners de debò.
- Risc d'exposició: quin percentatge d'usuaris pateix la fallada si la versió nova és defectuosa. És la variable que mou el change failure rate de les mètriques DORA.
- Temps de desplegament: quant triga el relleu complet. Un desplegament de dues hores no es fa cinc vegades per setmana.
- Complexitat de la tornada enrere: quant es triga i quant s'ha de pensar per tornar a la versió anterior. És el time to restore, que a Reservalia és de 68 minuts i ha de baixar a menys de 10.
Hi ha un cinquè eix implícit: la complexitat operativa. Una estratègia que ningú de l'equip no entén a les tres de la matinada és una mala estratègia per bons que siguin els seus números.
- Recreate: apagar i encendre
En què consisteix. S'aturen totes les instàncies de la versió antiga i després s'arrenquen les de la nova. És el que feia el "ritual del divendres" de Reservalia amb el seu SFTP.
| Eix | Valoració |
|---|---|
| Cost d'infraestructura | Cap: mai no hi ha més capacitat de l'habitual |
| Risc | Tall de servei garantit, per al 100 % d'usuaris |
| Temps | Curt en total, però amb indisponibilitat mesurable |
| Tornada enrere | Un altre desplegament complet, amb un altre tall |
Quan triar-la. Quan el tall és acceptable (eines internes, processos per lots nocturns) o quan és inevitable: si la versió nova és incompatible amb l'antiga i no poden conviure ni un segon, recreate és l'única opció honesta. És l'estratègia per defecte de qualsevol sistema sense balancejador al davant.
- Rolling update: substituir per tandes
En què consisteix. Se substitueixen les instàncies per grups: s'arrenca una tanda de la versió nova, s'espera que passi el health check, es retira la mateixa quantitat de l'antiga, i es repeteix fins a acabar. Durant el procés conviuen les dues versions.
| Eix | Valoració |
|---|---|
| Cost | Baix: capacitat extra només durant el relleu (0 % a 100 % segons paràmetres) |
| Risc | Progressiu, però no controlat: no tries qui veu la versió nova |
| Temps | Mitjà: tantes tandes com grups, cadascuna amb la seva espera d'estabilitat |
| Tornada enrere | Un altre rolling update en sentit invers: minuts, no segons |
Quan triar-la. És el valor per defecte raonable per a serveis sense estat darrere d'un balancejador. És el que ECS fa de manera nativa i el que Reservalia farà servir com a base.
- Blue-green: dos entorns complets i un interruptor
En què consisteix. S'aixeca un entorn verd complet amb la versió nova, al costat del blau que continua servint trànsit. Es prova el verd en aïllament i, quan convenç, es canvia l'encaminament del balancejador de cop. El blau es manté encès una estona per si cal tornar.
flowchart TD
ALB["ALB api.reservalia.com"] -->|100%| BLAU["Grup blau · v1 · 4 tasques"]
ALB -.->|0%, es prova a part| VERD["Grup verd · v2 · 4 tasques"]
VERD -->|commutacio| SW["ALB passa a 100% verd<br/>el blau queda de reserva"]
| Eix | Valoració |
|---|---|
| Cost | Alt: capacitat duplicada durant tota la finestra |
| Risc | Tot o res, però amb possibilitat de provar abans d'exposar |
| Temps | El relleu en si és instantani; preparar el verd, no |
| Tornada enrere | La millor de totes: retornar l'encaminament al blau, segons |
Quan triar-la. Quan el time to restore és la prioritat absoluta i el pressupost permet duplicar capacitat. Compte amb un detall que s'oblida sempre: la base de dades no es duplica, així que la compatibilitat d'esquema continua sent obligatòria.
- Canary: exposar una fracció del trànsit
En què consisteix. Es desplega la versió nova en un grup petit i se li envia un percentatge reduït del trànsit —el canari a la mina—. S'observen mètriques d'error i latència durant uns minuts i, si es comporten, es puja el pes per etapes: 10 % → 50 % → 100 %. Si es degraden, es baixa a 0 %.
| Eix | Valoració |
|---|---|
| Cost | Moderat: una fracció de capacitat extra durant la promoció |
| Risc | El més baix: una fallada afecta només el percentatge exposat |
| Temps | El més llarg: les esperes d'observació són deliberades |
| Tornada enrere | Molt ràpida: pes a 0 %, sense redesplegar res |
Quan triar-la. Per a canvis de risc mitjà-alt en serveis amb trànsit suficient perquè les mètriques siguin significatives. Amb 9.000 cites al mes, un canary al 10 % de Reservalia veu unes 30 peticions de reserva al dia: cal donar-li temps o combinar-lo amb mètriques de trànsit total, no només de l'endpoint crític.
- Proves A/B: la que no és una estratègia tècnica
Es confon constantment amb el canary perquè el mecanisme s'hi assembla: dues versions servint alhora i un repartiment d'usuaris. La diferència és quina pregunta respon cadascuna.
| Canary | Proves A/B | |
|---|---|---|
| Pregunta | Aquesta versió és correcta? | Aquesta variant converteix millor? |
| Mètrica que decideix | Errors, latència, saturació | Conversió, retenció, ús |
| Repartiment | Aleatori per pes, indiferent | Segmentat i estable per usuari |
| Durada | Minuts | Dies o setmanes |
| Qui decideix | Enginyeria / automatisme | Producte |
| Final esperat | Promocionar o avortar | Quedar-se amb la variant guanyadora |
Una prova A/B no és un mecanisme de desplegament: s'implementa normalment sobre feature flags dins d'una única versió desplegada, que és justament el tema de la lliçó següent. Confondre-les porta a errors cars, com avortar un desplegament tècnicament correcte perquè una variant converteix pitjor, o mantenir dues versions desplegades durant setmanes "per mesurar".
- Shadow: trànsit duplicat sense conseqüències
En què consisteix. El trànsit real es copia cap a la versió nova, les respostes de la qual es descarten: els usuaris continuen rebent les de la versió antiga. Serveix per validar rendiment i correcció amb càrrega real i risc zero de cara a l'usuari.
| Eix | Valoració |
|---|---|
| Cost | Alt: capacitat per processar el trànsit dues vegades |
| Risc | Zero per a l'usuari… si no hi ha efectes secundaris |
| Temps | No substitueix el desplegament: és una fase prèvia |
| Tornada enrere | Trivial: es talla el mirall |
El parany: si la versió mirall escriu a la base de dades, envia correus de confirmació de cita o cobra, el "risc zero" desapareix de cop. El shadow exigeix aïllar els efectes secundaris, i per això només compensa en canvis d'alt risc: reescriptures d'un motor de càlcul, migracions de tecnologia, refactoritzacions profundes de calcularForats.
- Taula comparativa de les sis
| Estratègia | Cost infra | Risc d'exposició | Temps | Rollback | Triar quan… |
|---|---|---|---|---|---|
| Recreate | Cap | Molt alt (tall total) | Baix, amb caiguda | Un altre tall | El tall és acceptable o les versions no poden conviure |
| Rolling update | Baix | Mitjà, no controlat | Mitjà | Minuts | Servei sense estat, risc normal: el valor per defecte |
| Blue-green | Alt (x2) | Alt però provat abans | Commutació instantània | Segons | El time to restore mana i hi ha pressupost |
| Canary | Moderat | Baix i graduable | Alt (esperes) | Segons | Canvi arriscat i trànsit suficient per mesurar |
| A/B testing | Moderat | Cap de tècnic | Dies o setmanes | No aplica | El dubte és de producte, no de correcció |
| Shadow | Alt (x2) | Nul si no hi ha efectes | Fase prèvia | Trivial | Reescriptures crítiques que cal validar amb càrrega real |
- Rolling update a ECS amb números reals
ECS implementa el rolling update amb dos percentatges sobre desired_count. A prod, Reservalia té 4 tasques del servei reservalia-api:
minimumHealthyPercent: el mínim de tasques sanes que hi ha d'haver en tot moment, en percentatge dedesired_count.maximumPercent: el màxim de tasques simultànies, incloent-hi les de les dues versions.
# infra/moduls/entorn/main.tf, dins d aws_ecs_service.api
deployment_minimum_healthy_percent = 100 # mai menys de 4 tasques sanes
deployment_maximum_percent = 200 # mai mes de 8 tasques en totalAmb desired_count = 4, aquests dos números es tradueixen així:
| Configuració | Tasques mínimes sanes | Tasques màximes | Efecte real |
|---|---|---|---|
| 100 / 200 | 4 | 8 | Arrenca fins a 4 de noves abans de retirar-ne cap. Sense pèrdua de capacitat, cost extra durant el relleu |
| 100 / 150 | 4 | 6 | Tandes de 2. Sense pèrdua de capacitat, menys cost, més lent |
| 50 / 100 | 2 | 4 | Sense cost extra, però la capacitat cau a la meitat durant el relleu |
| 0 / 100 | 0 | 4 | Recreate encobert: es pot quedar sense tasques sanes |
Reservalia fa servir 100 / 200 a prod i 50 / 100 a dev, on una davallada de capacitat no molesta ningú i l'estalvi sí que importa. La seqüència que executa ECS amb 100/200 és: arrencar 4 tasques v2 → esperar que les 4 passin el health check del grup de destinació → registrar-les a l'ALB → desregistrar les 4 tasques v1 i esperar el connection draining → aturar-les.
# Seguir un desplegament en curs
aws ecs describe-services \
--cluster reservalia-prod --services reservalia-api \
--query 'services[0].deployments[].{estat:status,versio:taskDefinition,desitjades:desiredCount,corrent:runningCount}'Mentre el desplegament avança apareixen dues entrades: la PRIMARY (versió nova) i l'ACTIVE (l'anterior, en retirada). Quan només queda PRIMARY, el relleu ha acabat; és justament el que espera aws ecs wait services-stable a cd.yml.
Un paràmetre més, i és el que evita la meitat dels ensurts:
deployment_circuit_breaker {
enable = true
rollback = true # si les tasques noves no arriben a estables, ECS reverteix sol
}Amb el circuit breaker, si les tasques de la versió nova fallen repetidament en arrencar, ECS avorta el desplegament i restaura la definició de tasca anterior sense intervenció humana. És la tornada enrere automàtica més barata que existeix en aquesta plataforma.
- Un canary per pes d'ALB al 10 %
Per a canvis delicats —tocar calcularForats, per exemple— Reservalia afegeix un mode canary. La peça clau és que un ALB pot repartir trànsit entre diversos grups de destinació amb pesos.
# Enviar el 10 % del transit al grup canary
aws elbv2 modify-listener \
--listener-arn "$LISTENER_ARN" \
--default-actions '[{
"Type": "forward",
"ForwardConfig": {
"TargetGroups": [
{"TargetGroupArn": "'"$TG_ESTABLE"'", "Weight": 90},
{"TargetGroupArn": "'"$TG_CANARY"'", "Weight": 10}
],
"TargetGroupStickinessConfig": {"Enabled": true, "DurationSeconds": 3600}
}
}]'Dos detalls importants:
TG_ESTABLEiTG_CANARYsón dos grups de destinació, servits per dos serveis ECS (reservalia-apiireservalia-api-canary) que corren el mateix artefacte o un de diferent: és el pes, no el desplegament, el que decideix l'exposició.TargetGroupStickinessConfigfa que un usuari que ha caigut al canary hi continuï durant una hora. Sense això, un mateix usuari saltaria entre versions petició a petició, amb resultats incoherents si el canvi afecta la interfície.
La promoció per etapes s'automatitza com un job amb pauses d'observació:
canary:
runs-on: ubuntu-22.04
environment: prod
steps:
- name: Desplegar el canary amb el digest nou
run: ./infra/scripts/desplegar.sh reservalia-prod reservalia-api-canary "$DIGEST"
- name: Etapa 10 % durant 10 minuts
run: |
./infra/scripts/pes-canary.sh 10
sleep 600
./infra/scripts/comprovar-metriques.sh # falla si error rate > 1 % o p95 > 400 ms
- name: Etapa 50 % durant 10 minuts
run: |
./infra/scripts/pes-canary.sh 50
sleep 600
./infra/scripts/comprovar-metriques.sh
- name: Promocionar al 100 %
run: ./infra/scripts/desplegar.sh reservalia-prod reservalia-api "$DIGEST" && ./infra/scripts/pes-canary.sh 0comprovar-metriques.sh consulta CloudWatch i retorna un codi de sortida diferent de zero si el canary es comporta pitjor que l'estable; la fallada del pas atura el pipeline amb el canary encara al 10 %, és a dir, amb el 90 % dels usuaris intactes. Com es defineixen aquells llindars amb criteri és matèria de la lliçó 03-06.
- Health checks: liveness, readiness i el paper de
/salut
/salutTotes les estratègies anteriors depenen d'una resposta binària: aquesta instància nova està llesta per rebre trànsit? Qui la dona és el health check, i n'hi ha dos tipus que sovint es confonen.
| Liveness | Readiness | |
|---|---|---|
| Pregunta | El procés continua viu? | Pot atendre peticions ara? |
| Si falla | Reiniciar el contenidor | Treure'l del balancejador, sense reiniciar |
| Ha de comprovar | Gairebé res: que el bucle respon | Les seves dependències crítiques |
| Qui el fa servir a Reservalia | Health check del contenidor ECS | Health check del grup de destinació de l'ALB |
A la 03-02, el smoke test cridava un únic /salut que feia les dues coses alhora; ara ho separem, perquè barrejar-les és exactament l'origen del problema. A Reservalia, /salut passa a ser el liveness: respon 200 amb un cos mínim i no toca la base de dades. Ha de ser barat perquè es crida cada pocs segons i perquè, si comprovés PostgreSQL, una caiguda de la base de dades provocaria el reinici en bucle de tots els contenidors, convertint una degradació en una caiguda total.
// apps/api/src/rutes/salut.ts
router.get('/salut', (_req, res) => {
res.status(200).json({ estat: 'viu', sha: process.env.SHA_DESPLEGAMENT });
});
router.get('/salut/llest', async (_req, res) => {
try {
await pool.query('SELECT 1'); // 1
const { rows } = await pool.query(
'SELECT COUNT(*)::int AS pendents FROM migracions WHERE aplicada_el IS NULL');
if (rows[0].pendents > 0) throw new Error('migracions pendents'); // 2
res.status(200).json({ estat: 'llest' });
} catch (e) {
res.status(503).json({ estat: 'no-llest', motiu: String(e) }); // 3
}
});- El readiness sí que comprova la connexió al pool de PostgreSQL: una tasca que no pot consultar la base de dades no ha de rebre cites.
- També comprova que no quedin migracions pendents; una tasca amb esquema desactualitzat respon
503en lloc de trencar peticions reals. - El codi
503és el que fa que l'ALB no la registri. Retornar200amb un cos que diu "error" no serveix de res: el balancejador mira el codi, no el text.
Per què un health check que retorna 200 sense comprovar res és pitjor que cap. Perquè menteix amb autoritat. El rolling update pregunta "està llesta?", l'endpoint respon que sí abans que l'aplicació pugui atendre res, ECS retira les tasques de la versió antiga i el servei queda servit per instàncies que retornen errors. Sense health check, almenys l'operador sap que no té informació; amb un de fals, el sistema pren decisions destructives basades en una resposta buida. La regla: un readiness ha de poder dir que no. Si mai no has vist el teu /salut/llest retornar 503, probablement no comprova res.
- Compatibilitat cap enrere: dues versions convivint
Totes les estratègies llevat de recreate tenen la mateixa conseqüència: durant una estona, v1 i v2 atenen els mateixos usuaris sobre la mateixa base de dades. Si no són compatibles, l'estratègia elegant es converteix en un incident elegant.
| Canvi a l'API de cites | És compatible? | Per què |
|---|---|---|
Afegir el camp opcional notes a la resposta de GET /cites |
Sí | Els clients antics l'ignoren |
Afegir un paràmetre opcional amb valor per defecte a POST /cites |
Sí | Qui no l'envia obté el comportament anterior |
Reanomenar duracio per duracioMin a la resposta |
No | La web v1 llegeix duracio i obté undefined |
Convertir duracio de número a objecte {valor, unitat} |
No | Canvia el tipus: trenca qualsevol consumidor |
| Fer obligatori un camp que abans era opcional | No | Les peticions de la web v1 passen a fallar amb 400 |
Eliminar l'endpoint GET /forats-lliures |
No | La web v1 el continua cridant |
Afegir l'endpoint GET /disponibilitat i deixar l'antic |
Sí | Convivència: es retira el vell en un desplegament posterior |
El patró que resol gairebé tots els casos "no" és expandir i contraure: primer es desplega un canvi que afegeix el que és nou sense treure el que és vell (expandir), després es migren els consumidors, i només en un tercer desplegament s'elimina el que és antic (contraure). Reanomenar duracio es converteix així en tres passos segurs: retornar tots dos camps, actualitzar la web, deixar de retornar duracio.
El mateix s'aplica a les dades, i allà és més greu, perquè una migració d'esquema no es reverteix amb un canvi de pes a l'ALB. Afegir una columna és compatible; esborrar-la o reanomenar-la trenca la versió que continua corrent. Aquell terreny té lliçó pròpia: 04-06, Bases de Dades al Pipeline: Migracions Segures.
- Què tria Reservalia per a
prod
prodLa Marta ho tanca així: rolling update 100/200 amb circuit breaker com a estratègia per defecte, i canary per pes d'ALB per als canvis marcats com a arriscats (els que toquen calcularForats, el càlcul de preus o el flux de pagament).
Les raons, en l'ordre en què les va exposar: el rolling update no costa infraestructura permanent i ECS ho fa nativament, així que és l'opció que l'equip pot operar sense cerimònies; el circuit breaker ja cobreix la fallada més freqüent, que és una versió que ni tan sols arrenca; blue-green es descarta perquè duplicar prod de manera sostinguda no cap al pressupost d'una empresa amb 340 clients de pagament; i el canary es reserva per al que realment s'ho mereix, perquè les seves esperes d'observació allarguen el desplegament i, amb el trànsit actual, exigeixen finestres llargues perquè els números signifiquin alguna cosa. El shadow queda anotat per al dia que calgui reescriure el motor d'agenda.
Errors Comuns i Consells
Error 1: triar canary per moda. Un canary sense mètriques fiables ni llindars definits és un rolling update lent i car amb una sensació falsa de seguretat. Primer l'observabilitat, després el canary. Error 2: creure que blue-green elimina el risc de dades. Els dos entorns comparteixen la base de dades: si la versió verda ha aplicat una migració destructiva, tornar al blau no retorna les dades.
Error 3: fer servir minimumHealthyPercent = 0 "perquè vagi ràpid". És recreate amb un altre nom, i a prod significa tall de servei. Error 4: un readiness que crida totes les dependències. Si /salut/llest consulta un servei extern de pagaments, una fallada d'aquell servei treu del balancejador totes les tasques sanes; comprova només l'imprescindible per atendre.
Error 5: canary sense adherència de sessió. L'usuari alterna entre versions petició a petició i veu comportaments incoherents; els informes d'error resultants són irreproduïbles.
Consell 1: assaja la tornada enrere. Una estratègia amb rollback teòric no provat té rollback de 68 minuts. Consell 2: escriu l'estratègia al codi d'infraestructura, no a la memòria de la Nuria; els percentatges viuen a infra/moduls/entorn/. Consell 3: davant el dubte entre dues estratègies, tria la que l'equip entengui millor a les tres de la matinada.
Exercicis
Exercici 1
Reservalia ha de desplegar un canvi que reescriu calcularForats amb un algorisme nou, més ràpid però amb risc de retornar forats incorrectes en casos rars. El resultat és visible per a l'usuari i afecta reserves reals. Tria una estratègia, justifica-la davant de les altres cinc i descriu què mesuraries per decidir si promocionar.
Exercici 2
El servei reservalia-api a staging té desired_count = 2, minimumHealthyPercent = 100 i maximumPercent = 100. En Diego llança un desplegament i el workflow es queda penjat fins que wait-for-service-stability esgota el temps. Explica què ha passat i proposa dues configuracions vàlides.
Exercici 3
La Marta vol retirar el camp duracio de la resposta de GET /cites i substituir-lo per duracioMin. La web de Reservalia consumeix aquest camp i hi ha integracions de tres clients que també el fan servir. Dissenya la seqüència de desplegaments i digues quina estratègia faries servir en cadascun.
Solucions
Solució 1. L'elecció és canary, complementat idealment amb una fase prèvia de shadow. Raonament: recreate i rolling update exposen tothom o una fracció no controlada, i aquí la fallada produeix reserves incorrectes —dany de negoci, no només error tècnic—. Blue-green exposa el 100 % tan bon punt es commuta, així que no acota el dany. Les proves A/B no apliquen: la pregunta és de correcció, no de preferència. El shadow és ideal perquè calcularForats és una funció de lectura i es poden comparar les sortides de v1 i v2 amb trànsit real sense que l'usuari vegi res; el seu límit és que no valida el flux complet de reserva. Amb el canary al 10 % mesuraria, a més d'errors 5xx i latència p95: el nombre de reserves creades per sessió (una caiguda indica forats que desapareixen), la taxa de conflictes en confirmar cita (dos usuaris reservant el mateix forat indica forats duplicats) i les reclamacions de suport. Amb ~30 reserves diàries al canary, la finestra d'observació s'ha de mesurar en dies, no en minuts, o cal apujar el pes inicial al 25 %.
Solució 2. Amb minimumHealthyPercent = 100 i maximumPercent = 100, ECS no pot retirar cap tasca antiga (trencaria el mínim de 2 sanes) ni arrencar-ne cap de nova (trencaria el màxim de 2 totals). El desplegament queda bloquejat: és una configuració impossible. Dos arreglaments vàlids: (a) 100 / 200, que permet arrencar fins a 2 tasques noves abans de retirar les antigues, sense pèrdua de capacitat i amb cost extra transitori; (b) 50 / 100, que permet retirar una tasca antiga per fer lloc a una de nova, sense cost extra però amb la capacitat reduïda a la meitat durant el relleu. A staging, la (b) és perfectament raonable; a prod, la (a).
Solució 3. Tres desplegaments seguint expandir-contraure. Desplegament 1 (expandir): l'API retorna duracio i duracioMin amb el mateix valor. És un canvi additiu i compatible, així que n'hi ha prou amb un rolling update normal. Desplegament 2 (migrar consumidors): la web passa a llegir duracioMin; s'avisa els tres clients d'integració amb una data límit i s'instrumenta l'ús del camp antic per saber quan deixa de llegir-se —sense aquella dada, la data límit és una suposició—. Desplegament 3 (contraure): quan la telemetria confirmi que ningú no consumeix duracio, s'elimina de la resposta; aquí convé un canary, perquè és l'únic pas que pot trencar un tercer desprevingut i el pes permet revertir en segons. L'error clàssic és intentar fer-ho en un sol desplegament confiant que "la web es desplega alhora": durant el rolling update conviuen totes dues versions de l'API i totes dues de la web, així que la incompatibilitat es manifesta igualment.
Conclusió
Ja no hi ha una sola manera de substituir una versió per una altra, sinó un menú amb preus. Recreate és simple i talla; rolling update és el valor per defecte sensat; blue-green compra un rollback instantani pagant capacitat doble; canary compra risc baix pagant temps; A/B no és una estratègia tècnica sinó una eina de producte; i shadow valida amb càrrega real sense exposar ningú, sempre que s'aïllin els efectes secundaris. Reservalia es queda amb rolling update 100/200 més circuit breaker, i reserva el canary per pes d'ALB per al que és arriscat.
A sota de totes elles hi ha dos fonaments que convé no oblidar: un readiness honest que sàpiga dir 503, perquè és el senyal sobre el qual s'apuntalen tots els automatismes, i la compatibilitat cap enrere, perquè tan bon punt s'abandona recreate hi ha dues versions convivint sobre la mateixa base de dades.
Tot i així, continuem lligats a una suposició optimista: que la fallada es detecta durant el desplegament. Moltes fallades apareixen hores després, quan el canary ja s'ha promocionat i la finestra d'observació s'ha tancat. A més, hi ha un problema previ: desplegar codi i activar una funcionalitat són la mateixa acció, així que una funcionalitat a mig fer obliga a mantenir branques de vida llarga. La lliçó següent, Feature Flags, Rollback i Recuperació davant Errors, separa el desplegament del llançament, construeix el botó de tornada enrere de Reservalia i converteix els 68 minuts de time to restore en un objectiu assolible.
Curs de CI/CD: Integració i Desplegament Continu
Mòdul 1: Introducció al CI/CD
- Conceptes Bàsics de CI/CD
- Beneficis del CI/CD
- Eines Populars de CI/CD
- El Projecte del Curs: l'Aplicació que Automatitzarem
- Mètriques DORA: Com es Mesura el Lliurament de Programari
Mòdul 2: Integració Contínua (CI)
- Introducció a la Integració Contínua
- Configuració d'un Entorn de CI
- Automatització de la Construcció
- Proves Automatitzades
- Qualitat de Codi i Anàlisi Estàtica
- Artefactes, Versionat i Promoció
- Integració amb el Control de Versions
Mòdul 3: Desplegament Continu (CD)
- Introducció al Desplegament Continu
- Automatització del Desplegament
- Infraestructura com a Codi i Entorns Reproduïbles
- Estratègies de Desplegament
- Feature Flags, Rollback i Recuperació davant Errors
- Monitoratge i Retroalimentació
Mòdul 4: Pràctiques Avançades de CI/CD
- Pipelines de CI/CD
- Gestió de Dependències
- Seguretat en CI/CD
- Escalabilitat i Rendiment
- Pipeline as Code: Plantilles, Reutilització i Proves del Pipeline
- Bases de Dades al Pipeline: Migracions Segures
Mòdul 5: Implementació de CI/CD en Projectes Reals
- Cas d'Estudi: Projecte Web
- Cas d'Estudi: Aplicació Mòbil
- Cas d'Estudi: Microserveis
- Cas d'Estudi: Modernitzar un Projecte Legacy
Mòdul 6: Eines i Tecnologies
- Jenkins
- GitLab CI/CD
- CircleCI
- Travis CI
- Docker i Kubernetes
- GitHub Actions a Fons
- Comparativa i Criteris per Triar Eina
Mòdul 7: Exercicis Pràctics
- Exercici 1: Configuració d'un Pipeline Bàsic
- Exercici 2: Integració de Proves Automatitzades
- Exercici 3: Desplegament en un Entorn de Producció
- Exercici 4: Monitoratge i Retroalimentació
- Exercici 5: Enfortir el Pipeline amb Seguretat i Secrets
- Projecte Final: Pipeline Complet d'Extrem a Extrem
