Si has arribat fins aquí és perquè en algun moment has viscut —o t'han explicat— una escena semblant a aquesta: divendres a la tarda, algú compila el projecte al seu portàtil, puja els fitxers a un servidor i creua els dits. Aquesta lliçó és el punt de partida per deixar enrere aquesta escena. Definirem amb precisió què signifiquen les sigles CI/CD, distingirem les tres pràctiques que s'hi amaguen al darrere (perquè són tres, no dues) i fixarem el vocabulari que farem servir durant tot el curs. No és una lliçó d'eines ni de configuració: és la lliçó que fa que tota la resta tingui sentit. Si confons Lliurament Continu amb Desplegament Continu —l'error més habitual del sector—, la resta del curs et sonarà a soroll. Quan acabis, sabràs anomenar cada peça del procés i entendràs per què l'equip del nostre projecte d'exemple, Reservalia, té un problema seriós.

Contingut

  1. El problema que CI/CD ve a resoldre
  2. Què és la Integració Contínua (CI)
  3. Què és el Lliurament Continu (Continuous Delivery)
  4. Què és el Desplegament Continu (Continuous Deployment)
  5. Les dues "CD" cara a cara
  6. El flux complet: de commit a producció
  7. Vocabulari base del curs
  8. Errors comuns i consells
  9. Exercicis
  10. Conclusió

  1. El problema que CI/CD ve a resoldre

1.1. El punt de partida de Reservalia

Durant tot el curs treballarem sobre un projecte fictici anomenat Reservalia, una plataforma SaaS de reserva de cites per a petits negocis: perruqueries, clíniques dentals, tallers mecànics. L'equip és petit: la Marta (tech lead), en Diego (desenvolupador backend) i la Nuria (SRE). A la lliçó 01-04 el veurem en detall; de moment només ens interessa com treballen avui:

  • En Diego compila al seu portàtil. La versió de Node que té instal·lada no és exactament la del servidor.
  • Puja els fitxers resultants per SFTP a un únic servidor de producció.
  • Executa les migracions de base de dades a mà, enganxant SQL en una consola de psql.
  • Les proves s'executen "quan algú se'n recorda".
  • Tot això passa els divendres a la tarda i dura unes 3 hores.
  • Resultat: dues incidències greus en producció el darrer trimestre.

Aquest procés no és "dolent" per descuit: és dolent per disseny. Cadascun d'aquests passos depèn que una persona concreta, en un moment concret, no s'equivoqui. I les persones ens equivoquem.

1.2. L'"integration hell"

Hi ha un segon problema, menys visible però igual de car. Imagina't que la Marta i en Diego treballen cadascun a la seva branca durant dues setmanes:

  • La Marta reescriu el sistema de notificacions per correu.
  • En Diego canvia el model de dades de les cites per admetre reserves recurrents.

Cap dels dos no toca la feina de l'altre aparentment. Però el dia que intenten fusionar totes dues branques, apareixen conflictes en 40 fitxers, la signatura d'una funció que tots dos fan servir ha canviat, i les proves de la Marta fallen per un canvi d'esquema d'en Diego. El que hauria d'haver estat una tarda es converteix en tres dies de "resoldre la integració".

Això és l'integration hell (infern de la integració): el cost de fusionar augmenta de manera no lineal amb el temps que les branques viuen separades.

graph LR
    subgraph "Integracio tardana: dolor concentrat"
        A1[Dia 1] --> A2[Dia 5] --> A3[Dia 10] --> A4["Dia 14<br/>MERGE<br/>3 dies de conflictes"]
    end
    subgraph "Integracio continua: dolor repartit"
        B1["Dia 1<br/>merge"] --> B2["Dia 2<br/>merge"] --> B3["Dia 3<br/>merge"] --> B4["Dia 14<br/>merge<br/>10 minuts"]
    end

La intuïció clau, que es repetirà en tot el curs: si una cosa fa mal, fes-la més sovint. Fusionar fa mal perquè ho fas poc. Desplegar fa mal perquè ho fas poc. La resposta contraintuïtiva de CI/CD és augmentar la freqüència fins que cada operació individual sigui trivial.

  1. Què és la Integració Contínua (CI)

