Per tutte le aziende che si occupano di
sviluppo software, anche solo in minima parte, il mantra di questi ultimi tempi è
DevOps: come gestire in maniera integrata le fasi di sviluppo, test e distribuzione del software, con l'obiettivo finale di arrivare a rilasci che siano allo stesso tempo
frequenti e stabili. Il tema collegato è quello della Continuous Integration o della
Continuous Delivery: idealmente i rilasci successivi di nuovo codice costituiscono un flusso continuo che si installa in produzione con la (relativa) certezza di non bloccare il buon funzionamento delle applicazioni che muovono il business d'impresa.
Ci sono diverse
piattaforme software commerciali che aiutano a creare ambienti efficaci di DevOps e CI/CD, ma c'è anche una
soluzione open source molto diffusa che, tra l'altro, muove proprio alcune delle soluzioni commerciali. Si tratta di
Jenkins, un progetto che viene citato spesso nel mondo dello sviluppo e che
vale la pena conoscere anche solo sommariamente.
Jenkins nasce
oltre dieci anni fa in Sun Microsystems con un nome diverso (Hudson). Allora è in sintesi un modulo server che il suo creatore Kohsuke Kawaguch ha creato per automatizzare i processi di
test e rilascio del codice Java. Qualche anno dopo da Hudson nasce Jenkins, che ne è sostanzialmente un fork e che attualmente ha una diffusione molto superiore a quella del predecessore.
Un esempio di pipleine per JenkinsIl principio di base di Jenkins
non è cambiato ma si è ampliato molto il suo raggio d'azione. Non copre solo il codice Java ma praticamente tutte le piattaforme principali, grazie a circa
1.400 plugin che gli permettono di dialogare con qualsiasi ambiente di sviluppo. Esiste ancora sotto forma di modulo eseguibile da un application server ma è anche distribuito
come immagine Docker, il che ne semplifica l'uso in ambienti virtualizzati.
Jenkins dialoga tra l'altro con i principali
repository di codice, in primis ovviamente GitHub, e la gestione del processo di sviluppo, test e distribuzione si basa su un elemento chiave: le
pipeline. Una pipeline è, in sintesi e semplificando, una sorta di script che definisce i passi (
step anche nel linguaggio di scripting) da eseguire in sequenza nel processo, raggruppati in più sezioni definite
stage.
Uno sviluppatore può creare una
pipeline molto dettagliata che indica gli step da fare (ad esempio richiamare un particolare comando di shell o lanciare uno specifico servizio) per compilare il codice, testarne il buon funzionamento e poi distribuirlo in un ambiente limitato o proprio in produzione. Idealmente queste fasi di compilazione, test e distribuzione a più stadi corrispondono
ciascuna a un diverso stage. Per ogni stage si possono definire le operazioni da compiere alla fine, come minimo in funzione del fatto se lo stage si è completato con successo o meno.
Per semplificare la gestione delle pipeline è stata sviluppata una interfaccia grafica accessoria di Jenkins, denominata
Blue Ocean. Il suo vantaggio principale sta proprio nella possibilità che offre di assemblare pipeline con un approccio di
programmazione visuale. Oltre a ciò mostra in maniera sintetica ma completa lo stato di esecuzione delle varie pipeline, per verificare a colpo d'occhio dove sono eventuali problemi nei processi di CI/CD.