最近、継続的インテグレーションシステムを使用した自動テストのための環境をコンテナ化することについて多くの質問を受けています。その文の大部分が理解できなかったとしても心配しないでください。なぜなら、コンテナ、Docker、およびそれらを組み込み環境やハードウェアインザループテストでどのように活用するかについて、詳しく説明するつもりだからです。
コンテナについては、Dockerからのこの記事を含む、優れた記事がたくさんあります(Dockerは最も人気のあるコンテナランタイムエンジンの一つです)。ビルド環境(例:組み込みシステム)やテスト環境(例:ハードウェアインザループテスト)でのコンテナの使用は、新しいマシンを立ち上げるたびにすべての面倒な設定を抽象化する能力を私たちに与えてくれます。これは、新しいテストマシンに関連するだけでなく、組み込みファームウェアのビルドのためにクラウドでの運用をスケーリングする際にも関連します。
これらの日にどんな規模の運用を行っているかに関わらず、多くの企業は裸のメタルサーバーを維持する負担をクラウドにオフロードすることを活用しています。DevOpsの原則では、書いたソフトウェアがいつでも、どこでも、任意の場所でビルドして実行できることを常に確実にしたいと考えています。クラウドで新しいマシンを絶えず立ち上げ、コンパイルソフトウェア、ライブラリ、その他のソフトウェアパッケージをインストールすることはうまくスケールしません。これが、まさにコンテナ化が非常に人気になっている理由です。ビルド(またはランタイム環境)を取り、非常に軽量な仮想マシンにパッケージ化し、それをクラウドであれ自分のパーソナルコンピュータであれ、任意のマシンで実行できるように配信できます。
プロジェクトでこれらのコンテナを実際に作成して使用する方法を探りましょう。コンテナイメージの作成を始めるとき、まず「ベースイメージ」として既存のものから始める必要があります。ほとんどの場合、Debian、Ubuntu、AlpineなどのLinuxオペレーティングシステムのバリアントで十分です。Dockerfileを作成するときは、次のようにイメージを参照します:
FROM ubuntu:latest
これは、ベースオペレーティングシステムが最新のUbuntu Dockerイメージを実行することを示しています。その後、ビルドまたはテスト環境に必要なライブラリをインストールする必要があります。ある例のリポジトリでは、Debianパッケージマネージャ(Apt)を使用してArduino IDEをインストールし、さらにArduino Samボードドライバーをインストールすることで、より多くのレイヤーを追加しました。このコンテナを特権モードで実行する(またはデバイスへのボリュームマウントポイントを渡す)ことで、Dockerしか含まれていない真新しいマシン(つまり、IDEやドライバーは含まれていない)で、コマンドライン経由でArduinoスケッチをコンパイルしてアップロードできます。
テスト対象のデバイスに接続された機器でも同じことができます。このDockerコンテナでは、Analog Discovery 2デバイスを動作させるために必要な依存関係とソフトウェアをすべてインストールしています。理論的には、新品のマシン(Dockerのみを含む)にDockerコンテナを展開し、何の問題もなくAnalog Discovery 2と通信を開始できます。Analog Discovery 2を使用して、ADCやDACのテストを行ったり、ボード上の異なるチップにI2C/SPIコマンドを送信したり(その他多くの機能を含む)ことができます。
さて、コンテナが継続的インテグレーションシステムを強化し、効率とスケーラビリティを向上させる方法について話しましょう。本当の魔法は、継続的インテグレーション(CI)システムと連携してコンテナを使用し始めたときに起こります。物理的なテストマシンを数十台、場合によっては数百台持っているか、またはテストおよびビルドサーバー用に数千台のクラウドマシンにアクセスできるかもしれません。上述のように、実用的にスケールするためには、オンラインになるたびに個々のマシンを設定することはできません。CI実行のたびにコンテナを配信することで、ビルドとテストを実行するための体系的で繰り返し可能な方法だけでなく、マシンを立ち上げるたびに(クラウドではほぼ毎回のCI実行で発生します)再設定する必要からも解放されます。組み込みビルドと物理ハードウェアテストにコンテナを活用することで、私たち自身と私たちの会社に、前の世代が夢見ることしかできなかったある種のスケールを提供します。
この記事では、異なるタイプのインフラストラクチャ全体で一貫したビルドおよびテスト環境を提供するために、組み込みシステム開発におけるコンテナの重要な役割を強調しました。継続的インテグレーションシステムとの統合は、開発を合理化するだけでなく、製品のスケーラビリティと信頼性も向上させます。コンテナ技術が進化するにつれて、その採用は開発者にとってますます重要になります。https://gitlab.com/docker-embeddedでさまざまなセットアップを試して、さらに深く掘り下げてみてください。