Definició. La Integració Contínua és la pràctica que cada membre de l'equip integri la seva feina a la línia principal de desenvolupament almenys un cop al dia, i que cada integració sigui verificada automàticament per un procés de construcció i proves que s'executa en un entorn net i compartit.

Hi ha tres idees dins d'aquesta definició, i totes tres són igual d'importants:

  1. Integrar sovint. El codi de cada persona torna a la branca principal en hores, no en setmanes. Si la teva branca viu tres setmanes, no estàs fent CI encara que tinguis un servidor de CI configurat.
  2. Verificar automàticament. No n'hi ha prou amb fusionar: un sistema automàtic compila, executa les proves i comprova la qualitat. Sense verificació automàtica, integrar sovint només vol dir trencar la branca principal més sovint.
  3. En un entorn net i compartit. No al portàtil d'en Diego. En una màquina que parteix de zero cada vegada, perquè "a la meva màquina funciona" deixi de ser una frase vàlida.

2.1. El que CI no és

Convé desactivar tres malentesos molt estesos:

Malentès Realitat
"Tenim CI perquè tenim un servidor de CI" Si les branques viuen setmanes, tens un servidor de builds, no Integració Contínua.
"CI vol dir executar tests" Executar tests és part de CI. CI és la pràctica d'integrar; els tests són el mecanisme de verificació.
"CI és cosa de l'eina" CI és sobretot un acord d'equip: què es fa quan la build falla, quant pot viure una branca, qui arregla què.

2.2. El contracte implícit de CI

Quan un equip adopta CI de debò, signa un contracte tàcit:

  • La branca principal sempre està sana. Si la build és vermella, arreglar-la és la prioritat número u de l'equip, per damunt de qualsevol funcionalitat.
  • Ningú no se'n va a casa amb la build trencada. Es reverteix el canvi i s'investiga amb calma l'endemà.
  • Cada canvi es verifica abans d'integrar-se, no després.

Sense aquest contracte, l'automatització es converteix en un semàfor que tothom ignora. Hi tornarem al mòdul 2.

  1. Què és el Lliurament Continu (Continuous Delivery)

Definició. El Lliurament Continu és la pràctica de mantenir el programari sempre en un estat desplegable, de manera que qualsevol versió que hagi superat el pipeline es pugui portar a producció prement un botó, en qualsevol moment, amb un risc conegut.

El Lliurament Continu dona per suposada la Integració Contínua i hi afegeix una capa per damunt: no n'hi ha prou que el codi compili i passi els tests; cal que existeixi un artefacte construït, versionat, provat en entorns semblants a producció i llest per desplegar-se.

La frase clau és "prement un botó". En Lliurament Continu:

  • El procés tècnic de desplegar està completament automatitzat.
  • La decisió de desplegar continua sent humana.

Aquesta decisió humana no és una fallada del sistema: és una tria deliberada. Hi pot haver raons perfectament legítimes per no desplegar automàticament:

  • Una campanya de màrqueting que arrenca dimarts i la funcionalitat no s'ha de veure abans.
  • Un requisit de compliment normatiu que exigeix aprovació registrada.
  • Un equip que encara no confia prou en el seu conjunt de proves.

L'important és que, quan algú decideix desplegar, no hi ha feina manual a fer: només autoritzar.

  1. Què és el Desplegament Continu (Continuous Deployment)

Definició. El Desplegament Continu és la pràctica que tot canvi que supera el pipeline automatitzat es desplegui en producció automàticament, sense intervenció humana.

És el Lliurament Continu sense el botó. S'elimina la porta manual: si el pipeline és verd, el canvi arriba als usuaris. Sense reunions, sense finestres de desplegament, sense divendres a la tarda.

Això sona temerari i, sense una base sòlida, ho és. El Desplegament Continu només funciona si es recolza en:

  • Un conjunt de proves en què l'equip confia de debò (mòdul 2).
  • Estratègies de desplegament progressiu —canari, blue-green— per limitar el radi d'impacte (mòdul 3).
  • Feature flags per separar "desplegar codi" d'"activar funcionalitat" (mòdul 3).
  • Rollback automàtic quan les mètriques es degraden (mòdul 3).
  • Monitoratge que detecti el problema abans que el client (mòdul 3).

