today 2020-05-17
access_time 3 mins
ビルド周りの不安解消の話
最近Wio Terminalを購入して遊んでいる。Twitterを見ていても多くのユーザが色々遊んでいてなんとなく流行に乗った気分になっている。
やったー!!!!Wio TerminalにRustで書いたファミコンエミュ移植できた!!!!!!!!!!!!!!!(まだUART経由でしか表示できないけど...)https://t.co/VvBct6k8EX pic.twitter.com/V2nC4LusSX
— kamiya (@kamiya_owl) May 11, 2020
個人的購入したきっかけはLiPo内臓ではないこと、ATMEL社のARMマイコンを以前使っていたことあたり。(これとか)
ところで一昔前ならICEつないでArduino環境を取っ払って遊んでしまうのだが、最近は趣向が変わっていて他人が再現しやすい環境・想定された開発環境をできるだけ守るような試みに重きをおいている。 というわけでArduino IDEを使っていたのだが、色々と辛い部分があったので今回の話に移る。
hogehoge.ino
だけを公開してもBSP,/Libraryはユーザ環境のVersion次第fugafuga.ino
がLibraryのVersion依存を持っていると収集がつかないざっくりまとめると1.2.に関してはenv切り替えのないpythonと同じ問題、3.については…という具合
今回は作り途中の kamiyaowl/wfi_monitor - GitHub で試した内容である。
2020/05/24修正
1.2.についてはライブラリをArduino IDEのパス解決に任せないことにした。 今日の多くのライブラリはgithubに公開されているものをzip DL, IDEに追加の流れを踏んでいたのでsubmoduleとしてリポジトリに追加している。
その際にlib
以下にまとめてsubmoduleとして追加されるようにし、後ほどDockerコンテナ内にマウントしている。
今回の場合はTFT液晶制御のライブラリを追加している。
後述するDocker上でビルドする際、lib
ディレクトリをそのままArduino LibのおいてあるDirectoryにマウントして参照・ビルドしている。
これで通常のビルドと遜色なく運用できるようになった。
Arduino CLI なるものがあるらしい。これを使えばDocker上ですべて解決できるのでは…ということでやってみた。
配布済を使っても良かったがビルドする際に、任意のBSP/Libraryを入れたかったので書いた。 正規の手順でArduino CLIを導入し、必要なパッケージ群をインストールしているだけである。
Dockerfile - kamiyaowl/wfh_monitor
私はコマンドを打つのが面倒なタイプなのでdocker-composeを使う。
ただ、docker-compose.yaml
にコマンド直書きするにはちょっと取り回しが面倒なので、実行するscriptは分離した(linux環境だったらそのまま使えますし)
build.sh - kamiyaowl/wfh_monitor
小テクだが、checkout時点でscriptに実行権限がないと積むのでchmod +xしている。
docker-compose.yml - kamiyaowl/wfh_monitor
./lib
にcheckoutしてあるライブラリも、ここでRead Onlyでマウントしておくことで参照できる。
これでDocker/Docker Composeさえ入っていればArduino CLIでビルドできるようになった。めでたい。
Docker上でarduino-cli使ってWio Terminalのビルド環境作った(後でどこかにまとめます pic.twitter.com/FTCbkMrlbJ
— kamiya (@kamiya_owl) May 17, 2020
やっとタイトル回収。Dockerでビルドできるなら、Github Actionでもすぐ動かせるはず。
注意点としてactions/checkoutではsubmoduleを引っ張ってきてくれないので自分であとから引っ張ってきている(git cloneも–recursiveオプションがないとだめなはず)
また、actions/upload-artifact
で生成物を指定することでzipで固めてDL可能な状態にすることができる。
.github/workflows/build.yml - kamiyaowl/wfh_monitor
これでpushするだけでビルド済バイナリを作れるようになった。
workflowにDockerfile相当を書いても行けるはずだが両方保守するのは面倒なのでこの方法が手軽で良い。
全然関係ないけど、Rust+Arduinoをさっさと試したい人向けに作ったが需要がニッチ過ぎて微妙だった。興味があったら試してほしい。
手軽さのArduinoと堅牢さのRustってものすごく相性悪い気がしてきた…?私は堅牢なところだけRustで書くつもりだったのだが。
A minimal sample of running Rust on an Arduino.✌ #WioTerminal #Arduinohttps://t.co/wQThswGhgm pic.twitter.com/1odQ7SwNvE
— kamiya (@kamiya_owl) May 12, 2020