Che cos'è DevOps?

In un modello di sviluppo software tradizionale, gli sviluppatori scrivono grandi quantità di codice per nuove funzionalità, prodotti, correzioni di bug e simili, e poi passano il loro lavoro al team operativo per la distribuzione, di solito tramite un sistema di ticketing automatizzato. Il team operativo riceve questa richiesta nella sua coda, testa il codice e lo prepara per la produzione - un processo che può richiedere giorni, settimane o mesi. Secondo questo modello tradizionale, se le operazioni riscontrano dei problemi durante la distribuzione, il team invia un ticket agli sviluppatori per dire loro cosa devono risolvere. Alla fine, dopo aver risolto questo tira e molla, il carico di lavoro viene spinto in produzione.

Questo modello rende la consegna del software un processo lungo e frammentato. Gli sviluppatori spesso vedono le operazioni come un blocco, che rallenta le tempistiche dei loro progetti, mentre i team operativi si sentono come una discarica per i problemi dello sviluppo.

DevOps risolve questi problemi unendo i team di sviluppo e operativi lungo l'intero processo di consegna del software, consentendo loro di scoprire e risolvere i problemi in anticipo, automatizzare i test e la distribuzione e ridurre il time-to-market.

Per capire meglio cos'è DevOps, cerchiamo prima di capire cosa non è DevOps.

 

DevOps non è

  • Una combinazione dei team Dev e Ops: Ci sono ancora due team, ma operano in modo comunicativo e collaborativo.
  • Un team separato: Non esiste un "ingegnere DevOps". Anche se alcune aziende possono nominare un team DevOps come pilota quando cercano di passare a una cultura DevOps, DevOps si riferisce a una cultura in cui sviluppatori, tester e personale operativo collaborano durante l'intero ciclo di vita della consegna del software.
  • Uno strumento o un insieme di strumenti: Anche se ci sono strumenti che funzionano bene con un modello DevOps o che aiutano a promuovere la cultura DevOps, DevOps è in definitiva una strategia, non uno strumento.
  • Automazione: Sebbene sia molto importante per una cultura DevOps, l'automazione da sola non definisce DevOps.

 

DevOps definito

Invece di far sì che gli sviluppatori codifichino enormi serie di funzionalità prima di consegnarle alla cieca alle operazioni per la distribuzione, in un modello DevOps, gli sviluppatori consegnano spesso piccole quantità di codice per il test continuo. Invece di comunicare problemi e richieste attraverso un sistema di ticket, i team di sviluppo e operativi si incontrano regolarmente, condividono le analisi e sono co-proprietari dei progetti end-to-end.

 

Pipeline CI/CD

DevOps è un ciclo di integrazione continua e consegna continua (o distribuzione continua), altrimenti noto come pipeline CI/CD. La pipeline CI/CD integra i team di sviluppo e operativi per migliorare la produttività, automatizzando l'infrastruttura e i flussi di lavoro e misurando continuamente le prestazioni delle applicazioni. Si presenta così:

Fasi e flusso DevOps della pipeline CI/CD
Figura 1: Fasi e flusso DevOps della pipeline CI/CD
  • L'integrazione continua richiede agli sviluppatori di integrare il codice in un repository più volte al giorno per i test automatizzati. Ogni check-in viene verificato da una build automatizzata, consentendo ai team di individuare i problemi in anticipo.
  • La consegna continua, da non confondere con la distribuzione continua, significa che la pipeline CI è automatizzata, ma il codice deve passare attraverso controlli tecnici manuali prima di essere implementato in produzione.
  • La distribuzione continua fa un ulteriore passo avanti nella consegna continua. Invece dei controlli manuali, il codice supera i test automatizzati e viene distribuito automaticamente, dando ai clienti l'accesso immediato alle nuove funzionalità.

 

DevOps e sicurezza

Un problema di DevOps è che la sicurezza spesso viene trascurata. Gli sviluppatori si muovono rapidamente e i loro flussi di lavoro sono automatizzati. La sicurezza è un team separato e gli sviluppatori non vogliono rallentare per i controlli e le richieste di sicurezza. Di conseguenza, molti sviluppatori distribuiscono senza passare attraverso i canali di sicurezza adeguati e inevitabilmente commettono errori di sicurezza dannosi.

Per risolvere questo problema, le organizzazioni stanno adottando DevSecOps. DevSecOps prende il concetto alla base di DevOps - l'idea che gli sviluppatori e i team IT debbano collaborare strettamente, anziché separatamente, durante la consegna del software - e lo estende per includere la sicurezza e integrare controlli automatizzati nell'intera pipeline CI/CD. Questo elimina il problema della sicurezza che sembra una forza esterna e consente agli sviluppatori di mantenere la loro velocità senza compromettere la sicurezza dei dati.

 

Domande frequenti su DevOps