Fixa't en una cosa important: el Desplegament Continu no és l'objectiu obligatori de tot equip. És una opció. Moltíssimes organitzacions excel·lents es queden deliberadament en Lliurament Continu. El que sí que és innegociable és la capacitat de desplegar en qualsevol moment; fer-la servir automàticament o no és una decisió de context.

  1. Les dues "CD" cara a cara

Aquí hi ha el nucli de la lliçó. Les sigles CI/CD són ambigües expressament i això genera confusió constant en entrevistes, documentació i converses d'equip.

Aspecte Integració Contínua (CI) Lliurament Continu (Continuous Delivery) Desplegament Continu (Continuous Deployment)
Què automatitza Construcció i proves de cada canvi integrat Tot el de CI + empaquetatge, versionat i desplegament a entorns previs (dev, staging) Tot el de Delivery + desplegament a producció
On és la porta manual En fusionar a la branca principal (revisió de codi) Abans de producció: algú prem "Deploy" No hi ha porta manual
Qui decideix desplegar No aplica: CI no desplega Una persona (tech lead, product owner, responsable de release) El pipeline: si és verd, surt
Resultat del procés Una build verificada Un artefacte llest per a producció en qualsevol moment Un canvi ja en producció
Pregunta que respon "Aquest canvi trenca res?" "Podríem desplegar ara mateix?" "Ja està desplegat?"
Requisit previ Control de versions i proves automatitzades CI sòlida + entorns reproduïbles Delivery sòlida + desplegament progressiu + monitoratge + rollback
Risc si falta maduresa Builds vermelles ignorades Artefactes que ningú no gosa desplegar Incidents en producció cada dia

Una manera de recordar-ho que funciona molt bé:

  • Delivery = "podem desplegar quan vulguem" → la capacitat està automatitzada, la decisió és humana.
  • Deployment = "despleguem sempre que el pipeline ho permet" → també la decisió està automatitzada.

I una relació d'inclusió que convé tenir gravada:

graph TD
    CD2["Desplegament Continu<br/>Continuous Deployment"] --> CD1["Lliurament Continu<br/>Continuous Delivery"]
    CD1 --> CI["Integracio Continua<br/>CI"]
    CI --> VCS["Control de versions + proves automatitzades"]

    style CD2 fill:#c9e4ff,stroke:#333
    style CD1 fill:#d9f2d9,stroke:#333
    style CI fill:#fff2cc,stroke:#333

Es llegeix de baix a dalt: no hi pot haver Desplegament Continu sense Lliurament Continu, ni Lliurament Continu sense Integració Contínua. Qualsevol intent de saltar-se un esglaó produeix un sistema fràgil. Si Reservalia intentés demà desplegar automàticament a producció sense proves fiables, no tindria dues incidències per trimestre: en tindria dues per setmana.

  1. El flux complet: de commit a producció

Vegem el recorregut que farà un canvi d'en Diego al llarg de tot el curs. Aquest diagrama és el mapa mental del curs sencer:

flowchart LR
    A["👤 Diego<br/>fa un commit"] --> B["📥 push / pull request<br/>al repositori"]
    B -->|trigger| C{{"Pipeline arrencat"}}
    C --> D["🔨 Etapa: Build<br/>compilar, installar dependencies"]
    D --> E["🧪 Etapa: Test<br/>unitaries, integracio, lint"]
    E --> F["📦 Artefacte<br/>imatge Docker versionada"]
    F --> G["🗄️ Registre d artefactes<br/>ECR"]
    G --> H["🚀 Desplegament a dev"]
    H --> I["🚀 Desplegament a staging"]
    I --> J{"Porta manual?"}
    J -->|"Si → Lliurament Continu"| K["👤 Algu aprova"]
    J -->|"No → Desplegament Continu"| L
    K --> L["🚀 Desplegament a prod"]
    L --> M["📊 Monitoratge<br/>i retroalimentacio"]
    M -.->|"si alguna cosa falla"| N["⏪ Rollback"]

Llegeix el diagrama identificant on encaixa cada pràctica:

  • De A a E (commit → build → test): això és Integració Contínua. Ho construirem al mòdul 2.
  • De F a I (artefacte → registre → dev → staging): això és Lliurament Continu. Mòduls 2 i 3.
  • El pas J → L sense intervenció humana: això és Desplegament Continu. Mòdul 3.
  • M i N (monitoratge i rollback): la xarxa de seguretat que fa possible tot l'anterior. Mòdul 3.

  1. Vocabulari base del curs

