きっかけ
個人開発にて、PlatformIO1 でマイコンボード NUCLEO-F303K8 のプログラムを開発していたとき・・・
「そういや PlatformIO は CLI で使えるな。てことは CI でビルドチェックができる」
「ユニットテストの仕組みもあったな。これも CI で常にチェックできるぞ」
CI 色々動いていると、なんかカッコイイし「コードに問題ありません (キリッ」ってドヤれる。いいぞ。
以上、きっかけでした。
・・・もうちょっとだけ真面目な話をすると、以前までは、組み込み開発は実機動作でテストするしか術を知らなかったわけです。そこに PlatformIO のユニットテスト機能を知って、CLI で制御できることも知って、さらに CI 構築にハマっていた当時の自分がありました。「これは Actions でやってみるしかない!」となって、この話につながります。
実は本件をやったのは数ヶ月昔のこと。アドベントカレンダーの季節を迎えたこともあって、年の瀬だしこの辺の記憶を記事に起こしておこうかな?なんて思い、本記事執筆に至りました。
公式ドキュメントに答えアリ
ご丁寧にサンプルワークフローが公式に。
name: PlatformIO CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v4
with:
path: |
~/.cache/pip
~/.platformio/.cache
key: ${{ runner.os }}-pio
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install PlatformIO Core
run: pip install --upgrade platformio
- name: Build PlatformIO Project
run: pio run
PlatformIO の CLI pio (厳密には VSCode 拡張よりこっちが本体) を使えるようにして、pio run でビルドを実行、という具合のワークフローです。PlatformIO CLI は Python で書かれているので、先に Python のセットアップをしています。
そこに加えて、Python と PlatformIO のダウンロードキャッシュを保存・復元しています。ダウンロードの速度は不安定になりがちで、その上 PlatformIO パッケージはそこそこ容量があるので、ここをキャッシュすることで所用時間を短縮できます。
もうちょっと早くしてみる
先のワークフローでは、ダウンロード済みパッケージを unpack する工程が生じます。その工程もちょっぴり時間がかかります。そこで、unpack 済みファイルごとキャッシュしてしまうことで、unpack 工程までカットできます。
ホームディレクトリ上の .platformio/ に、ダウンロードキャッシュに加えて展開後のパッケージなども保存されます。これを丸々キャッシュしてしまえば OK。
- uses: actions/cache@v4
with:
path: |
~/.cache/pip
- ~/.platformio/.cache
+ ~/.platformio/
key: ${{ runner.os }}-pio
ただし、展開済みパッケージを使い回していると、最新バージョンのチェック (取得) がされないままになってしまいます。バージョンも気を遣いたい場合は工夫が要ります。
実験
キャッシュ無し、ダウンロードキャッシュ保存、unpack ファイル保存の 3通り、それぞれの所要時間を調べてみます。
- 計測対象は、キャッシュリストア、PlatformIO インストール、ビルドの所要時間
- 5回 Re-run した平均値を結果とする
- 初回の実行はキャッシュヒットしないためノーカウント
- 行うタスクはビルド (ユニットテストではない)
- ソースは
int main()にwhile(1)とreturn 0;のみでほぼ空 - 実質 NUCLEO-F303K8 の HAL ライブラリのビルドだけ
- それ以外の設定などはデフォルト値のまま
- ソースは
ソース、および実験場所はこちら:
結果:
| 回 | キャッシュ無し | ダウンロードキャッシュ | unpack キャッシュ |
|---|---|---|---|
| 1 | 37 | 22 | 17 |
| 2 | 38 | 28 | 18 |
| 3 | 34 | 22 | 15 |
| 4 | 39 | 24 | 18 |
| 5 | 35 | 24 | 15 |
| 平均 | 36.6 | 24.0 | 16.6 |
ダウンロードキャッシュで 12秒、unpack キャッシュでさらに 8秒短縮、というような具合でした。
感想
2025年も終わろうとしているところで、今年やった PlatformIO + GitHub Actions についての知見を、無事年内に書き起こすことができました。
実のところ、例の個人開発をしていた時点では実験をしていなくて、実際どれくらい時間短縮になっているのかは知らないままでした。本記事きかっけで、具体的に数字で見ることができました。
-
PlatformIO: VSCode で組み込み開発を色々可能にする超優秀な OSS ↩