La tecnologia sta rivoluzionando il mercato.
I processi aziendali, ma soprattutto i modelli di business, stanno nel tempo assumendo forme diverse portando le aziende di prodotto ad integrare la propria offerta con numerosi servizi digitali al fine di arricchire l’esperienza utente.

Jenkins_img.001

In questo nuovo contesto le aziende cominciano ad avvicinarsi al concetto di Cultura Digitale che, tra i vari aspetti, prevede un’attività di sviluppo focalizzata su attività basate su rilasci costanti di nuove e/o migliori funzionalità. Tali attività richiedono automatismi efficienti per il team di sviluppo ed in grado di dare continuità al cliente senza creare disservizi durante i processi di aggiornamento.

In quest’ambito si parla spesso di Continuous Integration e Delivery.

Che cos’è la CI

La Continuous Integration, che per semplicità chiameremo CI, è una pratica di sviluppo del software applicata, in presenza di sistemi di versionamento del codice, al fine di automatizzare operazioni ripetitive.

Ogni sviluppatore lavora e produce del codice, integrato di volta in volta nel repository, tramite più commit nell’arco della giornata. Ad ogni commit o, nel caso di progetti più onerosi, dopo un certo periodo di tempo dalla build precedente, il codice viene compilato e testato per generare un messaggio di risposta e/o un report approfondito riguardante la build appena lanciata.

A questo processo si può poi aggiungere un ulteriore passo, detto Continuous Deployment, il quale permette di rilasciare direttamente in test, sviluppo o produzione i cosiddetti Artifacts, ovvero i risultati del processo di build. Tali Artifacts, ad esempio, potrebbero concretizzarsi in un file manifest.plist e in una app.ipa, ovvero un’applicazione per iOS firmata con i certificati Enterprise pronta per essere installata direttamente da un dispositivo oppure in dei pacchetti, esempio war, da distribuire direttamente in ambienti server.

Scenari in cui usare la CI e relativi vantaggi

Consigliata in tutti gli ambiti di sviluppo nei quali vengono utilizzati sistemi di versionamento (GIT,SVN,..) la Continuous Integration porta a chi la utilizza numerosi vantaggi quali:

  • tracciamento delle versioni/build
  • esecuzione di test
  • reportistica aggiornata
  • gestione ruoli/permessi
  • centralizzazione dei poteri di amministrazione
  • gestione ambienti test/sviluppo/produzione
  • gestione automatica eventi con notifiche email
  • azzeramento tempi morti
  • azzeramento di errori su operazioni ripetitive
  • sicurezza/isolamento credenziali sensibili

E’ principalmente consigliata per team di sviluppo più o meno grandi, ma può essere vantaggiosa anche per pochi sviluppatori in contesti in cui venga impiegata la Continuous Delivery.
A trarne i maggiori vantaggi sono sicuramente gli ambienti di sviluppo che si occupano di:

  • realizzare applicazioni mobile Enterprise e non
  • realizzare applicazioni web
  • realizzare applicativi soggetti a test
  • realizzare qualsiasi tipo di prodotto che prevede operazioni ripetitive nel corso del suo sviluppo, come particolari e ripetitivi processi di build o delivery (es. siti web php,node.js,..).

Con questo tipo di sistema è possibile tracciare le varie build e il loro stato, sapendo così chi è riuscito a far uscire la build da uno stato di successo ad uno fallimento (in quest’ultimo caso lo stato di rottura potrebbe essere generato da un errore di compilazione del progetto o da uno step immediatamente successivo – test, report con metriche o deploy – ).
Per quanto riguarda i test, (sia che essi siano di unità, integrazione o sistema) un sistema di CI è quasi obbligatorio e permette di automatizzare il lancio di questi in successione soltanto se la build è andata a buon fine.
Da questi test e/o semplicemente dal codice sorgente è possibile estrapolare, attraverso l’impiego di tool opensource, una serie di metriche che possono generare un report complessivo in modo da fornire al responsabile di progetto degli indicatori chiari che descrivono l’andamento e la qualità del progetto in sviluppo.
Il passo successivo è il deploy, ovvero il rilascio dell’applicazione in produzione, se compilazione e test hanno avuto successo. Questo processo si preoccupa di rendere disponibili gli Artifacts in ambiente di produzione, come detto precedentemente, automaticamente e senza dover sprecare risorse per effettuare operazioni ripetitive e potenzialmente problematiche (in ambiente di produzione bisogna garantire un’alta affidabilità e Downtime assenti o ridotti al minimo indispensabile).

