RISCV の個人プロジェクトの CI の話
前回のブログに書いた通り、最近は Chisel で RISCV の CPU を書いています。Chisel 以外にも SystemVerilog で RISCV の CPU を実装していますし、RISCV の CPU エミュレータもいくつかのプログラミング言語で作っています。
今回は、それらで共通して使っている CI の話です。
概要
私が趣味で開発して GitHub にアップロードしている RISCV 関連プロダクトでは、GitHub 製の CI フレームワークである GitHub Actions を使っています。
また、CI の実行時間を短縮するために verilator や riscv-tests などをプレビルドバイナリとして用意しています。
これらのプレビルドバイナリは docker を使って作成しており、プレビルドバイナリの作成手順を容易に保存・編集・バージョン管理できるようになっています。
GitHub Actions
GitHub Actions は最近開発が活発な CI サービスです。Travis-CI や Circle CI など、他の CI サービスの使用も検討した(というか一時期は使っていた)のですが、本格的に CI を整備するタイミングでちょうど GitHub Actions が話題になっていたので、これを使いました。
GitHub との親和性が高くて使いやすく、マシンスペックも申し分ないので、オススメです。
プレビルドバイナリ
RISCV の CPU エミュレータや HDL 実装をテストする際は、riscv-tests という OSS のテストプログラムを使うのがお手軽です。
また SystemVerilog や Chisel のシミュレーションを実行するために、フリーの Verilog エミュレータである Verilator を使います。
よって CI の実行時には riscv-tests や Verilator のバイナリが必要です。Verilator のバイナリは、GitHub Actions の Ubuntu において apt で取得することもできるのですが、開発スピードが速いので最新版を自分でビルドする方がオススメです。
しかし riscv-tests や Verilator のビルドには数分以上はかかるので、CI を実行するたびにビルドしていると開発効率が下がってしまいます。そこで riscv-tests や Verilator のビルド済バイナリを別リポジトリにコミットしておき、これをチェックアウトして使うことで CI の実行時間を短縮させています。
プレビルドバイナリを作成する docker イメージ
前節で述べたプレビルドバイナリを作成するには、実はそこそこ手間がかかります。RISCV 用のコンパイラツールチェインなどを用意する必要があるのですが、その辺の環境整備にはわりと手間と時間がかかります。そして、一度プレビルドバイナリを用意すると滅多にその環境を使わないので、後で作業が必要になったときに環境をロスト・使い方を忘却して、結局同じプレビルドバイナリを作れなくなる、なんてことになりがちです。
そこで、プレビルドバイナリの作成は docker を使って行うことにしました。最初の環境構築の際に Dockerfile をちゃんと書いておけば、後で環境をロストする事故を防ぐことができます。(それでも使い方を忘れることはよくありますが)
私は、ネットの情報を色々参考にしたうえでオリジナルの docker イメージを作っていますが、RISCV の CPU を作っている人は世の中にたくさんいるはずなので、探せばもっと良い docker イメージも見つかるのではないかと思います。