Fixem ara els termes. Els farem servir sense tornar-los a definir, així que val la pena llegir aquesta secció amb calma. Els agrupo per famílies.

7.1. Família "control de versions"

Terme Definició Exemple a Reservalia
Repositori Magatzem del codi font i la seva història completa de canvis. github.com/reservalia/reservalia
Commit Una unitat de canvi confirmada, amb autor, data, missatge i un identificador únic (SHA). a3f9c21 — "fix: validar solapament de cites"
Branca (branch) Una línia de desenvolupament paral·lela que després es pot fusionar en una altra. main, feat/reserves-recurrents
Pull request / merge request Proposta de fusionar una branca en una altra, que obre revisió i verificació automàtica. PR #142 d'en Diego cap a main

Un detall que farem servir molt: el SHA del commit és la identitat canònica d'un canvi. Quan al mòdul 3 ens preguntem "quina versió exacta hi ha en producció?", la resposta correcta mai no serà "l'última", sinó un SHA concret.

# El SHA identifica de manera unica l estat del codi.
# Aquesta ordre retorna el SHA curt del commit actual:
git rev-parse --short HEAD
# → a3f9c21

# I aquesta, la data exacta del commit en format ISO 8601.
# La farem servir a la llico 01-05 per calcular el lead time.
git show -s --format=%cI HEAD
# → 2026-03-14T10:22:41+01:00

7.2. Família "execució del pipeline"

Terme Definició Matís important
Pipeline La seqüència completa i automatitzada que porta un canvi des del commit fins a la seva destinació. És el concepte paraigua: conté etapes, que contenen jobs, que contenen passos.
Trigger (disparador) L'esdeveniment que inicia una execució del pipeline. push a una branca, obertura d'un PR, una etiqueta, un horari (cron), una execució manual.
Stage (etapa) Agrupació lògica de feina dins del pipeline, normalment seqüencial. buildtestdeploy. Una etapa sol esperar que acabi l'anterior.
Job (treball) Unitat d'execució independent dins d'una etapa. Diversos jobs de la mateixa etapa poden córrer en paral·lel. test-api i test-web corren alhora.
Step (pas) Una ordre o acció concreta dins d'un job, en ordre. npm ci, i després npm test.
Runner / agent La màquina (física, virtual o contenidor) on s'executa un job. Un runner Ubuntu efímer que es destrueix en acabar.

La jerarquia, visualment:

graph TD
    P["PIPELINE<br/>disparat per un trigger"]
    P --> S1["ETAPA: build"]
    P --> S2["ETAPA: test"]
    P --> S3["ETAPA: deploy"]
    S2 --> J1["JOB: test-api<br/>en runner ubuntu"]
    S2 --> J2["JOB: test-web<br/>en runner ubuntu"]
    J1 --> ST1["pas: npm ci"]
    J1 --> ST2["pas: npm run test"]

Sobre els runners hi ha una distinció que importarà molt més endavant:

  • Efímer: es crea net per a cada job i es destrueix en acabar. Garanteix reproduïbilitat. És el model per defecte de GitHub Actions.
  • Persistent: una màquina que es reutilitza entre execucions. És més ràpid (conserva memòries cau) però acumula estat, i aquest estat és una font clàssica de builds que "funcionen només la segona vegada". Típic d'instal·lacions antigues de Jenkins.

7.3. Família "resultat i destinació"

Terme Definició Exemple a Reservalia
Artefacte El producte empaquetat i versionat d'una construcció, llest per desplegar o distribuir. La imatge Docker reservalia/api:a3f9c21
Registre d'artefactes Magatzem versionat on es publiquen i es recuperen els artefactes. Amazon ECR
Entorn Una instància desplegada i executable del sistema, amb la seva pròpia configuració i les seves pròpies dades. dev, staging, prod
Promoció Portar el mateix artefacte ja construït d'un entorn al següent, sense reconstruir-lo. Promocionar api:a3f9c21 de staging a prod
Build reproduïble Propietat per la qual construir el mateix commit produeix sempre un artefacte funcionalment equivalent. Fixar Node 20.11.0 i fer servir npm ci amb package-lock.json

