In Erste Schritte mit MicroPython und dem Raspberry Pi Pico haben wir uns angeschaut, wie MicroPython auf einem Raspberry Pi Pico-Gerät eingerichtet, konfiguriert und ausgeführt wird. In diesem Artikel konzentrieren wir uns nun darauf, diesen Prozess zu automatisieren und ihn in eine Continuous Integration (CI) Pipeline umzuwandeln. Die Verlagerung der Automatisierung in CI garantiert, dass unser Code jedes Mal getestet wird, wenn wir einen Commit in unser Code-Repository übertragen.
Nachdem wir nun gesehen haben, wie wir mit MicroPython und dem Raspberry Pi Pico-Gerät loslegen können, möchten wir nun Wege finden, unseren Codeentwicklungsprozess stärker zu automatisieren. In Erste Schritte mit MicroPython und dem Raspberry Pi Pico haben wir einige Befehle ausgeführt, um verschiedene Funktionen des Raspberry Pi Pico-Geräts zu demonstrieren. In diesem Artikel werden wir uns ansehen, wie man eines dieser Beispiele mithilfe von Skripten automatisiert und dann in CI einfügt. Schauen wir uns zunächst das Beispiel an, das wir vom Terminal aus durchgeführt haben:
Dieser Befehl lieferte uns die Instanzinformationen der Maschine. In unserem Fall:
Dies zeigt uns an, dass wir MicroPython Version 1.19.1 auf einem Raspberry Pi Pico mit dem RP2040 Chip ausführen. Anstatt diesen Befehl über eine Interpreter-Shell mit PuTTY oder Thonny IDE auszuführen, können wir den gesamten Prozess von der Kommandozeile aus mit einem Tool bewältigen, das mit der MicroPython-Bibliothek geliefert wird. Das Tool Pyboard.py bietet uns einen Mechanismus, um Befehle direkt auf dem Zielgerät auszuführen, ohne eine Interpreter-Shell öffnen zu müssen. Oder etwa neue Dateien direkt auf das Board laden zu müssen. Zusätzlich bietet es uns andere Dateisystembefehle wie das Auflisten und Kopieren von Dateien des Zielgerätes. Zum Beispiel könnte man den Befehl sys.implementation (oben) mit dem Pyboard.py Tool wie folgt ausführen:
python pyboard.py --device $TARGET_PORT --command "import sys; print(sys.implementation)"
wobei $TARGET_PORT der COM-Port ist, als welches Ihr Gerät angezeigt wird. Dadurch wird der PuTTY/Thonny IDE-Schritt übersprungen und eine Automatisierung ermöglicht.
Jetzt, wo wir die Befehlsausführung auf unserem Zielgerät aus der Ferne automatisieren können, sollten wir in der Lage sein, dies in ein vollständiges Python-Skript zu falten. Es stellt sich heraus, dass die Verwendung der Pyboard-Bibliothek ziemlich einfach ist. In diesem Beispiel-Python-Skript führen wir den gleichen Befehl oben mit viel mehr Geschick aus (zum Beispiel automatisches Erkennen des COM-Ports und Hinzufügen einiger aussagebezogener Prüfungen). Das Prinzip ist jedoch dasselbe: Schnappen Sie sich die Maschineninstanz und validieren Sie, worauf wir unserer Meinung nach arbeiten.
Sobald wir all dies in einem Skript eingefügt haben, können wir es nun in ein CI-System übertragen. Wie üblich verwende ich Gitlab für meine Implementierung. Um das Raspberry Pi Pico-Gerät zu programmieren nutze ich hingegen meinen eigenen Runner. Sie können das gesamte Projekt hier verfolgen, aber die Datei von Interesse ist das .gitlab-ci.yml Skript. Es enthält die „Anweisungen” für die Builds, die jedes Mal automatisch ausgeführt werden, wenn ich eine Änderung an meinem Code vornehme und ihn an Gitlab zurückgebe.
Hier finden mehrere „Jobs” statt. Aber nur an einem ist das Raspberry Pi Pico-Gerät nicht beteiligt: die Docker-Build-Phase. Das Erstellen eines Docker-Containers kapselt unsere Umgebung in so etwas wie eine virtuelle Maschine ein. Wenn ich meinen CI-Auftrag in einem Docker-Container ausführe, kann ich ihn praktisch überall ausführen - ein paar Mindestanforderungen natürlich vorausgesetzt. In diesem Fall benötige ich keine speziellen Bibliotheken, die auf meinem Desktop-Computer installiert sind, der wiederum an mein Zielgerät angeschlossen sein muss. Der Docker-Container enthält all dies schon. Der einzige Unterschied, den ich hier machen muss, ist, dass mein Docker-Container im „privilegierten” Modus ausgeführt werden muss. Oder zumindest die ausdrückliche Erlaubnis erhalten muss, auf das Zielgerät zugreifen zu dürfen. Sonst ist er nicht in der Lage mit dem Zielgerät zu kommunizieren.
Sobald mein Docker-Container erstellt wurde, kann ich das Image jedes Mal, wenn ein Job ausgeführt wird, von Gitlab abrufen und dann beginnt der Spaß. Sie werden merken, dass meine Jobs immer abstrakter und damit komplexer werden. Schließlich lassen wir im letzten Job den gesamten Prozess durch das Pytest Framework laufen
Wenn Sie einige meiner früheren Artikel gelesen haben, wie zum Beispiel FPGAs: Erstellen von Continuous Integration Pipelines für Embedded Systems oder Leiterplatten, Kostengünstige Überprüfung für digitale und analoge Filter sowie Konfigurieren eines Hardware-in-the-Loop-Projekts, dann werden Sie feststellen, dass ich ein großer Fan des Pytest-Frameworks bin. Mit MicroPython ist es in diesem Fall nicht anders. Ich verwende Pytest immer noch standardmäßig als meine todsichere Methode zum Validieren meiner Python-Skripte.
Der letzte CI-Job, der aufgerufen wird, führt das test_rpi_pico.py Pytest-Skript aus. Es ist fast identisch mit dem rpi_pico_check.py Skript, mit der Ausnahme, dass es einen Testbericht erstellt. Wie immer übermitteln wir den Testbericht an Gitlab zur Analyse. Das tun wir, damit wir einen kleinen Testabschnitt erhalten können, der die erfolgreichen Ergebnisse anzeigt:
Abbildung 1: Test-Übersicht für Pytest
Dieser einfache Test validiert all jene Informationen, die wir im vorherigen Artikel betrachtet haben. Das Schöne daran ist die Automatisierung. Bei jeder Änderung des Codes, führen wir eine Überprüfung durch, um sicherzustellen, dass es sich um das Gerät handelt, das wir erwarten. In diesem Fall führen wir MicroPython Version 1.19.1 auf einem Raspberry Pi Pico mit dem RP2040-Chip aus.
In diesem Artikel haben wir uns in Erinnerung gerufen, wie die manuellen Schritte ablaufen, die bei der Kommunikation mit einem Raspberry Pi Pico-Gerät beteiligt sind. Darüber hinaus haben wir diesen manuellen Prozess in ein Skript umgewandelt. Nach der Automatisierung des Prozesses über ein Skript haben wir uns angesehen, wie der Workflow in ein CI-System integriert und dann mit Pytest eingebunden werden kann. Nachdem Sie die Beispiele in diesem Artikel durchgearbeitet haben, sollten Sie in der Lage sein, Ihre eigenen Skripts zu schreiben und diese sogar in CI zu integrieren.