DevOps e le metodologie Agile hanno trasformato lo sviluppo software enfatizzando la collaborazione, l'automazione e il miglioramento continuo. Applicare i principi DevOps ai miei progetti e disegni è stato un cambiamento radicale, migliorando l'efficienza e l'affidabilità. In questo articolo, andremo a vedere come impostare un flusso di lavoro di integrazione continua (CI) per un progetto di sistemi embedded esistente che utilizza il microcontrollore ATmega328P. Alla fine di questo articolo, vedrai come queste pratiche possono semplificare il tuo processo di sviluppo e fornire prodotti di qualità superiore.
DevOps è un insieme di pratiche, popolarizzato nel mondo del software, che collega lo sviluppo software (Dev) e le operazioni IT (Ops) in un flusso continuo. Nel mondo del software, era comune sviluppare software e "lanciarlo oltre il muro" alle persone delle operazioni per il dispiegamento ai clienti. DevOps ha introdotto un modo non solo per abbattere quel muro ma per automatizzare l'intero processo da un capo all'altro. Nel mondo dell'hardware troviamo somiglianze tra lo sviluppo del prodotto e la produzione, lanciando costantemente il design "oltre il muro" ai nostri team di ingegneria di produzione per assicurarsi che tutto sia pronto per la produzione.
Nel design di prodotti embedded dobbiamo ancora far passare il nostro software attraverso la produzione ma ci troviamo di fronte alla sfida di muoverci più velocemente che mai e di consegnare alla massima qualità possibile. Con i principi DevOps miriamo a risolvere alcune di queste sfide.
Applicando i principi DevOps siamo in grado di iterare rapidamente utilizzando le metodologie Agile all'interno del paradigma costruisci-testa-distribuisci per ogni ulteriore funzionalità che desideriamo rilasciare in produzione.
“Costruire, testare e distribuire” è un insieme comune di parole che spesso sentirete quando si discute di DevOps. Nei sistemi embedded facciamo la stessa cosa poiché anche il nostro deployment va in produzione (e poi al cliente finale). Nel repository del progetto utilizziamo Gitlab CI per guidare il nostro workflow end-to-end per Embedded DevOps. Utilizziamo quello che viene chiamato “pipelines” per creare lavori che raggiungono determinati compiti come compilare il software, eseguire test sul target o rilasciarlo come un pacchetto ufficiale. In Gitlab, una pipeline è una collezione di lavori che vengono eseguiti in una sequenza come questa:
Figura 1: Esempio di pipeline utilizzata con il workflow DevOps ATmega328P in Gitlab
Ecco una suddivisione dello script CI (.gitlab-ci.yml file) per darvi un'idea di come funziona.
Ci sono alcuni dettagli minori che portano questo workflow da un'implementazione DevOps basilare a un sistema che funziona senza intoppi, ben documentato e facilmente osservabile. Ci sono alcuni dettagli sottili all'interno del workflow CI che sono importanti da sottolineare.
if [ "$CI_COMMIT_REF_SLUG" == "$CI_DEFAULT_BRANCH" ]; then
export IMAGE_TAG=$CI_REGISTRY_IMAGE/$IMAGE_TYPE:latest
else
export IMAGE_TAG=$CI_REGISTRY_IMAGE/$IMAGE_TYPE:$CI_COMMIT_REF_SLUG
fi
Questa logica prepara il terreno affinché il nostro tag “latest” utilizzi solo l'immagine Docker costruita sul ramo principale (cioè dopo che una richiesta di merge è stata approvata con successo). Questo garantisce che solo le richieste di merge riuscite pubblichino l'immagine docker più recente e migliore da cui tutti e ogni pipeline attingono.
Figura 2: Copertura del codice all'interno di una richiesta di merge
In questo screenshot, Gitlab riassume i test eseguiti sul target utilizzando hardware in loop:
Figura 3: Riepilogo dei test per i test eseguiti sul target
Alla fine, una volta che il nostro codice è stato validato sia con test unitari sia sul target, le fasi di pubblicazione e rilascio generano un bel pacchetto che può essere consumato dal team di produzione:
Figura 4: Rilascio del pacchetto software
Con tutti questi passaggi automatizzati possiamo rilasciare una nuova funzionalità in modo iterativo seguendo un approccio Agile. Non c'è bisogno di sviluppare molte funzionalità, inviarle al dipartimento QA e poi una revisione per il rilascio del pacchetto da parte del team di produzione. Tutto qui avviene in un unico flusso di lavoro ed è completamente automatizzato.
In questo articolo, abbiamo esplorato come le metodologie DevOps e Agile possono essere applicate allo sviluppo di sistemi embedded, specificamente utilizzando il microcontrollore ATmega328P. Abbiamo discusso i benefici dell'implementazione di un flusso di lavoro CI in Gitlab, che include automazione, tempi di costruzione più rapidi e test efficienti. Decomponendo lo script CI e spiegando ogni fase, abbiamo mostrato come creare un processo di sviluppo robusto e snello che aumenta l'efficienza e la qualità del prodotto. Seguendo questa guida pratica (e il codice sorgente all'interno del repository) dovresti essere in grado di configurare anche tu il tuo flusso di lavoro Embedded DevOps.
Il codice sorgente del progetto può essere trovato qui:https://gitlab.com/embedded-designs/atmega328p-serial-led-control.