Els dos últims mereixen desenvolupament, perquè són els que més es malinterpreten.

Promoció: construir una vegada, desplegar moltes. És una de les regles d'or de CI/CD. L'artefacte que es prova a staging ha de ser exactament el mateix binari que arriba a producció, byte a byte. Si reconstrueixes per a producció, estàs desplegant una cosa que ningú no ha provat mai.

graph LR
    C["commit a3f9c21"] --> B["BUILD<br/>una sola vegada"]
    B --> ART["artefacte<br/>api:a3f9c21"]
    ART --> D["dev"]
    ART --> S["staging"]
    ART --> P["prod"]

    style ART fill:#d9f2d9,stroke:#333,stroke-width:2px

I el que no s'ha de fer:

graph LR
    C["commit a3f9c21"] --> B1["build per a dev"] --> D["dev"]
    C --> B2["build per a staging"] --> S["staging"]
    C --> B3["build per a prod ⚠️<br/>artefacte mai provat"] --> P["prod"]

    style B3 fill:#ffd6d6,stroke:#c00,stroke-width:2px

Si l'artefacte és el mateix als tres entorns, com canvia llavors la configuració? Per fora: variables d'entorn i secrets injectats en el moment del desplegament. L'artefacte no sap en quin entorn viu.

# El MATEIX artefacte, configuracio diferent segons l entorn.
# A staging:
DATABASE_URL="postgres://reservalia@rds-staging:5432/reservalia"
LOG_LEVEL="debug"

# En produccio:
DATABASE_URL="postgres://reservalia@rds-prod:5432/reservalia"
LOG_LEVEL="info"

Build reproduïble. Que dues construccions del mateix commit donin el mateix resultat no és automàtic: cal guanyar-s'ho. Els enemics habituals són:

  • Versions d'eines no fixades (node a seques en comptes de [email protected]).
  • Dependències sense fitxer de bloqueig, que resolen a l'última versió disponible.
  • Instal·lar amb npm install (que pot modificar el lock) en comptes de npm ci (que el respecta estrictament).
  • Marques de temps o rutes absolutes incrustades a l'artefacte.
# ❌ No reproduible: "^4.18.0" pot resoldre a 4.18.2 avui i a 4.19.0 dema
npm install

# ✅ Reproduible: installa EXACTAMENT el que diu package-lock.json
# i falla si el lock i el package.json no son coherents
npm ci

Aquest és exactament el problema d'en Diego: compila al seu portàtil, amb la seva versió de Node i els seus node_modules acumulats durant mesos. La seva build no és reproduïble, i per això ningú no pot reconstruir el que hi ha en producció.

Errors Comuns i Consells

Error 1: creure que "CD" sempre vol dir el mateix. Quan algú diu "tenim CI/CD", pregunta sempre: "el desplegament a producció el llança una persona o el pipeline?". És l'única pregunta que desambigua. En una entrevista de feina, distingir Delivery de Deployment i explicar per què es tria l'un o l'altre et col·loca per davant de la majoria de candidats.

Error 2: pensar que CI/CD és una eina que s'instal·la. GitHub Actions no et dona Integració Contínua, igual que comprar unes sabatilles no et dona forma física. L'eina executa; la pràctica la sosté l'equip. Un equip amb branques de tres setmanes i un servidor de CI caríssim no fa CI.

Error 3: reconstruir l'artefacte a cada entorn. Si el deploy a producció torna a compilar, el que arriba als usuaris no és el que es va validar a staging. Construeix una vegada, promociona el mateix artefacte. Ho formalitzarem a la lliçó 02-06.

Error 4: confondre desplegament amb release. Desplegar és posar el codi en producció; fer release és activar la funcionalitat per als usuaris. Amb feature flags pots desplegar dilluns i activar dijous. Són dues operacions diferents i separar-les redueix moltíssim el risc. Ho veurem a 03-05.

Error 5: fer servir branques de llarga durada i dir-ne CI. Si la teva branca té 60 commits i dues setmanes de vida, integraràs malament encara que tinguis mil tests verds. La freqüència d'integració és la pràctica; els tests són el mecanisme.