Sicurezza

Un ulteriore motivo per cui si consiglia di utilizzare la CI è la possibilità di dare alle singole persone il minimo dei permessi necessari per svolgere le proprie attività. In questo modo, ad esempio, si può mantenere in un unico sistema centralizzato e sicuro tutte le operazioni che necessitano di particolari permessi come quelli di amministratore di sistema.

ContinuousIntegrationSicurezza

I beneficiari di questo tipo di gestione possono essere aziende:

  • di piccole dimensioni, per evitare di diffondere tutte le credenziali a tutto il team;
  • di grandi dimensioni, dove viene utilizzato un sistema strutturato di ruoli e la gestione delle credenziali sarebbe caotica e pericolosa.

L’automazione delle operazioni infatti porterà ad impostare solo in fase di configurazione del sistema le credenziali necessarie per accedere ai vari servizi, mantenendo così slegati dai singoli sviluppatori, ad esempio, i certificati di firma delle applicazioni o le credenziali di accesso ai server di produzione. Il singolo sviluppatore quindi potrà avere accesso alle sole credenziali del repository e di visualizzazione delle build del sistema di CI, senza dover esporre altre credenziali non più necessarie.

Che cos’è Jenkins ed i suoi punti di forza

Jenkins è uno strumento opensource per la CI, nato dal codice sorgente di Hudson. E’ stato scritto in Java ed eseguito da un server web che supporta la tecnologia serverlet permettendone la gestione e l’utilizzo direttamente da browser, sia in rete locale che su internet.
Essendo opensource ha incoraggiato la nascita di numerosissimi plugin per aumentarne le funzionalità e l’integrazione con le più disparate tecnologie e servizi. Attualmente ne possiamo contare 1079 (una panoramica di questi la possiamo trovare al link https://wiki.jenkins-ci.org/display/JENKINS/Plugins ).
La comunità è molto attiva e il supporto è ben gestito anche grazie all’utilizzo di Jira per la gestione del sistema di issue del progetto. Inoltre, anche i servizi di terze parti sviluppano plugin per integrare Jenkins con i loro sistemi.
Un altro aspetto da tener conto su Jenkins è la possibilità di eseguirlo sul proprio PC senza dover per forza esporlo all’esterno, potendo automatizzare così azioni ripetitive anche nel caso in cui non sia presente un team di sviluppo o non sia adottato tale strumento da tutto il team di lavoro. Il pieno controllo sul dove installarlo e dove mantenere i dati è rassicurante nel caso in cui si voglia essere sicuri di chi possiede i propri dati, senza doversi appoggiare necessariamente a servizi esterni.
I punti di forza possono quindi essere riassunti in:

  • piattaforma opensource
  • comunity attiva
  • pieno controllo del sistema
  • semplicità di utilizzo
  • plugin per ogni tipo di esigenza (1079 plugin)
  • grande flessibilità
  • supporto alla sicurezza aziendale.

Integrazione tra Jenkins e Code Deploy

ContinuousIntegrationJenkinsCodeDeploy
Jenkins, tra i suoi plugin, vanta anche l’integrazione con alcuni servizi AWS. Uno tra questi è CodeDeploy, un servizio che automatizza il rilascio del codice su una o più istanze attive di Amazon EC2. Questo permette di minimizzare il Downtime utilizzando una procedura automatizzata e personalizzata, sempre uguale nel tempo, per il rilascio dei propri servizi sia su ambienti di sviluppo, test o produzione. Inoltre CodeDeploy è integrata con AutoScaling permettendo di mantenere aggiornata la propria applicazione anche al variare dell’infrastruttura. Sono presenti diversi tipi di Deploy (macchina dopo macchina, tutte su una volta o metà alla volta) tali da permettere la miglior gestione degli aggiornamenti su servizi anche in utilizzo.
Vediamo ora come creare da un punto di vista concettuale questo flusso di automazione.
Per prima cosa dovremmo configurare 2 IAM Roles; un primo che imposteremo nell’istanza EC2 per accedere ad S3 e scaricare la revisione da installare, un secondo per CodeDeploy, per permettergli di accedere all’istanza EC2 ed, eventualmente, al servizio di autoscaling. Tutto questo viene descritto anche dalla guida ufficiale http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-configure-existing-instance.html .
Una volta che questa è pronta possiamo entrare nel pannello di CodeDeploy per creare un’applicazione stando attenti a crearla nella stessa regione della macchina EC2. Ci troveremo così di fronte ad un pannello simile a questo:

AWS

 

Qui, molto semplicemente, abbiamo impostato un paio di campi quali nome e gruppo di deployment dell’applicazione, le istanze o l’istanza sulla quale vogliamo effettuare il deploy, il tipo di deploy e infine il service role di deploy.
Una volta creata un’applicazione sulla console di CodeDeploy e configurato l’apposito plugin in Jenkins nel progetto desiderato, tutto avverrà automaticamente, senza alcuno sforzo. In un file apposito (appspec.yml) infatti verrano definite tutte le operazioni da eseguire per il deploy, favorendo la gestione delle varie fasi dell’operazione. Per ogni deploy effettuato, verrà utilizzato questo descrittore garantendo così la ripetibilità di tale operazione ad ogni operazione di deploy nel corso del tempo.
Il plugin per Jenkins permette di lanciare questo processo di deploy in automatico al termine della build, automatizzando così il rilascio dell’ultima versione del proprio software sulle istanze EC2 designate a tale scopo.

Conclusioni

Al giorno d’oggi il mercato richiede alle aziende software, di servizi e alle aziende di prodotto che affiancano alle merci servizi, serrati ritmi di innovazione dettati dai tempi tecnologici e l’inserimento di nuove funzionalità in modo costante nel tempo.

Per sostenere le nuove necessità le aziende devono inserire modelli organizzativi Lean e strumenti software in grado di facilitare il compito.

Jenkis, come abbiamo visto nei paragrafi precedenti, si dimostra essere uno degli strumenti che un’azienda dovrebbe adottare al fine di creare un automatismo strutturato per la Continuous Integration.

Jenkins è uno strumento estremamente versatile e, quello visto in precedenza, è solamente uno dei possibili contesti in cui può essere impiegato.

Tale strumento dovrebbe essere introdotto in ogni processo produttivo software considerati i numerosi vantaggi che contribuisce ad offrire. Tra i principali troviamo:

  • Aumento della sicurezza
  • Riduzione dei tempi di delivery di soluzioni software
  • Automazione dei processi di aggiornamento software
  • Maggiore focus sulle attività da parte del team di sviluppo

Aspetti che per le organizzazioni si tramutano in ottimizzazione dei costi, maggiore soddisfazione del gruppo di lavoro e riduzione degli “sprechi” di tempo in attività ripetitive e noiose.

Jenkis offre molte personalizzazioni che vanno oltre a quanto descritto in precedenza come l’interfacciamento con Jira, Slack, Github etc … per saperne di più non esitare a contattarci, siamo sempre disponibili per un confronto aperto sul miglioramento continuo generato da soluzioni tecnologiche!

Leave a Comment