Ubuntu Weekly Recipe

第659回 systemd-nspawn+pbuliderでパッケージのビルド環境を整える

この記事を読むのに必要な時間:およそ 3 分

今回はsystemd-nspawnとpbuilderを組み合わせ,パッケージをビルドする環境を整えます。

筆者流ビルド環境の整え方

FlatpakやSnapパッケージの普及により自分でパッケージをビルドして最新版のアプリケーションを使用するという機会は確実に減っています。どうしてもパッケージをビルドする必要ができた時も,DockerだLXCだmultipassだクラウドだと,環境の作り方はさまざまです。いずれにせよ共通するのは,手元の環境を汚さないということです。

ビルド環境は維持するのか逐次作成するのかも悩みどころですが,あまり頻繁にパッケージのビルドを行わない場合はどこかのクラウドサービスを借りるのがいいでしょう。ビルドに必要なハードウェアリソースは,たまにしか使用しないのであれば外部サービスを使用したほうが安上がりです。もちろんビルドするパッケージにもよるのですが。

ローカルでビルドする場合はいかようにもすればいいのですが,ハードウェアリソースは自前で確保しなければなりません。特にビルド時間に影響を及ぼすのはそれなりの性能のCPU,メモリー,ストレージです。ビルドはどうしてもトライ&エラーの繰り返しとなることが多く,かといって1日は等しく24時間しかないため,ハードウェアリソースが潤沢な場合はそれだけトライ&エラーの回数を増やすことができるというわけです。

ソースパッケージをビルドするだけであれば,ローカルに必要なパッケージをインストールしてビルドすればいいでしょうが,PPAにアップロードする場合は,クリーンなビルド環境を用意する必要があります。厳密にいえば依存するパッケージが100%把握できている場合は不要といえばそうなのですが,ちょっと現実的とは思えません※1⁠。ただし毎回クリーンなビルド環境を使用するとオーバーヘッドが大きくなるため,併用できると便利でしょう。

※1
こんなのわかるわけないじゃないですか……。

というわけで,筆者は可能な限りクリーンなビルドを行いつつ,場合によってはローカルでビルドしています。⁠ローカルでビルド」とは,具体的にはdpkg-buildpackageコマンドを実行してパッケージをビルドすることを指しています。クリーンなビルド環境はpbuilderを使用しています。これらを同居するため,第491回で紹介したsystemd-npawnを使用してコンテナを作成します。

pbuilderで事前にビルドしたパッケージを依存関係で使用している,なんてこともよくあるわけですが,pbuilderをセットアップしただけでは自身でビルドしたパッケージを使用してビルドすることはできず,この問題の解決も重要です。

長くなりましたが,今回はsystemd-nspawnでコンテナを作成し,pbuilderでビルド環境を構築する方法を紹介します。

例としてUbuntu 20.04 LTS上で開発版の21.04のビルド環境を構築してみますが,18.04 LTS以降であればおおむねどの組み合わせでも対応できると思います。

必要なパッケージ

必要なパッケージをインストールします。次のコマンドを実行してください。

$ sudo apt install systemd-container debootstrap

著者プロフィール

あわしろいくや

Ubuntu Japanese Teamのメンバー。VirtualBoxなどの翻訳を手がける。技術同人サークルteam zpn主宰。ほか原稿執筆を少々。