CI CD — Cheat Sheet

Tag: ci-cd, devops, pipeline, automation, testing, deployment, git

Livello: intermedio

TL;DR: Pipeline automatizzate per validare ogni commit (CI) e rilasciare in staging/produzione in modo affidabile e ripetibile (CD).

Concetti chiave

CI valida il codice a ogni push tramite build automatica, linting e test.

CD significa Continuous Delivery se il rilascio richiede approvazione manuale.

CD significa Continuous Deployment se il rilascio in produzione e' completamente automatizzato.

Build deterministiche richiedono lockfile e immagini base immutabili.

Pipeline as code: definizione dichiarativa versionata nel repository.

Fail fast: i test piu' veloci e il linting girano nei primi stage.

Artifact immutabili: lo stesso binario o immagine Docker viene promosso tra gli ambienti.

Environment variables e secret non devono mai essere salvati nel codice sorgente.

Branching strategy chiara (es. trunk-based o gitflow) per sincronizzare i trigger della pipeline.

Domande tipiche e risposte pronte

Q: Qual e' la differenza tra Continuous Delivery e Continuous Deployment?R: La Continuous Delivery garantisce che ogni build verde sia pronta per il rilascio ma richiede un gate manuale, mentre il Continuous Deployment porta automaticamente ogni modifica validata direttamente in produzione.

Q: Come riduci i tempi di esecuzione di una pipeline CI lenta?R: Isolo i job indipendenti parallelizzandoli, abilito la cache per le dipendenze e i layer Docker, e sposto i test end-to-end complessi in stage successivi o notturni.

Q: Come gestisci il rollback in caso di errore post-deploy?R: Uso deployment strategies come blue-green o canary per deviare subito il traffico, mantenendo la versione precedente attiva, oppure avvio il deploy dell'artifact stabile precedente.

Insidie e errori comuni

Test non deterministici (flaky tests) che bloccano la pipeline senza veri bug.

Ricompilare l'applicazione per ogni ambiente anziche' promuovere lo stesso artifact.

Hardcoding di credenziali o API key nei file di configurazione della pipeline.

Mancanza di timeout sui singoli job, con conseguente blocco dei runner.

Esecuzione sequenziale di step indipendenti che raddoppia i tempi di feedback.

Snippet e comandi

# Esempio pipeline GitHub Actions minimale
name: CI Pipeline
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'
      - run: npm ci
      - run: npm run lint
      - run: npm test

Da ripassare

[ ] Strategie di deployment: Canary vs Blue-Green vs Rolling

[ ] Gestione del caching dei package manager e layer Docker nei runner

[ ] Configurazione e rotazione di OIDC/secret nei workflow CI/CD

[x] Differenza sostanziale tra Continuous Delivery e Deployment

Jarvis Interviews
Jarvis