In introduzione a MicroPython e Raspberry Pi Pico abbiamo esaminato come impostare, configurare ed eseguire MicroPython su un dispositivo Raspberry Pi Pico. In questo articolo ci concentreremo sull'automazione di questo processo e sulla sua trasformazione in una pipeline di integrazione continua (CI). L'automazione in CI garantisce che il nostro codice venga testato ogni volta che inviamo un commit al nostro repository di codice
Ora che abbiamo visto come iniziare con MicroPython e il dispositivo Raspberry Pi Pico, vorremo trovare modi per automatizzare un po' di più il nostro processo di sviluppo del codice. In introduzione a MicroPython e Raspberry Pi Pico abbiamo eseguito alcuni comandi diversi per dimostrare le varie funzionalità del dispositivo Raspberry Pi Pico. In questo articolo vedremo come automatizzare uno di questi esempi utilizzando degli script e inserendolo in CI. Per prima cosa diamo un'occhiata all'esempio che abbiamo eseguito dal terminale:
Questo comando ci ha fornito le informazioni sull'istanza della macchina. Nel nostro caso:
Questo ci dice che stiamo eseguendo MicroPython versione 1.19.1 su un Raspberry Pi Pico che utilizza il chip RP2040. Piuttosto che eseguire questo comando tramite un interprete di comandi utilizzando PuTTY o Thonny IDE, possiamo effettivamente eseguire l'intero processo dalla riga di comando utilizzando uno strumento fornito con la libreria MicroPython. Lo strumento Pyboard.py fornisce un meccanismo per eseguire comandi direttamente sul dispositivo di destinazione senza aprire una shell (o caricare nuovi file direttamente sulla scheda). Inoltre, ci consente di eseguire altri comandi del file system come elencare e copiare file da/verso il dispositivo di destinazione. Ad esempio, è possibile eseguire il comando sys.implementation command (sopra) utilizzando lo strumento Pyboard.py come segue:
python pyboard.py --device $TARGET_PORT --command "import sys; print(sys.implementation)"
laddove $TARGET_PORT è la porta COM sotto la quale viene visualizzato il tuo dispositivo. Ciò evita il passaggio PuTTY/Thonny IDE e consente l'automazione.
Ora che possiamo automatizzare l'esecuzione dei comandi da remoto sul nostro dispositivo di destinazione dovremmo essere in grado di incorporarli in uno script Python completo. Si scopre che l'utilizzo della libreria Pyboard è piuttosto semplice. In questo esempio di script Python eseguiamo lo stesso comando di cui sopra con qualche accorgimento in più (come il rilevamento automatico della porta COM e l'aggiunta di alcuni controlli basati su asserzioni). Il principio, tuttavia, rimane lo stesso: prendere l'istanza della macchina e convalidare ciò che pensiamo essere in esecuzione.
Una volta che abbiamo incapsulato tutto questo in uno script, possiamo inserirlo in un sistema CI. Come di consueto utilizzo Gitlab per la mia implementazione, ma il mio runner per programmare il dispositivo Raspberry Pi Pico. Puoi seguire l'intero progetto qui ma il file più interessante è lo script .gitlab-ci.yml. Questo contiene le "istruzioni" per far sì che le build avvengano automaticamente ogni volta che apporto una modifica al mio codice e lo reinserisco in Gitlab.
Diverse "attività" si verificano qui, ma solo una non coinvolge il dispositivo Raspberry Pi Pico: la fase di costruzione di Docker. La creazione di un contenitore Docker incapsula il nostro ambiente in una sorta di macchina virtuale. Se eseguo la mia attività CI in un contenitore Docker, posso eseguirla praticamente ovunque (dati alcuni requisiti minimi). In questo caso, non ho bisogno di installare alcuna libreria speciale sul mio computer desktop che è collegato al mio dispositivo di destinazione, perché il contenitore Docker è già dotato di tutto questo. L'unica distinzione che devo fare qui è che il mio contenitore Docker deve essere eseguito in modalità "privilegiata" (o almeno avere l'autorizzazione esplicita per accedere al dispositivo di destinazione), altrimenti non sarà in grado di comunicare con il dispositivo di destinazione.
Una volta creato il mio contenitore Docker, posso acquisire l'immagine da Gitlab ogni volta che viene eseguita un'attività, ed è qui che inizia il divertimento. Noterai che le mie attività diventano sempre più astratte e quindi più complesse. Infine, nell'ultima attività, eseguiamo l'intero processo attraverso il framework Pytest
Se conosci alcuni dei miei articoli precedenti, come FPGA: Creazione di pipeline di integrazione continua per sistemi embedded o PCB, verifica a basso costo di filtri digitali e analogici e configurazione dell'hardware nel progetto Loop noterai che sono un grande fan del framework Pytest. MicroPython non è diverso in questo caso e per impostazione predefinita continuo a usare Pytest come un modo semplice per convalidare alcuni dei miei script Python.
L'ultima attività CI chiamata esegue lo script Pytest test_rpi_pico.py. Questo script è quasi identico a rpi_pico_check.py tranne per il fatto che crea un rapporto di prova. Come sempre, prendiamo questo rapporto di prova e lo inviamo a Gitlab per l'analisi, per ottenere questa piccola sezione di test che mostra risultati positivi:
Figura 1: riepilogo del test per Pytest
Questo semplice test convalida le informazioni che abbiamo esaminato nell'articolo precedente. Il punto di forza di questa soluzione è l'automazione. Ogni volta che il codice viene modificato, facciamo un controllo per assicurarci che il dispositivo sia quello che ci aspettiamo. In questo caso stiamo eseguendo MicroPython versione 1.19.1 su un Raspberry Pi Pico utilizzando il chip RP2040.
In questo articolo abbiamo richiamato i passaggi manuali necessari per comunicare con un dispositivo Raspberry Pi Pico. Abbiamo quindi preso questo processo manuale e l'abbiamo trasformato in uno script. Dopo aver automatizzato il processo tramite uno script, abbiamo esaminato come integrare il flusso di lavoro in un sistema CI e quindi incorporarlo in Pytest. Dopo aver esaminato gli esempi in questo articolo, dovresti essere in grado di scrivere i tuoi script e persino di integrarli nel tuo CI.