L’interesse per l’automazione CI/CD e cresciuto costantemente negli ultimi tre anni, e il volume di ricerca per “configurazione pipeline CI/CD” e aumentato del 34% solo nel 2025. Nonostante cio, la maggior parte delle agenzie di sviluppo britanniche effettua ancora il deployment tramite sessioni SSH manuali o script ad hoc. Questo divario rappresenta uno svantaggio competitivo significativo: i team con pipeline CI/CD mature rilasciano circa cinque volte piu frequentemente e individuano i bug in una fase in cui le correzioni costano dieci volte meno rispetto alla remediation post-deployment.
Questa guida copre la realta pratica della configurazione di una pipeline CI/CD per un team di sviluppo britannico nel 2026: scegliere una piattaforma, strutturare correttamente le fasi della pipeline, integrare le scansioni di sicurezza e gestire le strategie di deployment che funzionano davvero in produzione.
TL;DR
- CI compila e testa ogni commit automaticamente; CD consegna il codice validato in staging o produzione senza intervento manuale
- GitHub Actions e la scelta predefinita giusta per la maggior parte dei team britannici nel 2026; GitLab CI e la scelta migliore se si necessita di runner self-hosted o controlli di audit piu severi
- Una pipeline pronta per la produzione ha undici fasi dal build al monitoraggio post-deploy, non solo build e test
- Le scansioni di sicurezza appartengono alla pipeline, non aggiunte in seguito: SAST, auditing delle dipendenze e scansione dei segreti devono essere eseguite su ogni pull request
Cosa e davvero CI/CD
Il termine viene usato in modo vago, quindi vale la pena essere precisi. L’integrazione continua (CI) significa che ogni commit su un branch condiviso innesca una sequenza automatizzata: il codice viene compilato, lintato e testato prima che la modifica venga accettata. L’obiettivo e rilevare i problemi di integrazione immediatamente, mentre il contesto e ancora fresco, piuttosto che alla fine di uno sprint quando si fondono una settimana di branch divergenti.
La consegna continua (CD) estende questa automazione in modo che il codice validato possa essere rilasciato in staging o produzione con passaggi manuali minimi o nulli. Il deployment continuo (la versione piu forte) significa che ogni pipeline riuscita viene distribuita automaticamente in produzione. La maggior parte dei team inizia con la consegna continua, aggiunge un gate di approvazione manuale prima del deployment in produzione, e si avvicina al deployment continuo completo una volta acquisita sufficiente fiducia nella copertura dei test e nei meccanismi di rollback.
Il risultato pratico e che CI/CD trasforma il deployment da un evento ad alta tensione e di piu ore in un processo di background routinario che avviene decine di volte a settimana.
Scegliere una piattaforma
La scelta della piattaforma e importante ma non definitiva. Migra in seguito se necessario, ma scegli ora il giusto default per il tuo contesto:
GitHub Actions e la scelta giusta per la maggior parte dei team di sviluppo britannici che iniziano un nuovo progetto nel 2026. E profondamente integrato con GitHub, ha il piu grande ecosistema di action riutilizzabili, minuti gratuiti generosi per i repository pubblici e un formato di configurazione ben documentato. I runner ospitati coprono Linux, Windows e macOS. Per i team gia su GitHub, il vantaggio del percorso di minima resistenza e reale.
GitLab CI e la scelta migliore se si necessita di runner self-hosted (per ragioni regolamentari o per accedere a risorse di rete private), logging di audit piu robusto, o se il team preferisce un’unica piattaforma per il controllo del codice sorgente, CI, registro container e deployment. Il formato .gitlab-ci.yml di GitLab e maturo e ben compreso.
CircleCI ha un forte parallelismo e supporto Docker, e la sua configurazione e leggibile. Era il leader di mercato prima di GitHub Actions e molte agenzie britanniche lo usano ancora. Non c’e alcuna ragione urgente per migrare una configurazione CircleCI esistente se funziona.
Jenkins e legacy. Funziona, e molte grandi organizzazioni lo gestiscono con successo, ma per un nuovo progetto nel 2026 il costo operativo del mantenimento di un server Jenkins non vale la pena. Se si eredita Jenkins, valuta il costo di migrazione prima di impegnarti a lungo termine.
Bitbucket Pipelines e accettabile se il team e integrato nello stack Atlassian e non puo cambiare il controllo del codice sorgente. Il set di funzionalita e in ritardo rispetto a GitHub Actions ma copre i fondamentali.
Fasi della pipeline: cosa includere e perche
Una pipeline completa e pronta per la produzione ha piu fasi di quante ne coprano la maggior parte dei tutorial. Ecco la sequenza completa con la motivazione dietro ogni fase:
Fase 1: Build
Compila o transpila il sorgente, installa le dipendenze e produci l’artefatto di build. Per un progetto Node.js, questo significa npm ci (non npm install, perche ci usa esattamente il lockfile) e il tuo step di build. Per un servizio Python, significa creare un ambiente virtuale e installare da requirements.txt. L’output e un artefatto versionato: un binario compilato, un bundle JS transpilato o un file wheel.
Effettua un caching aggressivo delle dipendenze qui. npm ci con una cache indicizzata su package-lock.json significa che le successive esecuzioni della pipeline che non hanno modificato le dipendenze saltano completamente il download.
Fase 2: Lint e analisi statica
ESLint, flake8, mypy, Pylance in modalita strict, o il tuo equivalente appropriato al linguaggio. Questa fase e veloce, tipicamente sotto i 30 secondi, e individua un’ampia classe di problemi prima dell’esecuzione dei test. Il type checking statico (mypy per Python, tsc --noEmit di TypeScript per JS/TS) e particolarmente prezioso per rilevare mismatch di interfacce che i test unitari spesso mancano.
Fallisci velocemente qui. Non ha senso eseguire una suite di test di dieci minuti se il codice non supera il lint.
Fase 3: Test unitari
Esegui la tua suite di test unitari. I test unitari devono essere veloci. Se l’esecuzione completa dei test unitari richiede piu di cinque minuti, dividi la suite o investiga il perche. Parallelizza sui file di test dove il test runner lo supporta (Jest con --runInBand disattivato, pytest-xdist per Python).
Punto critico: i test unitari usano mock per i servizi esterni. L’ambiente CI non dovrebbe avere credenziali reali del database o chiavi API esterne in questa fase.
Fase 4: Test di integrazione
I test di integrazione vengono eseguiti contro servizi reali: un database di test, un’istanza Redis, una coda di messaggi locale. La maggior parte delle piattaforme CI supporta container di servizio per questo scopo. In GitHub Actions, si dichiara un blocco services accanto al job per avviare un container PostgreSQL o MySQL per la durata dell’esecuzione dei test.
Questa e la fase che individua i bug che i test unitari mancano: query ORM semanticamente errate, problemi di isolamento delle transazioni, errori di vincoli di chiave esterna. Esegui i test di integrazione contro un database reale, non un mock.
Fase 5: Scansione di sicurezza
Le scansioni di sicurezza appartengono alla pipeline, non a una scansione pianificata trimestrale. Questa fase ha tre componenti:
SAST (Static Application Security Testing). Semgrep e la scelta piu pratica per un team poliglotta; ha regole per Python, JavaScript, TypeScript, Go, Java e altro. Per Python specificamente, Bandit individua i pattern antipattern di sicurezza comuni. CodeQL di GitHub e disponibile gratuitamente per i repository pubblici e individua una classe diversa di vulnerabilita rispetto agli strumenti di pattern-matching. Eseguine almeno uno su ogni pull request.
Auditing delle dipendenze. npm audit --audit-level=high per i progetti Node.js e pip-audit per Python. Questi controllano le dipendenze installate rispetto al database OSV (Open Source Vulnerabilities). Blocca la pipeline su finding alti e critici; segnala i finding medi per la revisione umana piuttosto che bloccarli.
Scansione dei segreti. Gitleaks analizza la cronologia dei commit alla ricerca di credenziali, chiavi API e token commessi accidentalmente. Questa e la tua ultima linea di difesa prima che i segreti raggiungano il remote. La scansione dei segreti integrata di GitHub vale anche la pena abilitarla, ma Gitleaks nella pipeline individua i problemi prima del push piuttosto che dopo.
Fase 6: Build e push dell’immagine Docker
Se il tuo target di deployment e i container, costruisci l’immagine Docker e fai il push nel tuo registry qui. Tagga con il commit SHA, non solo con latest. I tag immutabili significano che puoi sempre identificare esattamente quale commit e in esecuzione in produzione. Fai push su GitHub Container Registry (ghcr.io), AWS ECR o il registry di tua scelta.
Esegui una scansione dell’immagine container (Trivy o Grype) sull’immagine costruita prima del push. Questo individua le CVE a livello OS nell’immagine base che l’auditing delle dipendenze non rileva.
Fase 7: Deployment in staging
Distribuisci l’artefatto validato in un ambiente di staging che rispecchi la produzione. L’infrastructure-as-code (Terraform, Pulumi) significa che il tuo ambiente di staging e definito in modo identico alla produzione. Lo step di deployment deve essere idempotente: eseguirlo due volte non dovrebbe causare problemi.
Fase 8: Smoke test contro lo staging
Dopo il deployment in staging, esegui un insieme minimo di controlli end-to-end: l’applicazione puo avviarsi, l’endpoint health risponde con 200, un flusso di login di base funziona? Questi test dovrebbero essere completati in meno di due minuti. L’obiettivo non e la copertura completa ma individuare i fallimenti di deployment che i test isolati non individuerebbero.
Fase 9: Gate di approvazione manuale
Prima del deployment in produzione, fai una pausa per l’approvazione di un essere umano. In GitHub Actions, si tratta di una regola di protezione dell’ambiente con reviewer richiesti. In GitLab CI, e un trigger di job manuale. Questo gate deve essere leggero: un reviewer che conferma che l’ambiente di staging sembra corretto, non un lungo processo di firma.
Per i team che si avvicinano al deployment continuo, questo gate puo essere automatizzato una volta che la frequenza di deployment e la copertura dei test sono sufficientemente alte, ma iniziare con il gate e il default piu sicuro.
Fase 10: Deployment in produzione
Lo stesso step di deployment dello staging, puntato all’ambiente di produzione. Con un artefatto immutabile taggato dal commit SHA, il deployment in produzione e deterministico.
Fase 11: Verifica del monitoraggio post-deploy
Dopo il deployment in produzione, la pipeline dovrebbe verificare che il monitoraggio sia sano: il tasso di errori non e elevato, l’endpoint health sta rispondendo e non ci sono picchi di latenza. Un semplice controllo sulla tua piattaforma di osservabilita (Datadog, Grafana o anche un semplice health check HTTP) ti fornisce un segnale automatizzato che il deployment e riuscito o un alert per attivare un rollback.
Una configurazione GitHub Actions realistica
Di seguito e riportata una struttura di pipeline abbreviata ma realistica per un’applicazione Node.js:
1name: CI/CD Pipeline
2
3on:
4 push:
5 branches: [main, develop]
6 pull_request:
7 branches: [main]
8
9jobs:
10 build-and-lint:
11 runs-on: ubuntu-latest
12 steps:
13 - uses: actions/checkout@v4
14 - uses: actions/setup-node@v4
15 with:
16 node-version: '20'
17 cache: 'npm'
18 - run: npm ci
19 - run: npm run lint
20 - run: npx tsc --noEmit
21
22 unit-tests:
23 needs: build-and-lint
24 runs-on: ubuntu-latest
25 steps:
26 - uses: actions/checkout@v4
27 - uses: actions/setup-node@v4
28 with:
29 node-version: '20'
30 cache: 'npm'
31 - run: npm ci
32 - run: npm test -- --coverage
33
34 integration-tests:
35 needs: build-and-lint
36 runs-on: ubuntu-latest
37 services:
38 postgres:
39 image: postgres:16
40 env:
41 POSTGRES_PASSWORD: testpass
42 POSTGRES_DB: testdb
43 options: >-
44 --health-cmd pg_isready
45 --health-interval 10s
46 --health-timeout 5s
47 --health-retries 5
48 steps:
49 - uses: actions/checkout@v4
50 - uses: actions/setup-node@v4
51 with:
52 node-version: '20'
53 cache: 'npm'
54 - run: npm ci
55 - run: npm run test:integration
56 env:
57 DATABASE_URL: postgres://postgres:testpass@localhost:5432/testdb
58
59 security-scan:
60 needs: build-and-lint
61 runs-on: ubuntu-latest
62 steps:
63 - uses: actions/checkout@v4
64 with:
65 fetch-depth: 0
66 - uses: actions/setup-node@v4
67 with:
68 node-version: '20'
69 cache: 'npm'
70 - run: npm ci
71 - run: npm audit --audit-level=high
72 - uses: semgrep/semgrep-action@v1
73 - name: Run Gitleaks
74 uses: gitleaks/gitleaks-action@v2
75
76 deploy-staging:
77 needs: [unit-tests, integration-tests, security-scan]
78 runs-on: ubuntu-latest
79 environment: staging
80 if: github.ref == 'refs/heads/main'
81 steps:
82 - uses: actions/checkout@v4
83 - name: Deploy to staging
84 run: ./scripts/deploy.sh staging
85
86 deploy-production:
87 needs: deploy-staging
88 runs-on: ubuntu-latest
89 environment: production
90 steps:
91 - uses: actions/checkout@v4
92 - name: Deploy to production
93 run: ./scripts/deploy.sh production
I job unit-tests, integration-tests e security-scan vengono eseguiti in parallelo dopo il completamento del job build-and-lint. Questa struttura riduce il tempo totale della pipeline senza sacrificare la copertura.
Strategie di deployment
Come si effettua il deployment e importante quanto il fatto di effettuarlo. Tre strategie coprono la maggior parte delle esigenze dei team britannici:
Deployment progressivo (Rolling deploy). Sostituisce le istanze una alla volta. Semplice da implementare con la maggior parte degli orchestratori (Kubernetes, ECS). Rischio: se la nuova versione ha un bug, alcuni utenti raggiungono le istanze vecchie e altri le nuove durante la finestra di rollout. Buon default per le applicazioni a basso traffico.
Deployment Blue/Green. Si mantengono due ambienti di produzione identici. Il traffico passa da blue a green in modo atomico. Se la nuova versione e difettosa, si torna indietro in secondi. Il costo e gestire due ambienti contemporaneamente, il che non e banale per i database. Migliore per le applicazioni dove il downtime e inaccettabile e la velocita di rollback e critica.
Release Canary. Instrada una piccola percentuale di traffico (5% o 10%) alla nuova versione, osserva i tassi di errore e le prestazioni per un periodo definito, poi promuovi il canary al 100%. Eccellente per le applicazioni ad alto traffico dove si desidera un feedback reale dalla produzione prima del rollout completo. Richiede che il load balancer o service mesh supporti lo splitting del traffico.
La maggior parte dei team britannici dovrebbe iniziare con i deployment progressivi, aggiungere il blue/green quando il traffico e la criticita lo giustificano, e considerare le release canary quando rilasciano piu volte al giorno e hanno bisogno di feedback di produzione validato ad ogni passo.
Gestione dei segreti
I segreti non appartengono al codice, ai file di configurazione o ai file .env specifici dell’ambiente committati nel controllo del codice sorgente. L’approccio corretto:
GitHub Secrets / variabili GitLab CI per i segreti di cui hanno bisogno i job della pipeline. Questi sono crittografati a riposo, mascherati nei log e disponibili ai job tramite variabili d’ambiente.
Segreti specifici dell’ambiente configurati al livello del target di deployment: AWS Parameter Store, Azure Key Vault, Google Secret Manager o HashiCorp Vault per i team con esigenze piu complesse. L’applicazione legge i segreti all’avvio dal secret store, non dalle variabili d’ambiente passate attraverso la pipeline.
Rotazione. Le chiavi API, le password del database e le credenziali del servizio devono essere ruotate secondo un programma. Le pipeline CI/CD rendono la rotazione piu facile perche l’aggiornamento del segreto in un posto (il secret store o l’ambiente CI) si propaga al deployment successivo automaticamente.
Gitleaks nella pipeline e la rete di sicurezza per quando uno sviluppatore commette accidentalmente un segreto. La remediation per un segreto committato e invalidarlo immediatamente e poi pulire la cronologia git; l’alert di Gitleaks ti dice che questo processo deve iniziare ora piuttosto che quando qualcuno lo sfrutta.
Prestazioni della pipeline
Una pipeline lenta e una pipeline ignorata. Se gli sviluppatori aspettano quindici minuti per il feedback su ogni push, smettono di fare push di piccoli commit e iniziano a raggruppare il lavoro, il che sconfigge lo scopo di CI.
Passi pratici per mantenere le pipeline veloci:
Fai il caching delle installazioni delle dipendenze. Per npm, indica la cache su package-lock.json. Per pip, usa l’action di cache pip indicizzata su requirements.txt. Una cache calda trasforma un’installazione di due minuti in un ripristino di cinque secondi.
Esegui job indipendenti in parallelo. Build, lint, test unitari, test di integrazione e scansione di sicurezza non dipendono tutti l’uno dall’altro. Una pipeline ben strutturata li esegue come job paralleli dopo uno step di build comune, riducendo significativamente il tempo totale di esecuzione.
Usa filtri per percorso. Se hai un monorepo con piu servizi, attiva solo le fasi della pipeline rilevanti quando cambiano i file in una directory di servizio. GitHub Actions supporta i filtri paths sui trigger push.
Imposta timeout. Un job bloccato non dovrebbe occupare un runner per il timeout predefinito di sei ore. Imposta timeout a livello di job appropriati a ogni fase: cinque minuti per il lint, quindici minuti per i test unitari, trenta minuti per i test di integrazione.
Punti chiave da ricordare
- CI/CD trasforma il deployment da un evento ad alto rischio in un processo routinario e automatizzato; il principale collo di bottiglia per la maggior parte dei team britannici non e la tooling ma l’assenza totale di una pipeline strutturata.
- GitHub Actions e il punto di partenza giusto per i nuovi progetti; GitLab CI per i team che necessitano di runner self-hosted o di una piattaforma integrata unica.
- Una pipeline di livello produzione ha undici fasi. La maggior parte dei tutorial si ferma a tre. Le fasi che si saltano sono dove originano gli incidenti di produzione.
- Le scansioni di sicurezza (SAST, audit delle dipendenze, scansione dei segreti) appartengono alla pipeline su ogni pull request, non in una scansione pianificata mensile.
- Le strategie di deployment non sono intercambiabili: deployment progressivo per la semplicita, blue/green per la criticita zero-downtime, canary per le release ad alta frequenza che necessitano di validazione in produzione.
- Una pipeline lenta e dannosa quanto l’assenza di pipeline. Fai caching aggressivo, parallelizza i job indipendenti e imposta timeout rigidi su ogni job.
Domande frequenti (FAQ)
Quanto tempo dovrebbe richiedere l’esecuzione di una pipeline CI/CD? Punta a meno di dieci minuti per il percorso critico dal push al deployment in staging. Lint e test unitari dovrebbero completarsi in meno di cinque minuti. Se la pipeline impiega regolarmente piu tempo, investiga il caching, la parallelizzazione e se la suite di test ha accumulato test lenti che appartengono a un’esecuzione separata e meno frequente.
Devo eseguire la suite di test completa su ogni commit o solo sulle pull request verso main? Esegui i controlli veloci (lint, test unitari, scansione di sicurezza) su ogni push. Esegui i test di integrazione e i deployment in staging sulle pull request verso main e sui merge verso main. Questo bilancia la velocita del feedback rispetto al costo delle risorse e ai minuti runner.
Qual e la differenza tra CI e CD? CI (Integrazione Continua) significa che ogni commit innesca una sequenza automatizzata di build e test. CD (Consegna Continua) estende questa automazione per distribuire il codice validato in staging o produzione. Di solito vengono implementati insieme ma rappresentano pratiche distinte.
Ho bisogno di un ambiente di staging? Si, per qualsiasi applicazione con utenti reali. Lo staging e dove si individuano i fallimenti specifici del deployment, le differenze di configurazione tra gli ambienti e i problemi degli smoke test che non appaiono nei test unitari o di integrazione. Testare direttamente in produzione e un rischio che CI/CD esiste per eliminare.
Qual e il modo migliore per gestire le migrazioni del database in una pipeline CI/CD? Esegui le migrazioni come parte dello step di deployment, prima che la nuova versione dell’applicazione inizi a ricevere traffico. Assicurati che le migrazioni siano retrocompatibili con la versione precedente dell’applicazione in modo che un rollback non rompa lo schema. Evita modifiche distruttive dello schema (eliminazioni di colonne, cambiamenti di tipo) nella stessa migrazione della funzionalita che le usa.
Come convinco un’agenzia britannica o un cliente che l’investimento CI/CD vale la pena? L’argomento piu forte e finanziario: i bug individuati in CI costano circa dieci volte meno da correggere rispetto ai bug trovati post-deployment. Una pipeline ben gestita riduce anche il rischio e lo stress di ogni release, il che migliora direttamente la retention del team e la velocita. La maggior parte delle agenzie britanniche registra una riduzione misurabile dei deployment di emergenza fuori orario entro il primo trimestre dall’adozione di CI/CD.
Commenti