Drupal 8, git, drush e configuration management: continuous integration senza stress

 

L’avvento di Drupal 8 ha portato grandi novità anche per gli sviluppatori. Una di queste riguarda la semplicità con cui ora si può gestire l’intero ciclo di vita di un sito o di una web application in contesti di continuous integration.

È buona norma evitare di apportare delle modifiche direttamente su un sito live senza che queste siano state preventivamente testate su un ambiente separato. Per questo motivo solitamente esistono più istanze dello stesso sito presenti contemporaneamente in location quasi sempre diverse, e in diverse fasi di sviluppo:

  • Le istanze sui PC degli sviluppatori coinvolti nel progetto, dove avvengono gli sviluppi di nuove funzionalità

  • Il sito “test”, sul quale vengono apportate e testate le modifiche prima della messa in produzione

  • Il sito “live”, sul server di produzione, con i contenuti più aggiornati, gli utenti registrati etc.

Migrare le modifiche sui file sorgenti non è mai stato un problema da quando esistono sistemi di source code versioning, ma qualsiasi sito o applicazione web che si basa su CMS ha un’altra componente fondamentale coinvolta pesantemente nella maggior parte delle modifiche o implementazioni di nuove funzionalità in un sito web: il database.

Il database del sito “live” non si può semplicemente sostituire con quello di un sito di sviluppo o di test: tutti i dati inseriti sul sito dagli utenti nelle ultime ore, giorni o mesi (articoli, commenti, ordini nel caso di un sito eCommerce, etc.) verrebbero persi. Lanciando il comando “git pull” su un qualsiasi ambiente, tutti i nuovi file vanno a sostituire quelli precedenti, ma le modifiche al database devono essere trasferite in modo opportuno tra i vari ambienti.

Strutture dati note a sviluppatori/content builder Drupal 8 quali content type, block type, tutte le impostazioni sotto Admin->Configuration e Admin->Appearance, views sono memorizzate nel database. Come si possono trasferire agevolmente e in modo automatico da una istanza ad un’altra?

In Drupal 7 a questo risultato ci si poteva giungere tramite il modulo Features e una serie di moduli da cui dipende, ma i benefici nell’utilizzare questa funzionalità spesso venivano superati da alcune limitazioni intrinseche della soluzione.

In Drupal 8 invece esiste una soluzione elegante che rende la migrazione delle configurazioni tra ambienti un’operazione rapida ed efficiente: si chiama Configuration Management.

Per sfruttare appieno le potenzialità del Configuration Management occorre impostare correttamente gli ambienti fin dall’inizio di un progetto. Il seguito dell’articolo illustra a grandi linee la procedura da noi seguita nel set-up di un nuovo progetto Drupal 8.

Ecco gli strumenti che dovranno essere presenti su ogni macchina:

Si assume anche di avere a disposizione un git repository nel quale caricare il nuovo progetto.

Dopo aver effettuato il checkout di Drupal 8 sulla macchina di lavoro, si procede a lanciare il comando “composer install” per installare il software.

Potrebbe essere utile fin da subito creare diversi “branch” di sviluppo sui quali è possibile intervenire singolarmente.

Prima di effettuare il push del codice sul repository è consigliato intervenire per evitare che alcuni file vadano a finire sul repository. Generalmente la cartella /sites/default/files non deve essere trasferita su Git in quanto i file in essa contenuti sono dipendenti da ogni sito. Stesso discorso vale per il file settings.php. Questo si ottiene con la creazione del file .gitignore nella root del sito, contenente l’elenco dei file e delle cartelle che non devono essere trasferite sul repository.

A questo punto è giunto il momento di utilizzare le potenzialità del Configuration Management. In nostro aiuto interviene Drush, il compagno fidato di ogni sviluppatore Drupal. I comandi da utilizzare per il nostro scopo sono: drush cex e drush cim.

Questi due comandi servono a gestire l’esportazione e l’importazione delle configurazioni dell’applicazione in file in formato yaml.

Prima di entrare nello specifico è utile ricordare che per far funzionare questo sistema è necessario reimpostare la cartella “Sync”, dentro la quale sono storati i suddetti files, al livello della root del sito e quindi fuori dalla cartella web di Drupal. Per far ciò nel file settings.php aggiungere le seguenti righe di codice (commentando/cancellando le corrispondenti esistenti):

# Changing The Storage Location of the Sync Directory

$config_directories[CONFIG_SYNC_DIRECTORY] = '../config';

Con il primo comando (drush cex) abbiamo la possibilità di inserire all’interno del pacchetto, durante la fase di creazione del commit, i files di configurazione.

Fatto questo e configurato il file settings.php è tutto pronto per fare il primo push di tutti i file.

Supponendo ora di voler ricreare una nuova installazione del sito su un’altra macchina, sarà sufficiente clonare il repository e lanciare il comando drush cim: questo rende possibile importare le impostazioni che sono state precedentemente committate.

Viene creata una nuova view su un ambiente e la si vuole trasferire su un altro ambiente? Stessa operazione:

 

Ambiente origine:

drush cex

git push

 

Ambiente destinazione:

git pull

drush cim

 

Tramite questo approccio, l’integrazione continua di un sito Drupal 8 diventa un processo lineare, controllato ed estremamente efficace nel seguire tutte le fasi di un sito o di una web application durante la sua naturale evoluzione.

Hai un nuovo progetto Drupal 8 in partenza e ti serve una consulenza per impostare fin da subito il progetto in modo ottimale? Contattaci ora, siamo a tua disposizione per ascoltare le tue necessità.