Consell 1: comença mesurant, no automatitzant. Abans d'escriure el teu primer flux de treball, apunta quant triga avui el teu desplegament i quantes vegades al mes falla. Sense línia base no podràs demostrar que la inversió ha valgut la pena. La lliçó 01-05 va justament d'això.

Consell 2: el pipeline és codi de producció. Viu al repositori, es revisa en pull requests i es versiona igual que la resta. Un .github/workflows/ci.yml editat a mà des d'una interfície web és deute tècnic des del primer minut.

Consell 3: si fa mal, fes-ho més sovint. És el principi que resumeix el curs sencer. Els merges fan mal perquè són rars; els desplegaments fan por perquè són excepcionals. Augmentar la freqüència obliga a automatitzar, i automatitzar elimina el dolor.

Exercicis

Exercici 1: classificar situacions

Per a cada situació, indica si descriu Integració Contínua, Lliurament Continu, Desplegament Continu o cap de les tres, i justifica-ho en una frase.

  1. L'equip té un servidor que executa les proves cada nit a les 3:00 sobre la branca main. Les branques de funcionalitat es fusionen cada tres setmanes.
  2. Cada pull request dispara build i tests en 6 minuts. Si són verds, es pot fusionar. Els desplegaments continuen sent manuals per SFTP.
  3. En fusionar a main, el pipeline construeix una imatge Docker, la desplega a staging i executa proves de fum. La Marta prem "Deploy to production" quan ho considera oportú.
  4. En fusionar a main, el pipeline desplega a producció en un 5 % del trànsit, vigila els errors 10 minuts i, si tot va bé, completa el desplegament. Ningú no hi intervé.
  5. En Diego compila al seu portàtil i puja per SFTP els divendres.

Exercici 2: detectar ruptures de la reproduïbilitat

El pseudo-script següent és el procés manual d'en Diego. Identifica almenys quatre motius pels quals l'artefacte resultant no és reproduïble, i proposa una correcció per a cadascun.

#!/bin/bash
# desplegament-divendres.sh — el proces actual de Reservalia
cd ~/projectes/reservalia/apps/api
git pull
npm install
npm run build
echo "Versio: $(date)" > dist/VERSION.txt
sftp diego@servidor-prod <<< "put -r dist/* /var/www/api/"
psql -h rds-prod -U admin -f migrations/latest.sql

Exercici 3: dibuixar el flux objectiu

Escriu un diagrama mermaid del pipeline objectiu de Reservalia amb aquestes condicions, fent servir correctament els termes trigger, etapa, job, artefacte, entorn i promoció:

  • Es dispara en fusionar a main.
  • Etapa de verificació amb dos jobs en paral·lel: test-api i test-web.
  • Si tots dos passen, es construeix un artefacte etiquetat amb el SHA del commit.
  • L'artefacte es desplega a staging automàticament.
  • Es promociona a prod només després d'aprovació manual de la Marta.

Solucions

Solució a l'Exercici 1

  1. Cap de les tres. És una nightly build. Hi ha automatització de proves, però les branques viuen tres setmanes: no hi ha integració contínua, sinó integració tardana verificada de nit. La verificació arriba fins a 21 dies després del canvi que la va trencar.
  2. Integració Contínua. Cada canvi es verifica automàticament abans d'integrar-se i el cicle de retroalimentació és de minuts. No hi ha Lliurament Continu perquè no existeix cap artefacte desplegable ni desplegament automatitzat: el desplegament continua sent un procés manual.
  3. Lliurament Continu. Tot el camí tècnic fins a producció està automatitzat (build, artefacte, staging, proves de fum) i només queda una porta manual: la decisió de la Marta. És l'exemple canònic de Delivery.
  4. Desplegament Continu. No hi ha intervenció humana entre el merge i producció. A més apareix la xarxa de seguretat imprescindible: desplegament progressiu (canari al 5 %) i verificació automàtica abans de completar.
  5. Cap de les tres. És desplegament manual amb integració tardana. És el punt de partida de Reservalia.

Solució a l'Exercici 2

