• Non ci sono risultati.

2.2 Come applicare DevOps alle varie fasi del rilascio del software

2.2.2 Continuous integration

La CI, come già detto, è sia un approccio che un insieme di pratiche attraverso cui gli sviluppatori apportano modifiche frequenti al proprio codice, validandole e integrandole ogni volta. Viene detta continua in quanto è un’attività che continuerà sempre ad essere applicata durante tutta la durata di vita del software.

2.2.2.1 Come avviene la CI

Un modo per definire l’integrazione continua è disporre di trigger automatici tra una fase e la successiva, fino ai test di integrazione. Cioè, se la compilazione da esito positivo, vengono attivati i test di integrazione. In caso contrario,allo sviluppatore viene notificato l’errore commesso. Il Continuous Delivery è definito come con trigger automatico fino al sistema di gestione temporanea. L’acronimo UAT, presente in un riquadro della figura 5.1 sta per User Acceptance Test(test di accettazione dell’utente)/staging/performance test(test delle prestazioni).Verrà utilizzato il termine Staging per queste varie funzioni. Il Continuos deployment significa che anche il passaggio successivo all’ultima fase (ovvero la distribuzione nel sistema di produzione) è automatizzato. Una volta che un servizio è distribuito in produzione, viene attentamente monitorato per un certo periodo di tempo

e poi viene promosso nella normale produzione. In questa fase finale, il monitoraggio e i test continuano ad esserci, ma il servizio non risulta diverso dagli altri servizi in considerazione.

2.2.2.2 Software/tools maggiormente utilizzati per progetti IT: esempio di utilizzo

Elencheremo brevemente una serie di tools che vengono maggiormente utilizzati insie- me per eseguire la Continuous Integration e il Continuous Delivery/Deployment applicati ad un semplice progetto IT con Web Services.

• Docker: è un progetto open-source che automatizza il deployment (consegna o rilascio al cliente, con relativa installazione e messa in funzione o esercizio, di una applicazione o di un sistema software tipicamente all’interno di un sistema informatico aziendale) di applicazioni all’interno di container software, fornendo un’astrazione aggiuntiva grazie alla virtualizzazione a livello di sistema operativo. Docker utilizza le funzionalità di isolamento delle risorse del kernel Linux come ad esempio cgroups e namespaces per consentire a "container " indipendenti di coesistere sulla stessa istanza di Linux, evitando l’installazione e la manutenzione di una macchina virtuale:

• GIT: è un Software di controllo versione distribuito utilizzabile da interfaccia a riga di comando. Serve per mantenere un progetto di sviluppo distribuito.

• Github: è un servizio di hosting per progetti software. Il nome "GitHub" deriva dal fatto che GitHub è una implementazione dello strumento di controllo versione distribuito Git.

• Jenkins: è lo strumento open source di Continous integration, che in un certo modo unifica tutti i vari software quali Git, maven, junit in un unico tools. Viene eseguito lato server all’interno di una pagina web ed è totalmente configurabile dall’utente.

• JitPack: è package repository che viene usato per scaricare e caricare le librerie necessarie. Grazie all’uso combinato di Github è possibile reperire i jar che sono stati caricati su Github.

• Maven: è un software usato per la gestione di progetti Java e build automation. Per funzionalità è similare ad Apache Ant, ma basato su concetti differenti. Usa un costrutto basato su POM (Project Object Model): un file XML che descrive le dipendenze fra il progetto e le varie versioni di librerie necessarie nonché le dipen- denze fra di esse. In questo modo si separano le librerie dalla directory di progetto utilizzando questo file descritto per definirne le relazione. Maven effettua automa- ticamente il download di librerie Java e plug-in Maven dai vari repository definiti all’interno del POm, scaricandoli in locale(nella cartella .m2) o in un repository centralizzato lato sviluppo. Questo permette di recuperare in modo uniforme i vari file JAR e di poter spostare il progetto indipendentemente da un ambiente all’altro avendo la sicurezza di utilizzare sempre le stesse versioni delle librerie.

• MySql: è un Relational database management system (RDBMS) composto da un client a riga di comando e un server. È disponibile sia per sistemi Unix e Unix- like sia per Windows; le piattaforme principali di riferimento sono Linux e Oracle Solaris.

• Wildfly: è l’application server dove viene eseguito il deploy di un progetto, pre- cedentemente era noto con il nome Jboss, in generale implementa le specifiche di JAVA EE.

2.2.2.3 I passi della continous integration in ambito IT: esempio di utilizzo

Si son visti gli strumenti per la Continous Integration, ora si andrà ad analizzare come usarli insieme. Prendendo come spunto un "semplice" progetto che interroga un database: inserendo,modificando, eliminando o semplicemente prendendo i dati al suo in- terno. Perchè per un progetto del genere si usa la Continous Integration? Principalmente perchè :

• Per essere sempre sicuri e consapevoli delle modifiche che vengono apportate al progetto.

• Per non dover perdere ulteriore tempo nel testare il proprio codice.

Si partirà dal primo punto; cosa significa che il database può essere usato anche da altri progetti? Semplicemente è bene che il progetto che esegue il mapping degli oggetti presenti nel database in Java Entities, sia comune a tutti e usabile come una qualsiasi libreria Java. Per quanto riguarda il secondo punto: non esiste Continous Integration senza la definizione di test, questo serve per essere sicuri che il nostro deploy non sia solo giusto a run time o a Maven compile, ma che anche il nostro stesso codice sia sempre "come ci aspettiamo che sia". Il terzo punto ovviamente comprende il fatto di usare strumenti quali Jenkins, dove sono stati configurati dei test per cui se dovessero insorgere errori, lo sviluppatore sarebbe subito informato dell’esito;ciò permette anche di non dover perdere ulteriore tempo in test manuali, che oltre a poter generare errori umani di digitazione e/o altri, rallenta anche il tempo di esecuzione dei test che non sarebbe più lanciati da un meccanismo automatico ma da un click dell’utente.