こんにちは、テクマトリックスの酒井です。

ビルドを高速化するための様々なテクニックやツールがありますが、今回は CloudBees Build Acceleration を利用したビルド高速化をご紹介します。

なぜビルド高速化が必要なのか?

ソフトウェア開発者であれば、ビルドに時間がかかることは直感的に嫌なものと想像できると思います。ビルドに時間がかかることのデメリットは、Android Developers のドキュメントの中の「ビルド速度を最適化する」の先頭で端的に説明されています。

ビルドに時間がかかると開発プロセスも滞ります。

https://developer.android.com/studio/build/optimize-your-build?hl=ja

またビルド時間がどの程度まで許容できるかについては、次のような意見があります。

理想的には、コンパイルとテストプロセスの内チェックインの前に実行するものやCIサーバーで実行するものは数分以上かからないようにするべきだ。我々の考え方では10分がほぼ限界である。

Jez Humble, David Farley (著), 和智右桂, 髙木正弘 (訳), 継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化, アスキー・メディアワークス, 2012, p101.

CloudBees Build Acceleration とは?

CloudBees Build Acceleration は、Make ベース、Ninja ベース、および Visual Studio ビルド環境向けのビルドおよびテスト アクセラレーション プラットフォームであり、物理またはクラウド CPU のクラスター間でソフトウェア タスクをインテリジェントかつ自動的に並列化し、ビルドおよびテストのサイクル時間を大幅に短縮します。

CloudBees Build Acceleration のシステム構成は次のようになっています。

今回は CloudBees Build Acceleration を利用したビルド環境を構築して、ビルド時間がどの程度短縮されるのかを試してみます。

検証

まずビルド環境を Amazon Web Service 上に構築します。vCPU が 2、RAM が 4GB、OS が Ubuntu 16.04 の EC2 インスタンスを3台用意して、そのうち1台はシステム構成図の Build Machine と Cluster Manager の兼用とします。残りの2台は Host Machine として利用します。すべての EC2 インスタンスに GNU GCC 5.4 をインストールします。システムのコンポーネントの説明やセットアップ方法については割愛します。

ビルド対象のソースコードは少し古いですが OpenSSL 1.1.1g を利用します。これは C 言語で書かれたプログラムで、ソースコードの行数は約46万行です。まずはGitのリポジトリからこのソースコードを取得します。

git clone https://github.com/openssl/openssl.git
cd openssl
git checkout OpenSSL_1_1_1g

まずは GNU Make 4.1 を利用してフルビルドを実行します。フルビルドは次のコマンドで実行します。

git clean -fdx
time sh -c './config && make'

フルビルドを2回実行したところ、どちらも2分26秒かかりました。

続いて、 CloudBees Build Acceleration を利用してフルビルドを行います。 make コマンドを emake コマンドに置き換えるだけで CloudBees Build Acceleration を利用したビルドができます。

git clean -fdx
time sh -c './config && emake'

CloudBees Build Acceleration を利用してフルビルドを2回実行したところ、1回目は1分27秒、2回目は16秒で完了しました。1回目は複数のマシンを利用してビルドを並列化したことでビルドが高速化されました。2回目は JobCache という機能によってビルド時間が大幅に短縮されました。 JobCache とは、ビルドしたオブジェクトファイルをキャッシュしておき、以降のビルドで入力が変更されていない場合にオブジェクトファイルを再利用する(つまり単にファイルをコピーする)ことにより、再コンパイルを回避する機能です。結果として CloudBees Build Acceleration を利用しない場合と比較してビルド時間が89%減りました。つまり、ビルドを約10倍高速化することができたと言えます。ビルドの待ち時間が短くなったことで、少しの変更でも気軽にビルドできるようになったと感じられます。

フルビルド時間の比較

まとめ

CloudBees Build Acceleration を利用してビルドを約10倍高速化できました。ビルド時間が短縮されることによって、開発プロセスがはかどることに加えて、開発者のストレスも軽減されるのではないでしょうか。

アイキャッチ画像(”Compiling”, https://xkcd.com/303/)はクリエイティブ・コモンズ 表示 – 非営利 2.5 一般 (CC BY-NC 2.5) ライセンスの下で利用しています。

By tsakai

Jenkins関連のサービスやCloudBees製品を主に担当しています。 Certified CloudBees Jenkins Engineer (CCJE) および CloudBees CI DevOps Associate です。