FreeBSDのCI環境を無料で構築したいけどサーバの管理はしたくない、という場合の選択肢について調べてみました。
前提
筆者はCで書かれたOSSを5年ほどメンテしているのですが、FreeBSDで動かない、というissueを受け取ることがあります。また、他のプロジェクトでも環境依存のissueというのは珍しくありません。
環境の差を吸収してくれるような言語を利用しているプロジェクトであれば、環境依存のバグに悩まされることは滅多にないのかもしれません。一方で、Cとシェルスクリプトは環境の差が大きく影響するので、様々なOS上でCIしたいというニーズがあるはずです。
しかし、Travis CIをはじめとする大半のCIサービスでは、LinuxとmacOSはサポートしているものの、他のOSはあまりサポートされていません。有料プランを含めても、FreeBSDを公式にサポートしているCIサービスは見つかりませんでした。
Travis CIで頑張る方法
筆者と同じ悩みを持つ人は他にも居るようで、FreeBSDをTravis CI上で動かそうと頑張っている人がネット上でチラホラ見つかります。
失敗パターンから先に紹介しますと、Travis CI上でVirtualBox+Vagrantで任意のOSを動かそうとしてもうまくいきません。Travis CIが現在採用しているコンテナ型の仮想化技術OpenVZの環境ではvboxdrvカーネルモジュールのロードができないため、そもそもVirtualBoxが動作しないということのようです。
唯一Travis CI上でFreeBSDを動かした事例が次の記事です。
この記事ではQEMU上でFreeBSDを動かしています。QEMUはハードウェアのレベルで仮想化を行うので、仮想化環境上でも期待通りに動作するというわけです(その代わり速度面では不利になります)。
実際、下記のTravis CIのログを見ると期待通りに動作しているようです。
AppVeyorで頑張る方法
別の方針として、仮想化技術の違いに着目したアプローチが考えられます。コンテナ型の仮想化環境でVirtualBoxを動かすのが難しいなら、ハイパーバイザー型の仮想化環境であればどうだろうか?というわけです。
AppVeyorというWindows環境に特化したCIサービスがあるのですが、ここではHyper-Vというハイパーバイザー型の仮想化技術が使われています。この環境ではVirtualBoxが制限付きながら動作します。
実際にVirtualBox+Vagrant+FreeBSDを動かした事例が下記になります。
ただし、この環境では32bit OSしか動作しません。つまり、FreeBSDも32bit版しか動かせないというわけです。64bit OSを動かすには「Nested Hyper-V」が有効でないといけないのですが、AppVeyorの無料プランでNested Hyper-Vをサポートする予定は無いそうです。
まとめ
- FreeBSDを公式サポートしているCIサービスは無さそう
- QEMUを使えばどこでもFreeBSDが動かせそう、でもむっちゃ遅い
- AppVeyorならVagrantでFreeBSDが動かせそう、ただし32bit限定
楽をするためにCI環境を探してるのに、むっちゃ苦労してFreeBSDを動かして何になるんだよ!という気持ちになりました。