こんにちは、ForteFibreでインフラ班をしているマンゴーです。
今回は、ForteFibreの制御班向けに構築しているCI・CDなどの仕組みについて紹介していこうと思います。
https://github.com/ForteFibre/fortefibre_github_action
Dockerによる開発環境の統一
まず、部員の開発環境やCI・CDでのビルド環境をDockerで統一しています。部員はそれぞれarm64のMacやRaspberry Pi、x86のPCなどを使うので、それぞれの環境向けにイメージを作成します。
それと同時に、x86な環境(ビルドサーバ)でもarm64向けのビルドができるよう、mimic-crossを組み込んだイメージも作っています。これは、後で出てくるaptレポジトリの作成で使われています。
イメージ作成はGitHub Actionsで行われていて、手動である程度定期的に再生成しています。また、CUDAを使う開発が一部あるので、その部分をカバーできるようなイメージも作成しています(通称largeイメージ)。
aptレポジトリの構築
ForteFibreではfibrilと呼ばれる部内ライブラリが存在していて、そこにはマイコン用ファームウェアや汎用的なROSノードなどが含まれています。これらのソフトウェアはある程度大きく、またC++の黒魔術と呼ばれるようなテクニックを多用しているため、コンパイルには短くても5分程度の長い時間を要します。Autoware等に比べると些細な時間ですが、機体を繰り返し動かしたり、CIの処理を何度も行っているとだんだんと面倒くさくなってきます。
これを解決するため、ForteFibreでは部内ライブラリ向けのaptレポジトリを提供しています。このレポジトリには、部で開発したものが多く格納されているため、Basic認証による制限が導入されています。
このaptレポジトリの構成について詳しく説明してきましょう。
おおまかな構成図はこの通りになっています。
aptはBasic認証を使ってPrivateなレポジトリに接続するようになっています。ここでは、CloudFlare Workersを使い、Basic認証の処理を行い、部員の端末を認証するようにしています。また、同時にrosdep用のYAMLファイルを自動生成できるようにもなっています。aptレポジトリの実態はCloudFlare R2(オブジェクトストレージ)に配置しています。
aptレポジトリの生成は、repreproやaptlyが使われることが多いですが、これらのツールは登録するパッケージすべてのファイルが必要になります。これは、aptレポジトリがミラーサーバなどの兼ね合いで、1つのマシンで生成されるケースが多いことで生まれた仕様であると考えられます。しかし、保管場所をオブジェクトストレージとする場合、すべてのパッケージを一度ダウンロードするのは非効率です。
これを解消するべく、今回はdeb-s3を使用しました。このツールは、Amazon S3向けのaptレポジトリ作成ツールで、一部のパッケージだけを更新するといった動作を行えます。もちろん、GnuPGによる各種パッケージやそのインデックスに署名を与えることもできます。
これらを活用し、部員は以下のような簡単なスクリプトでaptレポジトリを利用できるようになりました。
aptレポジトリを作成・更新する作業は、前述したDockerイメージにスクリプトを仕込むことで行われています。ROSが提供しているパッケージ作成補助スクリプトのbloomを使い、パッケージを作成しています。その後、まとめてdeb-s3による更新作業が行われます。(余談ですが、GPGキーなどをGitHubのSecretsに入れる際、Organization単位でのSecretはTeamプランが必要でした。この機能がないと、各レポジトリでdeb-s3を叩く仕様と相性が悪いため、学割を使ってTeamプランにするところから始まっていました。)
これらをライブラリのリリース時に走らせることにより、aptからライブラリが使えるようになります。ライブラリのリリース処理は、release-drafterを用いた自動採番・リリースと連動しており、リリース時にROSのpackage.xmlの更新とapt更新処理を行っています。誤ってリリース処理が走らないよう、Branch protectionによる保護も行っています。
サードパーティーソフトウェアの部内向けビルド
一部のサードパーティーのソフトウェアは、ROS公式のレポジトリに入っていない(入れられない)ことがあります。これをそれぞれの端末でビルドしていると時間が勿体ないため、よく使いそうなものをインフラチームでビルドしてaptレポジトリに追加しています。
余談: ActionsでNo space leftしちゃう問題
ある程度規模の大きなレポジトリや、大きなデータをダウンロードする系のパッケージを管理していると、途中でActionsのRunner VMのディスクが溢れてしまうことがあります。この問題の対処としては、暫定としてデータディレクトリを別のディスク(/mnt)に移すことで対応しています。
https://zenn.dev/pinto0309/scraps/c6413eb15a1b2a
ライブラリのテスト
計算やデータ処理を行うライブラリでは、GoogleTestによる単体テストを少しずつ導入しています。また、clang-formatによるコード形式の統一もほぼすべてのレポジトリで導入されています。これらは、ROSが利用するビルドツールであるcolconやamentにより、多くの手続きが隠蔽されているため、テストツールの知識がなくても活用できます。Actionsから使う場合は、Autoware Foundationのautoware-github-actionsや、公式のaction-ros-ciを使うと便利です。
Actionsで使う場合は、Hosted Runnerだと処理が遅いため、Self-hosted Runnerを使うことをおすすめします。現在は部室にあるサーバを利用して処理を行っています。
GitHubの機能活用
CI/CDとは直接かかわっていないものの、ForteFibreではGitHubの機能の採用を積極的に行っています。
例えば、NHK学生ロボコンのチームでは、先日リリースされたSub-issue機能によるタスクを実施しています。
最後に
ForteFibreではこのようにCI/CDのようなモダンな技術を導入し、ロボコンで好成績を収められるよう、また部員が余計なことや面倒ごとをしなくて済むようにしています。もしこの記事を読んで興味をもって頂けた新入生や在校生がいれば、ぜひ一緒に勝利を目指しましょう!
ForteFibreでは、ご支援・ご協力いただけるスポンサー様を募集しています。
詳しい内容はsponsor@fortefibre.netにお問い合わせください。