Quante volte, per il progetto per il quale lavorate, vi viene chiesto di svolgere attività di controllo, deploy, test ecc.? Tante.
Nella mia recente esperienza sta capitando quotidianamente di avere a che fare con richieste di schedulazione giornaliera di attività del quale prima mi occupavo saltuariamente.
Questo ha portato inizialmente ad un grosso effort di tempo in quanto tutte queste attività erano per lo più manuali (query da eseguire sul database, validare il contenuto di un file, verifica del file di log per dirne alcune).
Da qui una considerazione personale: se devo occuparmi almeno due volte di una stessa attività è necessario automatizzare il più possibile.
Dal momento che lavoro su sistemi operativi Linux ho deciso di imparare ad utilizzare Bash [1] per creare script che mi potessero dare una mano per automatizzare alcune attività, e con questo articolo vorrei raccontare questa mia esperienza.
Buona lettura.
Bash e script: breve storia e introduzione
Bash, acronimo di Bourne Again SHell, è una shell testuale del progetto GNU usata nei sistemi operativi Unix e Unix-like, specialmente in GNU/Linux e macOS, ma disponibile anche per sistemi Microsoft Windows (vedi ad esempio Cygwin [2]).
Questa shell viene anche chiamata Bourne Shell dal nome del suo autore originario Stephen Bourne e tecnicamente è un clone evoluto della shell standard di Unix, /bin/sh
. Altre shell alternative a bash e piuttosto diffuse sono la Kornshell [3], la C-shell [4] e tcsh [5].
Bash altro non è che un interprete di comandi che permette all’utente di comunicare col sistema operativo attraverso una serie di funzioni predefinite, o di eseguire programmi e script. Questa shell è in grado di eseguire i comandi che le vengono passati utilizzando la redirezione dell’input e dell’output per eseguire più programmi in cascata in una pipeline software: l’output del comando precedente viene usato come input del comando successivo.
Oltre a questo, bash mette a disposizione un semplice linguaggio di scripting nativo che permette di svolgere compiti più complessi, non solo raccogliendo in uno script una serie di comandi, ma anche utilizzando variabili, funzioni e strutture di controllo di flusso.
La mia esperienza con Bash e gli script
Ho creato shell bash e script per diverse attività, che riassumo qui di seguito.
Controllo dell’ambiente di deploy
Ho trovato comodo nonché utile configurare una shell per la verifica dell’ambiente dopo un’attività di rilascio. In particolare la verifica verte su:
- I dati del database.
- L’alberatura di particolari directory.
- Il settaggio di alcuni log.
- La connessione SFTP che si connetta correttamente.
Il rilascio di un war in un determinato ambiente
Non avendo una buona memoria ed essendo il processo delicato, per evitare errori ho creato una shell con un menu di scelta per eseguire tutte quelle attività necessarie per i deploy del progetto al quale lavoro. Questo, oltre ad evitare errori, è stato anche utile per permettere anche alle ultime persone entranti nel progetto di poter svolgere in autonomia (o quasi) un’operazione così delicata senza rischiare di fare danni.
Verifica incrociata di dati
Verificare dei dati incrociando informazioni sul database e all’interno di file può risultare spesso un’operazione davvero lunga e dispendiosa se eseguita manualmente. Ricorrere a degli script di bash velocizza di molto l’esecuzione di questo task, che inoltre rimane ad uso di tutto il team e non di una sola persona.
Connessione ad un determinato ambiente
Modificare il file di host per connettersi ad un determinato ambiente.
Considerazioni
Queste quattro casistiche possono sembrare piccole attività ma posso assicurarvi che in passato, durante un classico sprint di due settimane, richiedevano enormi sforzi, anche intere giornate di lavoro. Oggi io (e ogni altro membro del team) riusciamo ad eseguirle tutte nel giro di un’ora e in totale sicurezza. Un cambio di passo non indifferente!
Bash e script: AWK, mai più senza!
Vorrei dedicare qualche riga per parlarvi di AWK [6], una utility nonché un linguaggio di programmazione che mi è stato utilissimo per eseguire operazioni di lettura e ricerca all’interno dei file.
A chi non è mai capitato di dover cercare ed estrarre dei dati da file di testo? Oppure di effettuare delle modifiche riga per riga, eventualmente condizionate dalla presenza di certi pattern, spesso considerando i dati di input come composti da parole o campi?
Avendo frequentemente esigenze di questo tipo, ho trovato in AWK un validissimo alleato.
Caratteristiche di AWK
Naturalmente potreste scrivere dei meravigliosi programmi per fare ciò che vi serve ma dovreste perdere delle intere giornate per scrivere del codice ad-hoc che poi probabilmente non usereste più e di solito ci mettereste di meno a fare il lavoro a mano.
Volendo dare una definizione sintetica di AWK lo si può definire come un filtro generico per file di testo basato su pattern-matching e programmabile.
Il nome AWK deriva dalle iniziali dei suoi tre inventori originali, Aho, Weinberger e Kernighan, persone abbastanza note nel campo della computer-science.
L’idea che sta alla base di AWK è quello di elaborare una riga alla volta dei file di input, eseguendo azioni diverse a seconda che la riga stessa soddisfi certe condizioni o contenga certi pattern.
I programmi scritti in AWK sono strutturati diversamente rispetto a quelli in linguaggi tradizionali, non esistono infatti un inizio e una fine del programma, non è necessario dichiarare le variabili, gestire tutta la solita trafila dell’I/O e del parsing dei dati. A tutto questo ci pensa automaticamente AWK!.
L’unica cosa che un programmatore deve fare è specificare come devono essere elaborati i dati di input a seconda dei vari pattern in essi contenuti. Un programma AWK è quindi costituito solamente da una lista di regole composte da un pattern ed una corrispondente azione da eseguire se il pattern è soddisfatto.