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