L'Infrastructure as Code (IaC) comporta la gestione e il provisioning dell'infrastruttura IT attraverso file di definizione leggibili dalla macchina. Le piattaforme IaC come Terraform e AWS CloudFormation consentono di automatizzare la configurazione dell'infrastruttura, permettendo distribuzioni coerenti e ripetibili. Trattando l'infrastruttura come un software, le organizzazioni possono applicare il controllo di versione, i test e le pratiche di integrazione continua alle modifiche dell'infrastruttura, migliorando l'agilità e l'affidabilità.
L'integrazione continua (CI) è una pratica di sviluppo in cui gli sviluppatori uniscono frequentemente le modifiche al codice in un repository centrale, attivando build e test automatizzati. Il CI rileva gli errori di integrazione il più rapidamente possibile, migliorando la qualità del software e riducendo i tempi di consegna dei nuovi aggiornamenti. Costituisce la base per la consegna continua delle applicazioni agli ambienti di produzione.
La consegna continua (CD) estende l'integrazione continua distribuendo automaticamente tutte le modifiche al codice in un ambiente di test o di produzione dopo la fase di compilazione. Il CD consente agli sviluppatori di garantire che il loro codice sia sempre in uno stato di distribuzione, facilitando una consegna più fluida e veloce agli utenti finali. Colma il divario tra sviluppo e operazioni, favorendo un ciclo di vita del software più agile e reattivo.
La distribuzione continua è il rilascio automatico delle modifiche convalidate alla produzione, senza la necessità di un intervento manuale. Si tratta di un passo avanti rispetto alla continuous delivery, dove ogni modifica che supera tutte le fasi della pipeline di produzione viene rilasciata ai clienti. Questa pratica accelera il ciclo di feedback e migliora l'efficienza e l'affidabilità del processo di rilascio.
L'automazione opera eseguendo istruzioni predefinite per gestire i compiti senza l'intervento umano. Nella sicurezza del cloud, gli strumenti di automazione distribuiscono le politiche, scansionano le vulnerabilità e rispondono alle minacce, semplificando le operazioni di sicurezza. Interagiscono con le API del cloud, impiegando script e flussi di lavoro per il provisioning delle risorse, l'applicazione della conformità e l'orchestrazione efficiente di processi complessi.
La gestione della configurazione si riferisce al mantenimento dei sistemi in uno stato desiderato e coerente. Tiene traccia delle modifiche e delle configurazioni del software e dell'hardware per evitare derive e alterazioni non autorizzate. Strumenti come Ansible, Puppet e Chef automatizzano le modifiche di configurazione nell'ambiente IT, assicurando che i sistemi siano configurati in modo corretto e uniforme.
L'orchestrazione automatizza la gestione di attività e flussi di lavoro complessi su più sistemi e servizi. Coordina le attività automatizzate in un processo coeso, gestendo le interdipendenze e sequenziando le azioni. Negli ambienti cloud, gli strumenti di orchestrazione come Kubernetes gestiscono le applicazioni containerizzate, occupandosi di distribuire, scalare e fare rete per ottimizzare l'utilizzo delle risorse e mantenere le prestazioni delle applicazioni.
I microservizi sono un approccio progettuale in cui le applicazioni sono composte da piccoli servizi indipendenti che comunicano attraverso API ben definite. Ogni servizio si concentra su una singola capacità aziendale, esegue il proprio processo e può essere distribuito in modo indipendente. Questa architettura aumenta la scalabilità, accelera i cicli di sviluppo e migliora l'isolamento dei guasti.
Il monitoraggio e la registrazione sono fondamentali per mantenere le prestazioni operative e la sicurezza negli ambienti cloud. Il monitoraggio offre una visibilità in tempo reale dell'infrastruttura, delle applicazioni e dei servizi, consentendo una gestione proattiva della salute e delle prestazioni del sistema. La registrazione registra gli eventi e i punti dati, che sono fondamentali per la risoluzione dei problemi, l'analisi forense e l'audit di conformità. Insieme, consentono di rilevare e rispondere rapidamente agli incidenti, garantendo disponibilità e sicurezza continue.
I sistemi di controllo delle versioni tracciano e gestiscono le modifiche al codice, ai documenti o ad altre raccolte di informazioni. Facilitano la collaborazione tra i team di sviluppo, mantengono una cronologia delle modifiche e consentono di tornare alle versioni precedenti, se necessario. Il controllo delle versioni è fondamentale per gestire le basi di codice, ridurre i conflitti e garantire che le distribuzioni siano coerenti e tracciabili.
Le strategie di distribuzione comuni includono le distribuzioni blu-verde, in cui due ambienti identici vengono eseguiti in parallelo e uno funge da ambiente live, mentre l'altro ospita la nuova versione. I rilasci Canary distribuiscono in modo incrementale le modifiche a un piccolo sottogruppo di utenti prima di una distribuzione più ampia. Gli aggiornamenti continui sostituiscono gradualmente le istanze della vecchia versione con quella nuova, riducendo i tempi di inattività e i rischi.
La containerizzazione incapsula un'applicazione e le sue dipendenze in un contenitore che può essere eseguito su qualsiasi ambiente informatico. Questo approccio fornisce un'alternativa leggera alle macchine virtuali, offrendo efficienza e coerenza tra gli ambienti di sviluppo, test e produzione. La containerizzazione semplifica la distribuzione, la scalabilità e la gestione delle applicazioni, isolandole dall'infrastruttura sottostante.
Docker è utilizzato per creare, distribuire ed eseguire applicazioni utilizzando i container. Consente agli sviluppatori di pacchettizzare un'applicazione con tutte le sue dipendenze in un'unità standardizzata. Docker fornisce gli strumenti e la piattaforma per gestire il ciclo di vita dei container, compresa la creazione di immagini, l'orchestrazione dei container, la scalabilità e la rete.
Kubernetes orchestra le applicazioni containerizzate, gestendone la distribuzione, la scalabilità e le operazioni. Assicura che lo stato desiderato delle applicazioni corrisponda allo stato effettivo nell'ambiente cloud. Kubernetes automatizza il bilanciamento del carico, monitora la salute delle applicazioni e fornisce funzionalità di auto-guarigione riavviando o sostituendo i container che falliscono o non rispondono. Gestisce anche la scoperta dei servizi e può gestire la configurazione e le informazioni sensibili come segreti.
Una pipeline di build consiste in una serie di processi automatizzati per la compilazione del codice, l'esecuzione di test e la distribuzione del software. Si inizia con il recupero del codice dal controllo di versione, seguito dalla costruzione degli eseguibili, dall'esecuzione di test automatizzati e dalla distribuzione in vari ambienti. La pipeline è progettata per fornire un feedback in ogni fase, garantendo la qualità del codice e snellendo il percorso dallo sviluppo alla produzione.
L'automazione dei test accelera la validazione della funzionalità, della sicurezza e delle prestazioni del software. Consente di eseguire test ripetitivi ed estesi senza sforzi manuali, migliorando la coerenza e la copertura. I test automatizzati possono essere eseguiti su più ambienti e dispositivi contemporaneamente, fornendo un feedback rapido agli sviluppatori e riducendo il time to market delle nuove release.
Un repository di codice è un luogo di archiviazione del codice e dei file ad esso associati, che facilita il controllo delle versioni e la collaborazione. Agisce come hub centrale per archiviare, tracciare e gestire le modifiche alla base di codice. I repository supportano la ramificazione e l'unione, consentendo agli sviluppatori di lavorare su funzionalità, correzioni o esperimenti in ambienti isolati prima di integrare le modifiche nel codice principale.
La gestione delle release comprende la pianificazione, la programmazione e il controllo delle build del software attraverso diverse fasi e ambienti. Comprende la gestione della pipeline di rilascio, il coordinamento con gli stakeholder, la conformità ai criteri di rilascio e la distribuzione del software in produzione. Il processo mira a fornire nuove funzionalità e correzioni in modo affidabile ed efficiente, con un'interruzione minima dei servizi.
La metodologia Agile enfatizza lo sviluppo iterativo, la collaborazione con il cliente e la reattività al cambiamento. Sostiene la necessità di rilasci piccoli e incrementali, di un feedback continuo e di una pianificazione adattiva. I principi agili promuovono la collaborazione tra team interfunzionali, ritmi di sviluppo sostenibili e pratiche riflessive per migliorare continuamente i processi e i prodotti.
L'architettura serverless consente agli sviluppatori di costruire ed eseguire applicazioni senza gestire l'infrastruttura del server. Astrae i server, consentendo agli sviluppatori di concentrarsi esclusivamente sulla scrittura del codice. I provider cloud gestiscono l'ambiente di esecuzione, gestendo dinamicamente l'allocazione delle risorse. Le architetture serverless scalano automaticamente con la domanda e gli utenti pagano solo il tempo di calcolo consumato.
La messa a punto delle prestazioni comporta l'ottimizzazione delle impostazioni del sistema e del codice per migliorare le metriche delle prestazioni, come il tempo di risposta, il throughput e l'utilizzo delle risorse. Richiede la profilazione e il monitoraggio delle applicazioni per identificare i colli di bottiglia, quindi la regolazione delle configurazioni, l'ottimizzazione del codice e l'allocazione efficiente delle risorse per migliorare l'efficienza complessiva del sistema.
La resilienza e l'affidabilità sono garantite dalla progettazione di sistemi con tolleranza ai guasti, in grado di gestire e recuperare i guasti senza interruzioni del servizio. L'implementazione della ridondanza, dei meccanismi di failover, il test regolare delle procedure di ripristino di emergenza e il monitoraggio in tempo reale contribuiscono a un'architettura di sistema robusta. Queste pratiche aiutano a mantenere prestazioni e disponibilità costanti, nonostante le sollecitazioni del sistema o i problemi imprevisti.