Quan algú comença en CI/CD, l'obstacle més gran no sol ser el concepte: és el soroll. Jenkins, GitHub Actions, GitLab CI, CircleCI, Travis CI, Azure DevOps, Argo CD, Tekton, Spinnaker, Drone, Buildkite... la llista sembla infinita i fa la impressió que cal triar bé o es perden mesos. Aquesta lliçó és un mapa, no un tutorial. El seu objectiu és que sàpigues col·locar cada eina a la seva casella, entendre quines categories existeixen i per què, i descobrir una cosa que tranquil·litza molt: el 80 % del que aprenguis en una eina es transfereix a les altres, perquè totes implementen els mateixos conceptes que vam veure a 01-01. Al final justificarem per què el curs fa servir GitHub Actions i veurem la mateixa feina trivial escrita en dues eines diferents, perquè comprovis de primera mà que el que canvia és la sintaxi, no la idea.
Contingut
- Com està organitzat l'ecosistema
- Categoria 1: servidors de CI/CD (el cor del pipeline)
- Categoria 2: orquestradors de contenidors
- Categoria 3: registres d'artefactes
- Categoria 4: infraestructura com a codi
- Categoria 5: desplegament continu GitOps
- Les eines, una a una
- Taula comparativa d'alt nivell
- Per què aquest curs fa servir GitHub Actions
- La mateixa feina en dues eines
- Errors comuns i consells
- Exercicis
- Conclusió
- Com està organitzat l'ecosistema
El primer error en mirar aquest panorama és ficar totes les eines al mateix sac i comparar-les entre si. Argo CD no competeix amb Jenkins, igual que un tornavís no competeix amb una caixa d'eines: fan coses diferents en moments diferents del procés.
La manera útil d'organitzar l'ecosistema és per quina part del recorregut d'un canvi cobreix cada eina:
flowchart LR
A["📝 Codi<br/>al repositori"] --> B["🏭 SERVIDOR DE CI/CD<br/>construeix i prova"]
B --> C["📦 REGISTRE<br/>D ARTEFACTES<br/>desa el resultat"]
C --> D["🚀 DESPLEGAMENT<br/>porta l artefacte<br/>a l entorn"]
D --> E["☸️ ORQUESTRADOR<br/>executa i mante<br/>viu el servei"]
F["🏗️ IaC<br/>crea i governa<br/>la infraestructura"] -.-> E
G["🔄 GitOps<br/>sincronitza l estat<br/>desitjat del repo"] -.-> D
style B fill:#cfe8ff
style C fill:#d9f2d9
style D fill:#fff2cc
style E fill:#f0d9ff
Cinc categories, cinc funcions diferents:
| Categoria | Què fa | Exemples |
|---|---|---|
| Servidors de CI/CD | Executen el pipeline: reaccionen a esdeveniments del repositori, construeixen, proven i llancen desplegaments | GitHub Actions, GitLab CI/CD, Jenkins, CircleCI, Travis CI, Azure DevOps Pipelines, Tekton |
| Orquestradors de contenidors | Executen i mantenen vius els serveis: reinicis, escalat, salut | Kubernetes, Amazon ECS, Nomad |
| Registres d'artefactes | Emmagatzemen de manera versionada i immutable el que es construeix | Amazon ECR, Docker Hub, GitHub Packages, Artifactory, Nexus |
| Infraestructura com a codi (IaC) | Defineixen la infraestructura en fitxers versionats en comptes de a cop de clic | Terraform, OpenTofu, Pulumi, AWS CloudFormation, Ansible |
| Desplegament continu GitOps | Vigilen un repositori i sincronitzen contínuament el clúster amb el que hi diu | Argo CD, Flux |
Un projecte real fa servir una de cada categoria, no una sola eina. Reservalia, al final del curs, farà servir: GitHub Actions (servidor de CI/CD) + Amazon ECR (registre) + ECS Fargate (orquestrador) + Terraform (IaC). Res d'això no és redundant.
- Categoria 1: servidors de CI/CD (el cor del pipeline)
És la categoria que ocupa la major part d'aquest curs, i la que genera més confusió. Dins seu, la distinció estructural més important és allotjat (SaaS) davant d'autogestionat.
2.1. Allotjat (SaaS) davant d'autogestionat
| Aspecte | Allotjat / SaaS | Autogestionat (self-hosted) |
|---|---|---|
| Qui manté el servidor | El proveïdor | Tu |
| Posada en marxa | Minuts: un fitxer YAML al repositori | Dies: instal·lar, assegurar, configurar agents |
| Cost | Per minut d'execució (+ quota gratuïta) | Màquines + temps d'administració |
| Actualitzacions i pedaços | Automàtics | Responsabilitat teva |
| Accés a xarxes privades | Limitat; requereix túnels o runners propis | Natiu: la màquina ja és a la teva xarxa |
| Control i personalització | Menor: jugues amb les peces del proveïdor | Total: qualsevol plugin, qualsevol sistema operatiu |
| Dades i compliment | El codi passa per infraestructura de tercers | Tot es queda a la teva infraestructura |
| Exemples | GitHub Actions, CircleCI, Travis CI, GitLab.com | Jenkins, GitLab autoallotjat, Tekton, runners propis |
Hi ha un model intermedi molt utilitzat: plataforma allotjada amb runners propis. És a dir, GitHub Actions coordina i mostra la interfície, però els jobs s'executen en màquines teves dins de la teva xarxa privada. Combina la comoditat del SaaS amb l'accés a sistemes interns i sol ser l'elecció d'empreses mitjanes amb requisits de xarxa o de compliment.
2.2. On es defineix el pipeline
Una altra distinció que marca molt l'experiència diària:
- Al repositori (pipeline as code). El pipeline és un fitxer YAML versionat al costat del codi: es revisa en pull requests, es pot tornar enrere, viatja amb les branques. És el model de GitHub Actions, GitLab CI, CircleCI, Travis CI, Tekton i Jenkins modern amb
Jenkinsfile. - A la interfície del servidor (configuració clicada). El pipeline es configura clicant en formularis web i viu a la base de dades del servidor. És el model clàssic de Jenkins amb freestyle jobs, i també és possible a Azure DevOps.
La segona opció és un antipatró ben documentat: la configuració no es versiona, ningú no sap qui va canviar què, no es pot reproduir i recuperar el servidor després d'un desastre és un malson. Regla pràctica: si el teu pipeline no és al repositori, no està sota control. Hi aprofundirem a la lliçó 04-05.
- Categoria 2: orquestradors de contenidors
Un servidor de CI/CD construeix i llança el desplegament, però no manté viva la teva aplicació. D'això se n'encarrega l'orquestrador: decideix a quina màquina corre cada contenidor, el reinicia si mor, l'escala si hi ha càrrega, comprova la seva salut i substitueix versions sense tallar el servei.
| Eina | Model | Quan encaixa |
|---|---|---|
| Kubernetes | Estàndard de facto, extremadament potent i extremadament complex | Molts serveis, diversos equips, necessitat de portabilitat entre núvols |
| Amazon ECS / Fargate | Orquestrador gestionat d'AWS; amb Fargate ni tan sols gestiones servidors | Ets a AWS i vols contenidors sense administrar un clúster |
| HashiCorp Nomad | Més simple que Kubernetes, orquestra contenidors i també processos normals | Càrregues mixtes, equips que volen menys complexitat |
Reservalia farà servir ECS Fargate. És una decisió deliberada i realista per a un equip de tres persones: Kubernetes per a tres serveis i una SRE a temps parcial és sobreenginyeria. Kubernetes es veu a la lliçó 06-05, i el cas de microserveis a 05-03.
- Categoria 3: registres d'artefactes
Recorda la regla d'or de 01-01: construir una vegada, promocionar el mateix artefacte. Perquè això sigui possible, l'artefacte ha de viure en algun lloc del qual tots els entorns el puguin recuperar. Aquest lloc és el registre.
| Registre | Què emmagatzema | Notes |
|---|---|---|
| Amazon ECR | Imatges de contenidor | Integrat amb IAM i ECS; el que farem servir a Reservalia |
| Docker Hub | Imatges de contenidor | Públic i molt conegut; límits de descàrrega en comptes gratuïts |
| GitHub Packages | Imatges i paquets (npm, Maven, NuGet...) | Enganxat al repositori; còmode si ja fas servir GitHub |
| JFrog Artifactory / Sonatype Nexus | Gairebé qualsevol format | Opció empresarial; se solen fer servir també com a proxy de dependències |
Una propietat crítica d'un registre ben utilitzat: els artefactes són immutables. L'etiqueta reservalia/api:a3f9c21 ha d'apuntar sempre als mateixos bytes. Reetiquetar o sobreescriure destrueix la traçabilitat i fa impossible saber què hi ha realment en producció. Per això etiquetem amb el SHA del commit i no amb latest.
- Categoria 4: infraestructura com a codi
La Nuria, la SRE de Reservalia, va crear a mà a la consola d'AWS la base de dades RDS, el balancejador i les regles de xarxa. És ràpid... una vegada. El problema apareix quan cal crear un entorn de staging idèntic, o quan algú canvia alguna cosa un dimarts i a l'octubre ningú no recorda per què.
La infraestructura com a codi defineix aquests recursos en fitxers versionats:
# Fragment illustratiu de Terraform: la base de dades de Reservalia.
# No cal entendre-ho tot ara; nomes cal veure que la infraestructura
# es declara en un fitxer que viu al repositori i es revisa en un PR.
resource "aws_db_instance" "reservalia" {
identifier = "reservalia-${var.entorn}" # reservalia-staging, reservalia-prod
engine = "postgres"
engine_version = "16.3"
instance_class = var.entorn == "prod" ? "db.t4g.medium" : "db.t4g.micro"
multi_az = var.entorn == "prod"
}El que és rellevant per a aquesta lliçó és la categoria: aquestes eines no executen pipelines, defineixen infraestructura. El pipeline les invoca. Terraform, OpenTofu, Pulumi, CloudFormation i Ansible hi juguen. Ho desenvoluparem a la lliçó 03-03.
- Categoria 5: desplegament continu GitOps
És la categoria més recent i la que pitjor s'entén, així que mereix una explicació del mecanisme.
Els servidors de CI/CD tradicionals fan servir un model push: el pipeline acaba i empeny el desplegament a l'entorn. Per fer-ho, el pipeline necessita credencials amb permís per modificar producció.
GitOps inverteix la direcció. És un model pull: un agent instal·lat dins del clúster vigila contínuament un repositori Git que descriu l'estat desitjat. Quan detecta una diferència entre el que diu el repositori i el que hi ha al clúster, la corregeix ell mateix.
graph TB
subgraph PUSH["Model PUSH - CI/CD tradicional"]
P1["Pipeline de CI/CD"] -->|"credencials de produccio<br/>+ empeny el canvi"| P2["Cluster"]
end
subgraph PULL["Model PULL - GitOps"]
G1["Repositori Git<br/>= estat desitjat"] -.->|"l agent consulta"| G2["Agent GitOps<br/>DINS del cluster"]
G2 -->|"aplica i corregeix<br/>desviacions"| G3["Cluster"]
end
style PUSH fill:#fff6f6
style PULL fill:#f6fff6
Avantatges del model pull: el pipeline mai no necessita credencials de producció (millora de seguretat important), el repositori és la font de veritat auditable, i les desviacions manuals es reverteixen soles. Inconvenient: afegeix una peça més i avui està molt lligat a Kubernetes.
Eines: Argo CD (interfície web molt visual, molt adoptat) i Flux (més minimalista, sense interfície pròpia per defecte).
- Les eines, una a una
Ara sí, la presentació individual. Per a cadascuna: model d'execució, on es defineix el pipeline i SaaS o autoallotjat.
7.1. GitHub Actions
- Model d'execució: fluxos de treball disparats per esdeveniments del repositori (
push,pull_request, etiquetes, cron, despatx manual). Cada flux de treball conté jobs; cada job corre en un runner efímer (màquina virtual neta que es destrueix en acabar). - On es defineix: fitxers YAML a
.github/workflows/dins del mateix repositori. - SaaS o autoallotjat: SaaS, amb opció de runners autoallotjats a la teva infraestructura.
- Tret distintiu: el Marketplace d'accions, un catàleg enorme de passos reutilitzables (
actions/checkout,actions/setup-node,aws-actions/configure-aws-credentials...). Redueix moltíssim el codi que escrius, però introdueix dependències de tercers que cal fixar i auditar (lliçó 04-03). - Punt fort: proximitat total al repositori. L'esdeveniment, el codi, la revisió i el resultat són al mateix lloc.
- Punt feble: el model de reutilització (fluxos de treball reutilitzables i accions compostes) és menys flexible que un llenguatge de programació real, i els pipelines molt complexos poden tornar-se verbosos.
7.2. GitLab CI/CD
- Model d'execució: un fitxer de pipeline amb stages que agrupen jobs; cada job el recull un runner (amb executors diferents: Docker, shell, Kubernetes).
- On es defineix:
.gitlab-ci.ymla l'arrel del repositori. - SaaS o autoallotjat: tots dos. GitLab.com és SaaS; GitLab autogestionat és una de les opcions autoallotjades més completes del mercat.
- Tret distintiu: és una plataforma DevOps integrada: repositori, CI/CD, registre de contenidors, gestió d'incidències, escaneig de seguretat i entorns, tot al mateix producte i amb la mateixa autenticació.
- Punt fort: integració vertical i un model de plantilles (
include,extends) molt potent per reutilitzar configuració entre projectes. - Punt feble: si t'autogestiones GitLab, et fas càrrec d'una peça d'infraestructura grossa.
7.3. Jenkins
- Model d'execució: un servidor controlador que orquestra i uns agents que executen els jobs. Model clàssic de servidor persistent.
- On es defineix: idealment en un
Jenkinsfileal repositori, escrit en un DSL basat en Groovy (declaratiu o scripted). Històricament també mitjançant formularis a la interfície web, cosa que produeix el deute tècnic que esmentàvem. - SaaS o autoallotjat: autoallotjat, sempre. És programari lliure que instal·les tu.
- Tret distintiu: un ecosistema de més de mil plugins. Es pot integrar literalment amb qualsevol cosa. Aquesta és també la seva maledicció: els plugins tenen qualitats i ritmes de manteniment molt dispars, i les incompatibilitats entre versions són un clàssic.
- Punt fort: control absolut, maduresa de més de dues dècades, i el
Jenkinsfile, en ser codi real, permet lògica complexa que en YAML seria impossible. - Punt feble: cost d'administració alt (actualitzacions, seguretat, gestió d'agents) i una interfície que mostra la seva edat. Tot i així, continua sent dominant en grans empreses i en entorns amb sistemes interns que mai no sortiran al núvol.
- Lliçó 06-01.
7.4. CircleCI
- Model d'execució: jobs que s'executen en contenidors Docker o màquines virtuals, amb suport natiu per a paral·lelització i divisió automàtica del conjunt de tests.
- On es defineix:
.circleci/config.ymlal repositori. - SaaS o autoallotjat: principalment SaaS; ofereix runners propis i una edició per a servidor.
- Tret distintiu: els orbs, paquets reutilitzables de configuració (equivalent conceptual a les accions de GitHub), i una atenció molt marcada al rendiment i al temps d'execució del pipeline.
- Punt fort: rapidesa, bones eines de memòria cau i paral·lelisme, agnòstic respecte al proveïdor de repositori.
- Punt feble: una peça més fora de la teva plataforma de repositori, amb la seva pròpia facturació i la seva pròpia gestió d'accessos.
- Lliçó 06-03.
7.5. Travis CI
- Model d'execució: builds disparades per esdeveniments del repositori, executades en màquines virtuals o contenidors.
- On es defineix:
.travis.ymla l'arrel del repositori. - SaaS o autoallotjat: SaaS (amb una edició empresarial).
- Tret distintiu: és històricament important: va ser el primer a popularitzar el model d'"un YAML al teu repositori dispara el teu CI" i a oferir-ho gratis a projectes de codi obert. Pràcticament tot el que avui donem per fet va començar allà.
- Situació actual: després del canvi del seu model gratuït per a codi obert, gran part de l'ecosistema va migrar a GitHub Actions i la seva quota es va reduir molt. L'estudiarem a 06-04 per dues raons: continua havent-hi projectes que el fan servir i cal saber llegir-lo, i la seva configuració és la més senzilla de totes, cosa que la fa excel·lent per entendre l'essència d'un pipeline.
7.6. Azure DevOps Pipelines
- Model d'execució: pipelines amb stages, jobs i steps, executats en agents allotjats per Microsoft o propis.
- On es defineix:
azure-pipelines.ymlal repositori (o mitjançant l'editor clàssic visual, que és el model antic). - SaaS o autoallotjat: SaaS (Azure DevOps Services) o autoallotjat (Azure DevOps Server, abans TFS).
- Tret distintiu: forma part d'una suite completa (Boards, Repos, Artifacts, Test Plans) molt implantada en organitzacions amb inversió en l'ecosistema Microsoft, i amb suport excel·lent per a .NET i Windows.
- Punt fort: entorns d'aprovació i controls de governança molt elaborats, útils en empreses amb processos formals de release.
- Punt feble: conviuen dos models (clàssic visual i YAML) i la documentació històrica els barreja tots dos, cosa que confon qui comença.
7.7. Argo CD
- Model d'execució: no és un servidor de CI. És un controlador que viu dins d'un clúster de Kubernetes i reconcilia contínuament l'estat del clúster amb el declarat en un repositori Git.
- On es defineix: manifestos de Kubernetes (o Helm/Kustomize) en un repositori Git.
- SaaS o autoallotjat: autoallotjat al teu clúster (hi ha ofertes gestionades de tercers).
- Tret distintiu: és la referència de GitOps. Es combina, no es substitueix: GitHub Actions construeix i publica l'artefacte, actualitza el manifest, i Argo CD s'encarrega de portar-lo al clúster.
- Quan té sentit: quan ja fas servir Kubernetes. Sense Kubernetes, ara com ara, no aplica.
7.8. Tekton
- Model d'execució: un framework de CI/CD natiu de Kubernetes: cada pas del pipeline és un contenidor i cada execució és un recurs de Kubernetes (
Task,Pipeline,PipelineRun). - On es defineix: manifestos YAML de Kubernetes, versionats al repositori.
- SaaS o autoallotjat: autoallotjat sobre Kubernetes; és la base de diversos productes comercials.
- Tret distintiu: no és una eina "d'utilitzar", és una base per construir la teva pròpia plataforma de CI/CD. Molt potent i molt de baix nivell.
- Quan té sentit: organitzacions grans que construeixen una plataforma interna per a molts equips. Per a un equip de tres persones és clarament excessiu.
- Taula comparativa d'alt nivell
| Eina | Categoria | SaaS / autoallotjat | On es defineix | Model d'execució | Encaixa bé quan... |
|---|---|---|---|---|---|
| GitHub Actions | Servidor CI/CD | SaaS (+ runners propis) | .github/workflows/*.yml |
Runners efímers per job | El teu codi és a GitHub i vols començar avui |
| GitLab CI/CD | Servidor CI/CD | Tots dos | .gitlab-ci.yml |
Runners amb diversos executors | Vols una plataforma DevOps única i integrada |
| Jenkins | Servidor CI/CD | Autoallotjat | Jenkinsfile (o interfície web) |
Controlador + agents persistents | Necessites control total, xarxes internes o integracions exòtiques |
| CircleCI | Servidor CI/CD | SaaS (+ runners propis) | .circleci/config.yml |
Contenidors/VM amb paral·lelisme | El temps de pipeline és la teva prioritat i vols independència del repositori |
| Travis CI | Servidor CI/CD | SaaS | .travis.yml |
VM/contenidors per build | Mantens un projecte que ja el fa servir; o vols l'exemple més simple possible |
| Azure DevOps Pipelines | Servidor CI/CD | Tots dos | azure-pipelines.yml |
Agents allotjats o propis | La teva organització viu a l'ecosistema Microsoft |
| Argo CD | Desplegament GitOps | Autoallotjat (a Kubernetes) | Manifestos a Git | Reconciliació contínua (pull) | Ja fas servir Kubernetes i vols desplegaments auditables sense credencials al CI |
| Tekton | Servidor CI/CD | Autoallotjat (a Kubernetes) | CRD de Kubernetes | Cada pas, un contenidor | Construeixes una plataforma interna de CI/CD per a molts equips |
Un advertiment sobre aquesta taula: no triïs pel nombre de caselles verdes. A la pràctica, el criteri que més pesa és on viu el teu codi i què sap mantenir el teu equip. Els criteris formals d'elecció els sistematitzarem a la lliçó 06-07.
- Per què aquest curs fa servir GitHub Actions
L'elecció d'aquest curs és GitHub Actions, i convé explicar-ne els motius perquè sàpigues quins són transferibles al teu cas i quins no:
- Proximitat al repositori. El pipeline viu al mateix lloc que el codi. L'esdeveniment que el dispara (un pull request), la revisió, el resultat i l'històric són a la mateixa pantalla. Per aprendre, això elimina una barrera enorme: no hi ha un segon sistema per configurar ni credencials creuades.
- Model declaratiu i llegible. Un flux de treball de GitHub Actions es llegeix de dalt a baix gairebé com prosa. En ser declaratiu, descrius què vols, no com orquestrar-ho. Això fa que els exemples del curs siguin fàcils d'entendre encara que no hagis vist mai l'eina.
- Cost zero per començar. Els repositoris públics tenen execució gratuïta, i els privats una quota mensual generosa. Pots reproduir tots els exemples del curs sense pagar res.
- Adopció molt àmplia. És avui l'eina més probable que et trobis en un projecte nou, i apareix constantment en ofertes de feina.
- Els conceptes són universals. Tot el que aprendràs —triggers, jobs, matrius, artefactes, memòria cau, secrets, entorns amb aprovació, promoció— existeix amb un altre nom a totes les altres. La secció següent ho demostra.
I per honestedat, els motius pels quals podries triar-ne una altra:
- El teu codi no és a GitHub → GitLab CI o CircleCI encaixen millor.
- Necessites accedir a sistemes interns que no surten de la teva xarxa → Jenkins o runners autoallotjats.
- La teva organització ja té una plataforma establerta → aprèn aquesta; el coneixement es transfereix igual.
El mòdul 6 aprofundeix en cada eina per separat (Jenkins a 06-01, GitLab CI a 06-02, CircleCI a 06-03, Travis CI a 06-04, Docker i Kubernetes a 06-05, GitHub Actions a fons a 06-06) i a la lliçó 06-07 veurem els criteris formals per triar. A més, en aquest mòdul reexpressarem el mateix pipeline de Reservalia en cada eina, que és la millor manera de comprovar que el que s'ha après es transfereix.
- La mateixa feina en dues eines
Vegem-ho ja, en petit. La feina és deliberadament trivial: instal·lar les dependències i executar els tests d'apps/api quan algú empeny codi.
Important: no cal que entenguis cada línia. Aquí només volem que comparis les dues columnes i vegis que diuen el mateix. La construcció real del pipeline de Reservalia comença a la lliçó 02-02.
10.1. GitHub Actions
# Fitxer: .github/workflows/test-api.yml
name: Tests de l'API
# TRIGGER: quin esdeveniment dispara aquest flux de treball.
on: [push]
jobs:
# Nom intern del JOB. Apareixera aixi a la interficie de GitHub.
test-api:
# RUNNER: la maquina on s executa. Efimera i neta.
runs-on: ubuntu-latest
# STEPS: els passos, en ordre estricte.
steps:
# Pas 1: descarregar el codi del repositori al runner.
# Sense aixo, la maquina esta buida. Es sempre el primer pas.
- uses: actions/checkout@v4
# Pas 2: installar Node 20. Fixem la versio perque la
# build sigui reproduible (concepte de la llico 01-01).
- uses: actions/setup-node@v4
with:
node-version: '20'
# Pas 3: installar dependencies EXACTAMENT com diu el lock.
# working-directory situa l ordre dins d apps/api.
- run: npm ci
working-directory: apps/api
# Pas 4: executar els tests. Si l ordre retorna un codi
# de sortida diferent de 0, el job falla i el pipeline es posa vermell.
- run: npm test
working-directory: apps/api10.2. GitLab CI
# Fitxer: .gitlab-ci.yml (a l arrel del repositori)
# STAGES: les etapes del pipeline, en ordre.
stages:
- test
# Nom del JOB.
test-api:
# A quina etapa pertany.
stage: test
# RUNNER: aqui s expressa com la imatge Docker en que corre el job.
# Equival a runs-on + setup-node de GitHub Actions, en una sola linia.
image: node:20
# No cal un pas de checkout: GitLab clona el repositori
# automaticament abans d executar el job.
script:
- cd apps/api
- npm ci
- npm test
# TRIGGER: aqui es declara per job, no globalment.
rules:
- if: $CI_PIPELINE_SOURCE == "push"10.3. Què canvia i què no
Posa les dues al costat i veuràs que els conceptes són idèntics; només canvia on s'escriu cadascun:
| Concepte (lliçó 01-01) | GitHub Actions | GitLab CI |
|---|---|---|
| Trigger | on: [push], global al flux de treball |
rules: dins de cada job |
| Job | Clau sota jobs: |
Clau de primer nivell |
| Stage / etapa | Implícita; s'ordena amb needs: |
Explícita: stages: + stage: |
| Runner | runs-on: ubuntu-latest |
image: node:20 |
| Descàrrega del codi | Pas explícit actions/checkout@v4 |
Automàtic |
| Preparar el llenguatge | Pas actions/setup-node@v4 |
Triar la imatge adequada |
| Executar ordres | - run: (un pas per ordre) |
script: (llista d'ordres) |
| Com es detecta la fallada | Codi de sortida ≠ 0 | Codi de sortida ≠ 0 |
Les dues diferències filosòfiques que expliquen gairebé tota la resta:
- GitHub Actions aposta per accions reutilitzables del Marketplace (
setup-node,checkout), que encapsulen feina. Escrius menys, però depens de tercers. - GitLab CI aposta per imatges Docker com a unitat d'entorn. Més explícit i amb menys màgia, però tries tu la imatge correcta.
I el que no canvia en cap eina del món:
- Un esdeveniment del repositori dispara l'execució.
- Es prepara una màquina neta amb el codi.
- S'instal·len dependències de manera reproduïble.
- S'executen ordres.
- Si una ordre retorna un codi de sortida diferent de zero, el pipeline falla.
Aquest darrer punt és especialment alliberador: la unitat universal d'èxit o fracàs en CI/CD és el codi de sortida d'un procés. Totes les eines, sense excepció, s'hi recolzen.
# Comprova-ho a la teva propia terminal.
# Tota ordre deixa el seu codi de sortida a la variable $?
# 0 = exit; qualsevol altre valor = fallada.
echo "hola"
echo $? # → 0 ✅ el pipeline continuaria
ls /carpeta/que/no/existeix
echo $? # → 2 ❌ el pipeline es posaria vermell aqui
# Per aixo `npm test` funciona igual a les 8 eines d aquesta llico:
# els frameworks de test retornen 0 si tot passa i ≠0 si alguna cosa falla.Errors Comuns i Consells
Error 1: comparar eines de categories diferents. "Què és millor, Jenkins o Argo CD?" és una pregunta mal plantejada: l'un executa pipelines i l'altre sincronitza clústers. Abans de comparar, situa cada eina a la seva casella del mapa de la secció 1.
Error 2: triar per popularitat. Que Kubernetes sigui l'estàndard no vol dir que el teu equip de tres persones el necessiti. La millor eina és la que el teu equip pot mantenir sense dedicar-li un terç del seu temps. Reservalia tria ECS Fargate justament per això.
Error 3: creure que l'elecció és irreversible. Com acabes de veure, migrar un pipeline entre eines és sobretot una feina de traducció de sintaxi. El que sí que costa migrar és el que està mal fet: pipelines configurats des d'una interfície web, scripts immensos i impossibles de llegir o secrets incrustats al YAML. Inverteix en què el teu pipeline estigui ben fet, no en triar l'eina perfecta.
Error 4: configurar el pipeline des de la interfície gràfica. És temptador perquè és ràpid. Sis mesos després ningú no sap qui va canviar què, no es pot revertir i recuperar el servidor és impossible. Tot pipeline ha de viure al repositori.
Error 5: acumular eines sense necessitat. Afegir Argo CD "perquè és GitOps" a un projecte que ni tan sols fa servir Kubernetes afegeix complexitat sense benefici. Cada eina nova és un sistema més per aprendre, mantenir, actualitzar i depurar a les tres de la matinada.
Consell 1: aprèn-ne una a fons abans que cinc per sobre. El coneixement profund d'una eina es transfereix; el coneixement superficial de cinc, no. Per això aquest curs construeix tot en GitHub Actions i només al final, al mòdul 6, tradueix.
Consell 2: fes servir el criteri "on viu el meu codi". És el filtre més eficaç. GitHub → GitHub Actions. GitLab → GitLab CI. Servidor Git intern → Jenkins o GitLab autoallotjat. Aquest criteri simple encerta en la gran majoria de casos.
Consell 3: fixa les versions de les accions i plugins que facis servir. actions/checkout@v4 en comptes d'actions/checkout@main. Una acció de tercers és codi aliè executant-se amb accés al teu repositori. És una superfície d'atac real i li dedicarem atenció a la lliçó 04-03.
Consell 4: en llegir documentació, tradueix-la mentalment als conceptes de 01-01. Quan trobis un terme nou, pregunta't: això és un trigger, un job, una etapa, un runner o un artefacte? Gairebé sempre és una d'aquestes cinc coses amb un altre nom, i aquesta traducció converteix la documentació de qualsevol eina en una cosa familiar.
Exercicis
Exercici 1: classificar eines per categoria
Col·loca cada eina a la seva categoria del mapa de la secció 1 (servidor de CI/CD, orquestrador de contenidors, registre d'artefactes, IaC o desplegament GitOps) i indica en una frase quin problema resol:
- Terraform
- Amazon ECR
- Flux
- Amazon ECS Fargate
- CircleCI
- Nexus
- Kubernetes
- Tekton
Exercici 2: traduir un flux de treball
Tradueix el flux de treball següent de GitHub Actions a .gitlab-ci.yml. Afegeix després una taula d'equivalències concepte a concepte.
name: Verificar la web
on: [push]
jobs:
lint-i-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
working-directory: apps/web
- run: npm run lint
working-directory: apps/web
- run: npm run build
working-directory: apps/webExercici 3: recomanar eines en tres escenaris
Per a cada equip, recomana una combinació d'eines (servidor de CI/CD + registre + destinació d'execució, i GitOps o IaC si escau) i justifica cada elecció en una o dues frases. No hi ha una única resposta correcta; es valora la justificació.
- Reservalia. Tres persones. Codi a GitHub. Despleguen a AWS amb ECS Fargate. Cap experiència prèvia en CI/CD. Pressupost molt ajustat.
- Banc Meridiano. Equip de plataforma de 40 persones. El codi és en un servidor Git intern que no pot sortir de la xarxa corporativa per normativa. Despleguen a un Kubernetes local. Necessiten aprovacions registrades i auditables per cada desplegament a producció.
- Ludika. Estudi de videojocs de 15 persones. Codi a GitLab.com. Compilen builds per a Windows, macOS i Linux a cada release. Els artefactes pesen diversos gigabytes.
Solucions
Solució a l'Exercici 1
| Eina | Categoria | Problema que resol |
|---|---|---|
| Terraform | Infraestructura com a codi | Defineix recursos de núvol (bases de dades, xarxes, balancejadors) en fitxers versionats, en comptes de crear-los a mà en una consola web |
| Amazon ECR | Registre d'artefactes | Emmagatzema de manera versionada i immutable les imatges de contenidor, per poder promocionar el mateix artefacte entre entorns |
| Flux | Desplegament continu GitOps | Sincronitza contínuament un clúster de Kubernetes amb l'estat declarat en un repositori Git, en model pull |
| Amazon ECS Fargate | Orquestrador de contenidors | Executa i manté vius els contenidors (reinici, escalat, salut) sense que hagis d'administrar servidors |
| CircleCI | Servidor de CI/CD | Executa el pipeline de build, test i desplegament en resposta a esdeveniments del repositori |
| Nexus | Registre d'artefactes | Emmagatzema artefactes de múltiples formats i actua a més com a proxy de memòria cau de dependències externes |
| Kubernetes | Orquestrador de contenidors | Planifica, escala i manté contenidors en un clúster de màquines |
| Tekton | Servidor de CI/CD | Executa pipelines de manera nativa a Kubernetes, com a base per construir una plataforma pròpia |
Dues observacions que convé haver notat:
- Flux i Tekton són tots dos "a Kubernetes" però no són la mateixa categoria. Tekton executa pipelines (construeix i prova); Flux sincronitza l'estat desplegat. Es fan servir junts, no l'un en lloc de l'altre.
- ECR i Nexus són a la mateixa categoria encara que l'un sigui un servei gestionat d'AWS i l'altre un producte instal·lable: la categoria la defineix la funció, no el model de distribució.
Solució a l'Exercici 2
# .gitlab-ci.yml
stages:
- verificar
lint-i-build:
stage: verificar
image: node:20 # substitueix runs-on + setup-node
script:
- cd apps/web
- npm ci
- npm run lint
- npm run build
rules:
- if: $CI_PIPELINE_SOURCE == "push"Taula d'equivalències:
| Concepte | GitHub Actions | GitLab CI | Comentari |
|---|---|---|---|
| Nom del pipeline | name: Verificar la web |
No hi ha equivalent directe; el nom el dona el job o el fitxer | Detall cosmètic |
| Trigger | on: [push] (global) |
rules: if $CI_PIPELINE_SOURCE == "push" (per job) |
GitHub el declara a dalt; GitLab, per job |
| Job | jobs.lint-i-build |
lint-i-build: de primer nivell |
Mateix concepte |
| Etapa | Implícita | stages: + stage: verificar |
GitLab exigeix declarar-la; GitHub la dedueix de l'ordre i de needs: |
| Runner / entorn | runs-on: ubuntu-latest |
image: node:20 |
GitLab defineix l'entorn amb la imatge |
| Descàrrega del codi | actions/checkout@v4 |
Automàtic | GitLab clona sempre abans del job |
| Versió de Node | actions/setup-node@v4 |
Inclosa a node:20 |
Dues maneres diferents de fixar la versió |
| Directori de treball | working-directory: per pas |
cd apps/web una vegada |
A GitLab les ordres comparteixen shell |
| Ordres | - run: un per pas |
script: llista |
A GitHub cada pas es veu per separat a la interfície |
Un matís subtil que val la pena entendre: a GitHub Actions cada run és un shell independent, per això cal repetir working-directory a cada pas —un cd en un pas no afecta el següent. A GitLab, totes les ordres de script comparteixen el mateix shell, així que un sol cd n'hi ha prou. Aquesta diferència sorprèn molta gent en migrar en qualsevol dels dos sentits.
Solució a l'Exercici 3
1. Reservalia
- Servidor de CI/CD: GitHub Actions. El codi ja és a GitHub: sense sistemes addicionals, sense credencials creuades i amb quota gratuïta suficient per a un equip de tres. Cost d'arrencada pràcticament nul, que és determinant sense experiència prèvia ni pressupost.
- Registre: Amazon ECR. És al mateix núvol que l'execució, l'autenticació es resol amb IAM i les descàrregues dins de la mateixa regió no generen trànsit sortint facturable.
- Execució: ECS Fargate. Ja és la seva destinació. És la decisió correcta per a tres persones: contenidors sense administrar un clúster. Kubernetes aquí seria sobreenginyeria i consumiria el temps de la Nuria.
- IaC: Terraform, a partir del mòdul 3, perquè
stagingiprodsiguin reproduïbles i no depenguin del que la Nuria recordi haver clicat. - GitOps: no. No fan servir Kubernetes; Argo CD no hi aporta res i sí complexitat.
2. Banc Meridiano
- Servidor de CI/CD: Jenkins autoallotjat (o GitLab autogestionat). És el criteri decisiu: el codi no pot sortir de la xarxa. Qualsevol SaaS queda descartat per normativa, no per preferència. La mida de l'equip (40 persones) justifica el cost d'administració, que a Reservalia seria prohibitiu.
- Registre: Artifactory o Nexus a la xarxa interna, amb funció afegida de proxy de dependències externes: útil quan la sortida a internet està restringida.
- Execució: el seu Kubernetes local, ja existent.
- GitOps: Argo CD, molt recomanable. Aquí encaixa perfectament per dues raons: ja tenen Kubernetes, i el model pull elimina la necessitat que el sistema de CI tingui credencials de producció, cosa que és un argument de pes davant d'un auditor. A més, el repositori Git de manifestos es converteix en el registre auditable de què es va desplegar, quan i aprovat per qui.
- Aprovacions: portes manuals obligatòries abans de producció. És un cas clar de Lliurament Continu i no de Desplegament Continu, i aquesta porta és un requisit regulador, no una mancança.
3. Ludika
- Servidor de CI/CD: GitLab CI/CD. El codi és a GitLab.com: aplica el criteri "on viu el meu codi". A més, el registre de paquets i contenidors ve integrat al mateix producte.
- Registre: GitLab Package Registry, amb una excepció important: builds de diversos gigabytes per plataforma i per release consumeixen emmagatzematge molt de pressa. Cal definir una política de retenció des del primer dia (per exemple, conservar totes les builds de release i només les últimes N de desenvolupament) o la factura es descontrola.
- Execució multiplataforma: runners propis. Aquí hi ha una restricció que molta gent descobreix tard: compilar per a macOS requereix maquinari Apple, per llicència. Caldrà fer servir runners macOS propis o allotjats d'un proveïdor especialitzat, i sabent que el seu cost per minut és sensiblement més alt.
- Consideració addicional: amb artefactes tan pesants, el temps i el cost de pujada i baixada dominen el pipeline. Val la pena invertir en memòria cau de dependències i en compilació incremental abans que en qualsevol altra optimització (matèria de la lliçó 04-04).
- GitOps: no aplica. El producte no es desplega en un clúster; es distribueix a usuaris finals.
Conclusió
Aquesta lliçó ha ordenat el soroll de l'ecosistema:
- Les eines s'organitzen en cinc categories complementàries: servidors de CI/CD, orquestradors de contenidors, registres d'artefactes, infraestructura com a codi i desplegament GitOps. No competeixen entre categories: es combinen.
- Dins dels servidors de CI/CD, les dues preguntes que més defineixen l'experiència són SaaS o autoallotjat i on es defineix el pipeline. I hi ha una resposta que no admet matisos: el pipeline ha de viure al repositori, mai en formularis d'una interfície web.
- Hem situat GitHub Actions, GitLab CI/CD, Jenkins, CircleCI, Travis CI, Azure DevOps Pipelines, Argo CD i Tekton, cadascuna amb el seu model d'execució i el seu terreny natural.
- El curs farà servir GitHub Actions per la seva proximitat al repositori, el seu model declaratiu llegible i el seu cost nul per començar; el mòdul 6 aprofundeix en cada eina i reexpressa el pipeline de Reservalia en unes quantes.
- I el més important: en comparar la mateixa feina en GitHub Actions i en GitLab CI hem comprovat que el que canvia és la sintaxi, no els conceptes. Trigger, job, etapa, runner, passos i codi de sortida hi són a totes. El que aprenguis aquí es transfereix.
Ja sabem què és CI/CD, per què val la pena i amb què es construeix. Falta el més concret: què automatitzarem exactament. A la lliçó següent, El Projecte del Curs: l'Aplicació que Automatitzarem, coneixerem Reservalia a fons: el seu producte, el seu equip, l'estructura real del repositori, els scripts que el pipeline invocarà, els seus tres entorns i la infraestructura AWS de destinació. També veurem el full de ruta de què haurem automatitzat al final de cada mòdul i què necessites instal·lat per seguir els exemples, facis servir Node.js o no.
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
