継続的インテグレーションを使用したMicroPythonの開発とテストの自動化

Ari Mahpour
|  投稿日 December 3, 2022  |  更新日 August 27, 2023
Micropython

「MicroPythonとRaspberry Pi Picoをはじめる」では、Raspberry Pi PicoデバイスでMicroPythonをセットアップ、構成、実行する方法について説明しました。この記事では、そのプロセスを自動化し、継続的インテグレーション(CI)パイプラインに変換することに焦点を当てます。自動化をCIに移行すると、コミットをコードリポジトリにプッシュするたびにコードがテストされることが保証されます。

MicroPythonのコマンドと開発の自動化

MicroPythonとRaspberry Pi Picoデバイスを使い始める方法についてご説明したところで、コード開発プロセスを自動化する方法についてもう少し探っていきたいと思います。「MicroPythonとRaspberry Pi Picoをはじめる」では、Raspberry Pi Picoデバイスのさまざまな機能セットを紹介するために、いくつかの異なるコマンドを実行しました。この記事では、スクリプトを使用してこれらの例の1つを自動化し、それをCIに配置する方法について説明します。まずは、ターミナルから実行した例を見てみましょう。

端末の例

このコマンドにより、マシンインスタンス情報が提供されました。今回のケースでは:

機械学習インスタンス

これは、RP2040チップを使用してRaspberry Pi PicoデバイスでMicroPythonバージョン1.19.1を実行していることを示しています。PuTTYまたはThonny IDEを使用し、インタプリタシェルを介してこのコマンドを実行するのではなく、MicroPythonライブラリにバンドルされているツールを使用して、コマンドラインからプロセス全体を実行できます。Pyboard.pyツールは、インタプリタシェルを開くことなく(または新しいファイルをボードに直接ロードすることなく)、ターゲットデバイスで直接コマンドを実行するメカニズムを提供します。さらに、ターゲットデバイスとの間でファイルを一覧表示およびコピーするなど、他のファイルシステムコマンドも提供します。たとえば、次のようにPyboard.py ツールを使用してsys.implementationコマンド(上記)を実行できます:

python pyboard.py --device $TARGET_PORT --command "import sys; print(sys.implementation)"

ここでは、$TARGET_PORTは、デバイスが表示されるCOMポートです。これにより、PuTTY/Thonny IDEのステップがスキップされ、自動化が可能になります。

コードを継続的インテグレーションに連携する

ターゲットデバイスでコマンド実行をリモートで自動化できるようになったので、これを完全なPythonスクリプトに折りたたむことができるはずです。従って、Pyboardライブラリの使用が非常に簡単になります。このPythonスクリプトの例では、上記と同じコマンドを、COMポートの自動検出やアサーションベースのチェックの追加など、いくつかの機能を加えて実行していますが、原則は同じです。マシンインスタンスを取得し、実行していると思われるものを検証します。

これらすべてをスクリプトにカプセル化したら、CIシステムにドロップできます。いつもどおり、私は自分のランナー以外の実装にGitlabを用いてRaspberry Pi Picoデバイスをプログラムしています。こちらからプロジェクト全体を確認することができますが、ここで注目すべきファイルは.gitlab-ci.ymlスクリプトです。これには、コードを変更してGitlabにプッシュするたびにビルドが自動的に行われる「指示」が含まれています。

ここで行われる「ジョブ」はいくつかありますが、Raspberry Pi Picoデバイスが関係しないのはDockerビルドステージのみです。Dockerコンテナをビルドすると、環境が仮想マシンのようなものにカプセル化されます。CIジョブをDockerコンテナ内で実行する場合、事実上どこでも実行できます(ただし、いくつかの最低条件があります)。この場合、Dockerコンテナにはすべてが付属しているため、ターゲットデバイスに接続されるデスクトップコンピューターに特別なライブラリをインストールする必要はありません。ここで明確にしなければならない唯一の違いは、Dockerコンテナを「特権」モードで実行する(または、少なくともターゲットデバイスにアクセスするための明示的なアクセス許可を付与する)必要があることです。そうしないと、ターゲットデバイスと通信できません。

Dockerコンテナがビルドされると、ジョブが実行されるたびにGitlabからイメージを取得でき、ここから自由に使用できます。私のジョブより抽象化されるため、より複雑になっていることにお気づきですか?最後のジョブでは、Pytestフレームワークを介してプロセス全体を実行します。

MicroPythonでPytestを使用する

「FPGA:組み込みシステムやPCB向けに継続的インテグレーションのパイプラインを構築」「デジタル/アナログフィルターの低コスト検証」「ループプロジェクトでハードウェアを構成」など、過去の記事をすでにお読みであれば、私がPytestフレームワークを高く評価していることにお気づきでしょう。このケースでは、MicroPythonも同様です。Pythonスクリプトの一部を検証する簡単な方法として、Pytestをデフォルトにしています。

呼び出された最後のCIジョブは、test_rpi_pico.py Pytestスクリプトを実行します。テストレポートを作成する点を除いて、これはrpi_pico_check.pyスクリプトとほぼ同じです。いつものように、そのテストレポートを取得して解析のためにGitlabに送信し、合格結果を示す小さなテストセクションを取得できるようにします。

図1:Pytestのテストの概要

この簡単なテストでは、前の記事で確認した情報を検証します。ここで行ったよいことは自動化です。コードが変更されるたびに、チェックを実行して、それが期待しているデバイスであることを確認します。この場合、RP2040チップを使用してRaspberry Pi PicoデバイスでMicroPythonバージョン1.19.1を実行しています。

まとめ

この記事では 、Raspberry Pi Picoデバイスとの通信に関連する手動の手順をおさらいしたあと、その手動プロセスをスクリプトに変換しました。スクリプトを使用してプロセスを自動化したあと、ワークフローをCIシステムに連携し、それをPytestに組み込む方法について説明しました。この記事の例に従って作業することで、独自のスクリプトを作成し、それらをCIに連携することができるはずです。

筆者について

筆者について

Ariは、設計、デバイスパッケージ、テスト、および電気、機械、およびソフトウェアシステムの統合において幅広い経験を持つエンジニアです。彼は、設計/デザイン、検証、テストのエンジニアをまとめて団結したグループとして機能させることに情熱を注いでいます。

関連リソース

関連する技術文書

ホームに戻る
Thank you, you are now subscribed to updates.