Indice dei contenuti
Il termine DevOps (crasi di development e operations) definisce una metodologia di sviluppo software che combina lo sviluppo di software (development) con le attività di operations connesse alla messa in esercizio dei prodotti IT (operations), fondendo questi due aspetti nell'intero ciclo di vita del servizio: dalla progettazione iniziale del prodotto alle sue modifiche in corso d'opera, dalla gestione del codice alle attività di sviluppo, dalla messa in esercizio (deployment) alla manutenzione evolutiva (maintenance).
In questo articolo, dopo una breve introduzione, cercheremo di far luce sulla metodologia generale, le fasi che ne definiscono il ciclo di vita e le best practice che questo nuovo concetto può portare alle società che si occupano di sviluppo software.
Caratteristiche principali
Il metodo DevOps punta alla comunicazione, collaborazione e integrazione tra sviluppatori e addetti alle operations dell'IT, nel tentativo di produrre una sinergia basata sull'interdipendenza tra le due cose. Nello specifico, si tratta di un metodo che aiuta le aziende nella gestione dei rilasci, standardizzando gli ambienti di sviluppo mediante processi automatici, flessibili e controllabili, così da fornire agli sviluppatori un controllo maggiore di tutti gli ambienti.
L'adozione del paradigma DevOps favorisce la creazione di full-stack developer e di infrastrutture application-centered, concetti che si sposano bene sia con le metodologie di sviluppo Agile (lean development in primis) che con architetture service-oriented (Service-Oriented Architecture, SOA) basate su microservizi (microservices) in ambienti cloud. I concetti di continuous integration e continuous deployment (CI/CD), che costituiscono l'asse portante della metodologia DevOps, trovano la loro condizione ideale nelle moderne architetture basate su container, che costituiscono l'ambiente di lavoro più utilizzato da chi intende adottare questo metodo di lavoro.
Toolchain
Poiché la metodologia DevOps è pensata per essere interfunzionale, presuppone l'uso di più set di strumenti (toolchain) anziché uno singolo: ciascuno di questi set, spesso chiamati toolchain, può essere raggruppato in una categoria specifica: ciascuna categoria riflette uno dei vari aspetti chiave (o "fasi") dei processi di progettazione, sviluppo e/o consegna del prodotto. Ecco un elenco dei principali toolchain, raggruppati nelle rispettive categorie:
- Planning: task management, schedules.
- Coding: code development and review, source code management tools, code merging.
- Building: continuous integration tools, version control tools, build status.
- Testing: continuous testing tools that provide quick and timely feedback on business risks, performance measurement.
- Packaging: artifact repository, application pre-deployment staging.
- Releasing: change management, release approvals, release automation.
- Operating: infrastructure installation, configuration and management, infrastructure changes (scalability), infrastructure as code tools, capacity planning, capacity & resource management, security check, service deployment, high availability (HA), data recovery, log/backup management, database management.
- Monitoring: service performance monitoring, log monitoring, applications performance monitoring, end-user experience, incident management.
Ovviamente, ciascuna toolchain prevede l'utilizzo di un set di strumenti di sviluppo adeguati: ad esempio, l'integrazione continua può essere affrontata con l'uso congiunto di pipeline Jenkins, Gitlab e Bitbucket; l'infrastruttura come codice può essere gestita usando Terraform, Ansible e Puppet; e così via.
Lifecycle
Se prendiamo le categorie in cui abbiamo diviso le toolchain e le uniamo insieme, possiamo determinare il seguente ciclo di vita del paradigma DevOps, noto anche come DevOps lifecycle.
Planning > Coding > Building > Testing > Packaging > Releasing > Operating > Monitoring
Che si può ulteriormente "sintetizzare" nei seguenti modi:
Planning > Continuous Integration > Continuous Deployment > Monitoring
Planning > CI / CD > Monitoring
Il lifecycle di cui sopra viene convenzionalmente visualizzato all'interno di un diagramma che ha il simbolo dell'infinito, a significare il processo di ciclo continuo che contraddistingue il paradigma DevOps. Ecco uno dei diagrammi a nostro avviso più efficaci, che contiene anche alcuni dei set di strumenti principali corrispondenti alle varie categorie:
Alcuni diagrammi utilizzano Configuration anziché Operation, altri (come quello da noi proposto qui sopra) preferiscono utilizzare le fasi di Release e Deploy al posto di Packaging e Releasing, altri ancora uniscono le fasi di Test e Packaging all'interno del concetto-contenitore Continuous Integration, e così via: si tratta tuttavia di differenze minime, che non modificano il concetto generale.
Infrastructure as Code
Infrastructure as code (IaC) è il processo di gestione e provisioning dei data center dei computer attraverso file di definizione leggibili dalla macchina (script o definizioni dichiarative) anziché mediante attività di configurazione dell’hardware fisico o tramite strumenti di configurazione interattiva. Si tratta di una modalità di configurazione tipica degli ambienti cloud computing, in particolare per la configurazione degli ambienti Infrastructure as a Service (IaaS).
L’approccio IaC può utilizzare sia script che definizioni dichiarative, piuttosto che processi manuali, ma il termine è più spesso usato per promuovere approcci dichiarativi. E’ un approccio che si è diffuso negli ultimi anni in conseguenza della necessità di creare ambienti elastici, esigenza che porta spesso all'adozione del paradigma DevOps.
Conclusioni
Per il momento è tutto: ci auguriamo che questo articolo possa essere utile per farsi un'idea della metodologia DevOps e magari, perché no, favorire la diffusione di un paradigma che può essere certamente il caso di adottare all'interno delle aziende o organizzazioni che abbiano la necessità di migliorare il proprio processo di sviluppo e deploy dei prodotti software.