# Problema Per què trenca la reproduïbilitat Correcció
1 Es construeix a ~/projectes/... del portàtil d'en Diego L'entorn acumula estat: node_modules antics, fitxers no versionats, variables locals, versió de Node personal Construir en un runner efímer que clona el repositori des de zero
2 git pull sense fixar commit No se sap quin commit exacte s'ha construït; si algú empeny durant el procés, es construeix una altra cosa Fer checkout d'un SHA concret i fer-lo servir com a etiqueta de l'artefacte
3 npm install Pot resoldre versions noves dins dels rangs semver i modificar package-lock.json Fer servir npm ci, que instal·la exactament el lock i falla si hi ha incoherències
4 Versió de Node no fixada Node 20.9 i Node 20.11 poden produir artefactes diferents Fixar la versió a .nvmrc / engines i al pipeline
5 echo "Versio: $(date)" La marca de temps fa que dues builds del mateix codi produeixin artefactes diferents Etiquetar amb el SHA del commit, no amb la data
6 sftp put -r dist/* És un desplegament incremental: els fitxers esborrats al codi continuen vius al servidor. El servidor acumula història Desplegar un artefacte immutable complet (imatge de contenidor)
7 psql -f migrations/latest.sql a mà No hi ha control de quines migracions s'han aplicat ni ordre garantit, ni possibilitat de revertir Eina de migracions versionada, executada pel pipeline (lliçó 04-06)

Amb quatre n'hi hauria hagut prou; si n'has trobat més, encara millor senyal.

Solució a l'Exercici 3

flowchart TD
    T(["TRIGGER: push / merge a main"]) --> V

    subgraph V["ETAPA: verificar"]
        direction LR
        J1["JOB: test-api"]
        J2["JOB: test-web"]
    end

    V -->|"tots dos en verd"| B

    subgraph B["ETAPA: construir"]
        J3["JOB: build<br/>docker build -t reservalia/api:$SHA"]
    end

    B --> ART[("ARTEFACTE<br/>reservalia/api:a3f9c21<br/>a ECR")]
    ART -->|"desplegament automatic"| ENV1["ENTORN: staging"]
    ENV1 --> GATE{"porta manual:<br/>aprova la Marta"}
    GATE -->|"PROMOCIO<br/>del mateix artefacte"| ENV2["ENTORN: prod"]

    style ART fill:#d9f2d9,stroke:#333,stroke-width:2px
    style GATE fill:#fff2cc,stroke:#333

Punts que havien d'aparèixer i convé comprovar a la teva versió:

  • El trigger és un esdeveniment del repositori, no una acció manual.
  • test-api i test-web són jobs paral·lels dins d'una mateixa etapa, no etapes diferents.
  • Es construeix un únic artefacte, etiquetat amb el SHA (no amb la data ni amb "latest").
  • A producció hi va el mateix artefacte que es va validar a staging: això és promoció, no una reconstrucció.
  • La porta manual situa aquest pipeline en Lliurament Continu. Traient aquesta porta, seria Desplegament Continu.

Conclusió

En aquesta lliçó hem posat els fonaments del curs:

  • L'enemic té dues cares: l'integration hell (fusionar tard i de cop) i el desplegament manual (processos que depenen que una persona no s'equivoqui). Reservalia pateix totes dues.
  • La Integració Contínua és integrar sovint i verificar automàticament en un entorn net. És una pràctica d'equip abans que una eina.
  • El Lliurament Continu manté el programari sempre desplegable: el procés està automatitzat i la decisió és humana.
  • El Desplegament Continu elimina aquesta última porta manual, i només és assenyat amb proves fiables, desplegament progressiu, monitoratge i rollback.
  • Els tres s'apilen: no hi ha Deployment sense Delivery, ni Delivery sense CI.
  • I tenim un vocabulari comú: repositori, commit, branca, trigger, pipeline, etapa, job, runner, artefacte, entorn, promoció i build reproduïble. Dues regles d'or que repetirem fins al final: construir una vegada i promocionar el mateix artefacte, i fixar versions perquè la build sigui reproduïble.

Ara ja saps què és CI/CD. La pregunta lògica de la Marta quan presenti això al seu equip serà una altra: "i això què ens aporta, i què ens costarà?". Perquè muntar un pipeline no és gratis: consumeix temps de configuració, manteniment i minuts d'execució. A la lliçó següent, Beneficis del CI/CD, veurem amb honestedat les dues columnes de la balança: què hi guanya un equip com el de Reservalia, com es mesura cada benefici i en quines situacions CI/CD aporta menys del que costa.

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